summaryrefslogtreecommitdiffstats
path: root/src/modules
diff options
context:
space:
mode:
authornobv <36393714+nobv@users.noreply.github.com>2020-05-23 01:26:58 +0900
committerGitHub <noreply@github.com>2020-05-22 18:26:58 +0200
commit63799b97d17fb7bd0c691c86117ecae7da1fc1ed (patch)
treefa2094b2f35557f2717055cc4bca1f91d15eadce /src/modules
parenta670e01c229cd71529a7313f1d5b96ae3e0cd69d (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.rs3
-rw-r--r--src/modules/purescript.rs72
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()
+ }
+}