starship/modules/
purescript.rs

1use super::{Context, Module, ModuleConfig};
2
3use crate::configs::purescript::PureScriptConfig;
4use crate::formatter::StringFormatter;
5use crate::formatter::VersionFormatter;
6
7/// Creates a module with the current PureScript version
8pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> {
9    let mut module = context.new_module("purescript");
10    let config: PureScriptConfig = PureScriptConfig::try_load(module.config);
11    let is_purs_project = context
12        .try_begin_scan()?
13        .set_files(&config.detect_files)
14        .set_folders(&config.detect_folders)
15        .set_extensions(&config.detect_extensions)
16        .is_match();
17
18    if !is_purs_project {
19        return None;
20    }
21
22    let parsed = StringFormatter::new(config.format).and_then(|formatter| {
23        formatter
24            .map_meta(|variable, _| match variable {
25                "symbol" => Some(config.symbol),
26                _ => None,
27            })
28            .map_style(|variable| match variable {
29                "style" => Some(Ok(config.style)),
30                _ => None,
31            })
32            .map(|variable| match variable {
33                "version" => {
34                    let purs_version = context.exec_cmd("purs", &["--version"])?.stdout;
35                    VersionFormatter::format_module_version(
36                        module.get_name(),
37                        purs_version.trim(),
38                        config.version_format,
39                    )
40                    .map(Ok)
41                }
42                _ => None,
43            })
44            .parse(None, Some(context))
45    });
46
47    module.set_segments(match parsed {
48        Ok(segments) => segments,
49        Err(error) => {
50            log::warn!("Error in module `purescript`:\n{error}");
51            return None;
52        }
53    });
54
55    Some(module)
56}
57
58#[cfg(test)]
59mod tests {
60    use crate::test::ModuleRenderer;
61    use nu_ansi_term::Color;
62    use std::fs::File;
63    use std::io;
64
65    #[test]
66    fn folder_without_purescript_files() -> io::Result<()> {
67        let dir = tempfile::tempdir()?;
68        let actual = ModuleRenderer::new("purescript").path(dir.path()).collect();
69        let expected = None;
70        assert_eq!(expected, actual);
71        dir.close()
72    }
73
74    #[test]
75    fn folder_with_purescript_file() -> io::Result<()> {
76        let dir = tempfile::tempdir()?;
77        File::create(dir.path().join("Main.purs"))?.sync_all()?;
78
79        let actual = ModuleRenderer::new("purescript").path(dir.path()).collect();
80        let expected = Some(format!("via {}", Color::White.bold().paint("<=> v0.13.5 ")));
81        assert_eq!(expected, actual);
82        dir.close()
83    }
84
85    #[test]
86    fn folder_with_spago_file() -> io::Result<()> {
87        let dir = tempfile::tempdir()?;
88        File::create(dir.path().join("spago.dhall"))?.sync_all()?;
89
90        let actual = ModuleRenderer::new("purescript").path(dir.path()).collect();
91        let expected = Some(format!("via {}", Color::White.bold().paint("<=> v0.13.5 ")));
92        assert_eq!(expected, actual);
93        dir.close()
94    }
95
96    #[test]
97    fn folder_with_spago_yaml_file() -> io::Result<()> {
98        let dir = tempfile::tempdir()?;
99        File::create(dir.path().join("spago.yaml"))?.sync_all()?;
100
101        let actual = ModuleRenderer::new("purescript").path(dir.path()).collect();
102        let expected = Some(format!("via {}", Color::White.bold().paint("<=> v0.13.5 ")));
103        assert_eq!(expected, actual);
104        dir.close()
105    }
106
107    #[test]
108    fn folder_with_spago_lock_file() -> io::Result<()> {
109        let dir = tempfile::tempdir()?;
110        File::create(dir.path().join("spago.lock"))?.sync_all()?;
111
112        let actual = ModuleRenderer::new("purescript").path(dir.path()).collect();
113        let expected = Some(format!("via {}", Color::White.bold().paint("<=> v0.13.5 ")));
114        assert_eq!(expected, actual);
115        dir.close()
116    }
117}