diff options
author | Milo <50248166+Milo123459@users.noreply.github.com> | 2021-04-20 17:31:47 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-20 18:31:47 +0200 |
commit | 83c906457e06a68061637868626fc0ab0e1d2753 (patch) | |
tree | 62bffab64388de81cf12dc762d3939e1fe7a6d4d /src/modules/red.rs | |
parent | 3f2d6cc068fc5fe9cfbf62dbeff5dfb1aa1f9114 (diff) |
feat(red): create module (#2599)
* create module
* fmt
* fix clippy
* fmt even though i already did it
* add all extensions
* tests for .reds
* change from circle to triangle
* remove hi.red
* fix test name
* update variables
* fix comment
* Update docs/config/README.md
Co-authored-by: Dario Vladović <d.vladimyr@gmail.com>
* Update docs/config/README.md
Co-authored-by: Dario Vladović <d.vladimyr@gmail.com>
* apply patchs
Co-authored-by: Dario Vladović <d.vladimyr@gmail.com>
Diffstat (limited to 'src/modules/red.rs')
-rw-r--r-- | src/modules/red.rs | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/src/modules/red.rs b/src/modules/red.rs new file mode 100644 index 000000000..5d2095339 --- /dev/null +++ b/src/modules/red.rs @@ -0,0 +1,96 @@ +use super::{Context, Module, RootModuleConfig}; + +use crate::configs::red::RedConfig; +use crate::formatter::StringFormatter; + +/// Creates a module with the current Red version +pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { + let mut module = context.new_module("red"); + let config = RedConfig::try_load(module.config); + let is_red_project = context + .try_begin_scan()? + .set_extensions(&config.detect_extensions) + .is_match(); + + if !is_red_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("red", &["--version"]) + .map(|output| parse_red_version(output.stdout.trim())) + .map(Ok), + _ => None, + }) + .parse(None) + }); + + module.set_segments(match parsed { + Ok(segments) => segments, + Err(error) => { + log::warn!("Error in module `red`:\n{}", error); + return None; + } + }); + + Some(module) +} + +fn parse_red_version(red_version: &str) -> String { + format!("v{}", red_version) +} + +#[cfg(test)] +mod tests { + use super::parse_red_version; + use crate::test::ModuleRenderer; + use ansi_term::Color; + use std::fs::File; + use std::io; + + #[test] + fn test_parse_red_version() { + const OUTPUT: &str = "0.6.4\n"; + assert_eq!(parse_red_version(OUTPUT.trim()), "v0.6.4".to_string()) + } + + #[test] + fn folder_without_red_files() -> io::Result<()> { + let dir = tempfile::tempdir()?; + let actual = ModuleRenderer::new("red").path(dir.path()).collect(); + let expected = None; + assert_eq!(expected, actual); + dir.close() + } + + #[test] + fn folder_with_red_files() -> io::Result<()> { + let dir = tempfile::tempdir()?; + File::create(dir.path().join("hello.red"))?.sync_all()?; + let actual = ModuleRenderer::new("red").path(dir.path()).collect(); + let expected = Some(format!("via {}", Color::Red.bold().paint("🔺 v0.6.4 "))); + assert_eq!(expected, actual); + dir.close() + } + + #[test] + fn folder_with_reds_files() -> io::Result<()> { + let dir = tempfile::tempdir()?; + File::create(dir.path().join("hello.reds"))?.sync_all()?; + let actual = ModuleRenderer::new("red").path(dir.path()).collect(); + let expected = Some(format!("via {}", Color::Red.bold().paint("🔺 v0.6.4 "))); + assert_eq!(expected, actual); + dir.close() + } +} |