starship/modules/
purescript.rs1use super::{Context, Module, ModuleConfig};
2
3use crate::configs::purescript::PureScriptConfig;
4use crate::formatter::StringFormatter;
5use crate::formatter::VersionFormatter;
6
7pub 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}