summaryrefslogtreecommitdiffstats
path: root/src/modules
diff options
context:
space:
mode:
authorMilo <50248166+Milo123459@users.noreply.github.com>2021-04-15 06:22:12 -0700
committerGitHub <noreply@github.com>2021-04-15 15:22:12 +0200
commit3cb15abfc5721ed553e93aa92ad3e53155ff6402 (patch)
tree583cc26c9ce9ee93a517f1a515ca7173b0eb3fea /src/modules
parent51c2ae0a28356301a68a2027c201592c84bd39d2 (diff)
feat(deno): create module (#2565)
* Add deno module * Update docs * Update src/utils.rs Co-authored-by: Dario Vladović <d.vladimyr@gmail.com> * Update src/modules/deno.rs Co-authored-by: Dario Vladović <d.vladimyr@gmail.com> * Update src/modules/deno.rs Co-authored-by: Dario Vladović <d.vladimyr@gmail.com> * Update src/modules/deno.rs Co-authored-by: Dario Vladović <d.vladimyr@gmail.com> * Update src/modules/deno.rs Co-authored-by: Dario Vladović <d.vladimyr@gmail.com> * run rust fmt * Use deno -V * fmt * Fix deno module * do clippy * Update src/configs/deno.rs Co-authored-by: David Knaack <davidkna@users.noreply.github.com> * Update src/modules/deno.rs Co-authored-by: David Knaack <davidkna@users.noreply.github.com> * Update docs/config/README.md Co-authored-by: David Knaack <davidkna@users.noreply.github.com> * Fix test and docs * Remove unused code * fmt * update configs * Add more tests * Update docs/config/README.md Co-authored-by: Dario Vladović <d.vladimyr@gmail.com> Co-authored-by: Dario Vladović <d.vladimyr@gmail.com> Co-authored-by: David Knaack <davidkna@users.noreply.github.com>
Diffstat (limited to 'src/modules')
-rw-r--r--src/modules/deno.rs125
-rw-r--r--src/modules/mod.rs3
2 files changed, 128 insertions, 0 deletions
diff --git a/src/modules/deno.rs b/src/modules/deno.rs
new file mode 100644
index 000000000..8b1fac5fe
--- /dev/null
+++ b/src/modules/deno.rs
@@ -0,0 +1,125 @@
+use super::{Context, Module, RootModuleConfig};
+
+use crate::configs::deno::DenoConfig;
+use crate::formatter::StringFormatter;
+
+/// Creates a module with the current Deno version
+pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
+ let mut module = context.new_module("deno");
+ let config = DenoConfig::try_load(module.config);
+ let is_deno_project = context
+ .try_begin_scan()?
+ .set_files(&config.detect_files)
+ .is_match();
+
+ if !is_deno_project {
+ return None;
+ }
+
+ let parsed = StringFormatter::new(config.format).and_then(|formatter| {
+ formatter
+ .map_meta(|var, _| match var {
+ "symbol" => Some(config.symbol),
+ _ => None,
+ })
+ .map_style(|variable| match variable {
+ "style" => Some(Ok(config.style)),
+ _ => None,
+ })
+ .map(|variable| match variable {
+ "version" => context
+ .exec_cmd("deno", &["-V"])
+ .and_then(|output| parse_deno_version(output.stdout.trim()))
+ .map(Ok),
+ _ => None,
+ })
+ .parse(None)
+ });
+
+ module.set_segments(match parsed {
+ Ok(segments) => segments,
+ Err(error) => {
+ log::warn!("Error in module `deno`:\n{}", error);
+ return None;
+ }
+ });
+
+ Some(module)
+}
+
+fn parse_deno_version(deno_version: &str) -> Option<String> {
+ let version = deno_version
+ // split into ["deno", "1.8.3"]
+ .split_whitespace()
+ // return "1.8.3"
+ .nth(1)?;
+
+ Some(format!("v{}", version))
+}
+
+#[cfg(test)]
+mod tests {
+ use super::parse_deno_version;
+ use crate::test::ModuleRenderer;
+ use ansi_term::Color;
+ use std::fs::File;
+ use std::io;
+
+ #[test]
+ fn test_parse_deno_version() {
+ const OUTPUT: &str = "deno 1.8.3\n";
+ assert_eq!(
+ parse_deno_version(OUTPUT.trim()),
+ Some("v1.8.3".to_string())
+ )
+ }
+
+ #[test]
+ fn folder_without_deno_files() -> io::Result<()> {
+ let dir = tempfile::tempdir()?;
+ let actual = ModuleRenderer::new("deno").path(dir.path()).collect();
+ let expected = None;
+ assert_eq!(expected, actual);
+ dir.close()
+ }
+
+ #[test]
+ fn folder_with_mod_ts() -> io::Result<()> {
+ let dir = tempfile::tempdir()?;
+ File::create(dir.path().join("mod.ts"))?.sync_all()?;
+ let actual = ModuleRenderer::new("deno").path(dir.path()).collect();
+ let expected = Some(format!("via {}", Color::Green.bold().paint("🦕 v1.8.3 ")));
+ assert_eq!(expected, actual);
+ dir.close()
+ }
+
+ #[test]
+ fn folder_with_mod_js() -> io::Result<()> {
+ let dir = tempfile::tempdir()?;
+ File::create(dir.path().join("mod.js"))?.sync_all()?;
+ let actual = ModuleRenderer::new("deno").path(dir.path()).collect();
+ let expected = Some(format!("via {}", Color::Green.bold().paint("🦕 v1.8.3 ")));
+ assert_eq!(expected, actual);
+ dir.close()
+ }
+
+ #[test]
+ fn folder_with_deps_ts() -> io::Result<()> {
+ let dir = tempfile::tempdir()?;
+ File::create(dir.path().join("deps.ts"))?.sync_all()?;
+ let actual = ModuleRenderer::new("deno").path(dir.path()).collect();
+ let expected = Some(format!("via {}", Color::Green.bold().paint("🦕 v1.8.3 ")));
+ assert_eq!(expected, actual);
+ dir.close()
+ }
+
+ #[test]
+ fn folder_with_deps_js() -> io::Result<()> {
+ let dir = tempfile::tempdir()?;
+ File::create(dir.path().join("deps.js"))?.sync_all()?;
+ let actual = ModuleRenderer::new("deno").path(dir.path()).collect();
+ let expected = Some(format!("via {}", Color::Green.bold().paint("🦕 v1.8.3 ")));
+ assert_eq!(expected, actual);
+ dir.close()
+ }
+}
diff --git a/src/modules/mod.rs b/src/modules/mod.rs
index 39e3b86d1..c3fd6e658 100644
--- a/src/modules/mod.rs
+++ b/src/modules/mod.rs
@@ -7,6 +7,7 @@ mod conda;
mod crystal;
pub(crate) mod custom;
mod dart;
+mod deno;
mod directory;
mod docker_context;
mod dotnet;
@@ -80,6 +81,7 @@ pub fn handle<'a>(module: &str, context: &'a Context) -> Option<Module<'a>> {
"cmd_duration" => cmd_duration::module(context),
"conda" => conda::module(context),
"dart" => dart::module(context),
+ "deno" => deno::module(context),
"directory" => directory::module(context),
"docker_context" => docker_context::module(context),
"dotnet" => dotnet::module(context),
@@ -162,6 +164,7 @@ pub fn description(module: &str) -> &'static str {
"conda" => "The current conda environment, if $CONDA_DEFAULT_ENV is set",
"crystal" => "The currently installed version of Crystal",
"dart" => "The currently installed version of Dart",
+ "deno" => "The currently installed version of Deno",
"directory" => "The current working directory",
"docker_context" => "The current docker context",
"dotnet" => "The relevant version of the .NET Core SDK for the current directory",