diff options
author | nobv <36393714+nobv@users.noreply.github.com> | 2020-05-23 01:26:58 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-22 18:26:58 +0200 |
commit | 63799b97d17fb7bd0c691c86117ecae7da1fc1ed (patch) | |
tree | fa2094b2f35557f2717055cc4bca1f91d15eadce /src/modules | |
parent | a670e01c229cd71529a7313f1d5b96ae3e0cd69d (diff) |
feat(PureScript): Add Purescript module (#1227)
* Added configs/purescript
* Added modules/purescript
* Added necessary codes
* Added tests
* Updated README
* Fixed color because black is hard to see
* Fixed of push mistake
* Fixed pointed out in PR
Diffstat (limited to 'src/modules')
-rw-r--r-- | src/modules/mod.rs | 3 | ||||
-rw-r--r-- | src/modules/purescript.rs | 72 |
2 files changed, 75 insertions, 0 deletions
diff --git a/src/modules/mod.rs b/src/modules/mod.rs index 39993de13..26b69e4f6 100644 --- a/src/modules/mod.rs +++ b/src/modules/mod.rs @@ -31,6 +31,7 @@ mod nodejs; mod ocaml; mod package; mod php; +mod purescript; mod python; mod ruby; mod rust; @@ -84,6 +85,7 @@ pub fn handle<'a>(module: &str, context: &'a Context) -> Option<Module<'a>> { "ocaml" => ocaml::module(context), "package" => package::module(context), "php" => php::module(context), + "purescript" => purescript::module(context), "python" => python::module(context), "ruby" => ruby::module(context), "rust" => rust::module(context), @@ -134,6 +136,7 @@ pub fn description(module: &str) -> &'static str { "ocaml" => "The currently installed version of OCaml", "package" => "The package version of the current directory's project", "php" => "The currently installed version of PHP", + "purescript" => "The currently installed version of PureScript", "python" => "The currently installed version of Python", "ruby" => "The currently installed version of Ruby", "rust" => "The currently installed version of Rust", diff --git a/src/modules/purescript.rs b/src/modules/purescript.rs new file mode 100644 index 000000000..2ca3d20f9 --- /dev/null +++ b/src/modules/purescript.rs @@ -0,0 +1,72 @@ +use super::{Context, Module, RootModuleConfig, SegmentConfig}; + +use crate::configs::purescript::PureScriptConfig; +use crate::utils; + +/// Creates a module with the current PureScript version +/// +/// Will display the PureScript version if any of the following criteria are met: +/// - Current directory contains a `spago.dhall` file +/// - Current directory contains a `*.purs` files +pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { + let is_purs_project = context + .try_begin_scan()? + .set_files(&["spago.dhall"]) + .set_extensions(&["purs"]) + .is_match(); + + if !is_purs_project { + return None; + } + + let purs_version = utils::exec_cmd("purs", &["--version"])?.stdout; + let formatted_version = Some(format!("v{}", purs_version.trim()))?; + + let mut module = context.new_module("purescript"); + let config: PureScriptConfig = PureScriptConfig::try_load(module.config); + module.set_style(config.style); + + module.create_segment("symbol", &config.symbol); + module.create_segment("version", &SegmentConfig::new(&formatted_version)); + + Some(module) +} + +#[cfg(test)] +mod tests { + use crate::modules::utils::test::render_module; + use ansi_term::Color; + use std::fs::File; + use std::io; + + #[test] + fn folder_without_purescript_files() -> io::Result<()> { + let dir = tempfile::tempdir()?; + let actual = render_module("purescript", dir.path(), None); + let expected = None; + assert_eq!(expected, actual); + dir.close() + } + + #[test] + fn folder_with_purescript_file() -> io::Result<()> { + let dir = tempfile::tempdir()?; + File::create(dir.path().join("Main.purs"))?.sync_all()?; + + let actual = render_module("purescript", dir.path(), None); + let expected = Some(format!("via {} ", Color::White.bold().paint("<=> v0.13.5"))); + assert_eq!(expected, actual); + dir.close() + } + + #[test] + fn folder_with_spago_file() -> io::Result<()> { + let dir = tempfile::tempdir()?; + File::create(dir.path().join("spago.dhall"))?.sync_all()?; + + let actual = render_module("purescript", dir.path(), None); + let expected = Some(format!("via {} ", Color::White.bold().paint("<=> v0.13.5"))); + assert_eq!(expected, actual); + dir.close() + } +} |