summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJohn Letey <john.letey@colorado.edu>2019-05-12 04:58:45 +0100
committerMatan Kushner <hello@matchai.me>2019-05-11 23:58:45 -0400
commitd3ce00c5163b1c6a2b3bc510f8900d51f5320d54 (patch)
tree711f90c69f03c80a1518a0244e7c747fc2a09c7e /src
parent8b5055d5106da402f9a132f0ed21571ef98b8ac2 (diff)
Add Go version module (#44)
Diffstat (limited to 'src')
-rw-r--r--src/modules/go.rs96
-rw-r--r--src/modules/mod.rs2
-rw-r--r--src/print.rs1
3 files changed, 99 insertions, 0 deletions
diff --git a/src/modules/go.rs b/src/modules/go.rs
new file mode 100644
index 000000000..f6b2f2c9a
--- /dev/null
+++ b/src/modules/go.rs
@@ -0,0 +1,96 @@
+use ansi_term::Color;
+use std::path::PathBuf;
+use std::process::Command;
+
+use super::{Context, Module};
+
+/// Creates a segment with the current Python version
+///
+/// Will display the Python version if any of the following criteria are met:
+/// - Current directory contains a `.go` file
+/// - Current directory contains a `go.mod` file
+/// - Current directory contains a `go.sum` file
+/// - Current directory contains a `Godeps` directory
+/// - Current directory contains a `glide.yaml` file
+/// - Current directory contains a `Gopkg.yml` file
+/// - Current directory contains a `Gopkg.lock` file
+pub fn segment(context: &Context) -> Option<Module> {
+ let is_go_project = context.dir_files.iter().any(has_go_files);
+ if !is_go_project {
+ return None;
+ }
+
+ const GO_CHAR: &str = "🐹 ";
+ let module_color = Color::Cyan.bold();
+
+ let mut module = Module::new("go");
+ module.set_style(module_color);
+
+ let go_version = get_go_version()?;
+ let formatted_version = format_go_version(go_version)?;
+ module.new_segment("symbol", GO_CHAR);
+ module.new_segment("version", formatted_version);
+
+ Some(module)
+}
+
+fn has_go_files(dir_entry: &PathBuf) -> bool {
+ let is_go_mod =
+ |d: &PathBuf| -> bool { d.is_file() && d.file_name().unwrap_or_default() == "go.mod" };
+ let is_go_sum =
+ |d: &PathBuf| -> bool { d.is_file() && d.file_name().unwrap_or_default() == "go.sum" };
+ let is_godeps =
+ |d: &PathBuf| -> bool { d.is_dir() && d.file_name().unwrap_or_default() == "Godeps" };
+ let is_glide_yaml =
+ |d: &PathBuf| -> bool { d.is_file() && d.file_name().unwrap_or_default() == "glide.yaml" };
+ let is_go_file =
+ |d: &PathBuf| -> bool { d.is_file() && d.extension().unwrap_or_default() == "go" };
+ let is_gopkg_yml =
+ |d: &PathBuf| -> bool { d.is_file() && d.file_name().unwrap_or_default() == "Gopkg.yml" };
+ let is_gopkg_lock =
+ |d: &PathBuf| -> bool { d.is_file() && d.file_name().unwrap_or_default() == "Gopkg.lock" };
+
+ is_go_mod(&dir_entry)
+ || is_go_sum(&dir_entry)
+ || is_godeps(&dir_entry)
+ || is_glide_yaml(&dir_entry)
+ || is_go_file(&dir_entry)
+ || is_gopkg_yml(&dir_entry)
+ || is_gopkg_lock(&dir_entry)
+}
+
+fn get_go_version() -> Option<String> {
+ Command::new("go")
+ .arg("version")
+ .output()
+ .ok()
+ .and_then(|output| String::from_utf8(output.stdout).ok())
+}
+
+fn format_go_version(go_stdout: String) -> Option<String> {
+ let mut version = go_stdout
+ // split into ["", "1.12.4 linux/amd64"]
+ .splitn(2, "go version go")
+ // return "1.12.4 linux/amd64"
+ .nth(1)?
+ // split into ["1.12.4", "linux/amd64"]
+ .split_whitespace()
+ // return "1.12.4"
+ .next()?;
+
+ let mut formatted_version = String::with_capacity(version.len() + 1);
+ formatted_version.push('v');
+ formatted_version.push_str(version);
+ Some(formatted_version)
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_format_go_version() {
+ let input = String::from("go version go1.12 darwin/amd64");
+ assert_eq!(format_go_version(input), Some("v1.12".to_string()));
+ }
+}
diff --git a/src/modules/mod.rs b/src/modules/mod.rs
index 911486c49..2a9f433bb 100644
--- a/src/modules/mod.rs
+++ b/src/modules/mod.rs
@@ -1,6 +1,7 @@
mod character;
mod directory;
mod git_branch;
+mod go;
mod line_break;
mod nodejs;
mod package;
@@ -17,6 +18,7 @@ pub fn handle(module: &str, context: &Context) -> Option<Module> {
"node" | "nodejs" => nodejs::segment(context),
"rust" | "rustlang" => rust::segment(context),
"python" => python::segment(context),
+ "go" | "golang" => go::segment(context),
"line_break" => line_break::segment(context),
"package" => package::segment(context),
"git_branch" => git_branch::segment(context),
diff --git a/src/print.rs b/src/print.rs
index 3020f9de9..2f26ddcc1 100644
--- a/src/print.rs
+++ b/src/print.rs
@@ -14,6 +14,7 @@ pub fn prompt(args: ArgMatches) {
"nodejs",
"rust",
"python",
+ "go",
"line_break",
"character",
];