diff options
author | Virgile Andreani <armavica@ulminfo.fr> | 2024-03-20 17:50:12 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-20 22:50:12 +0100 |
commit | 0e49f04a6b249090cf3703c5dac041a51e6bf530 (patch) | |
tree | 9807d68b5a52c3a35465a02c80a591c979d1c240 /src/modules | |
parent | d879317d513282e62d57347275911be042ee230d (diff) |
feat(quarto): Add Quarto module (#5820)
Add Quarto module
* Adapted from the Typst module
Diffstat (limited to 'src/modules')
-rw-r--r-- | src/modules/mod.rs | 3 | ||||
-rw-r--r-- | src/modules/quarto.rs | 93 |
2 files changed, 96 insertions, 0 deletions
diff --git a/src/modules/mod.rs b/src/modules/mod.rs index 57983cd1e..a219cd0d2 100644 --- a/src/modules/mod.rs +++ b/src/modules/mod.rs @@ -65,6 +65,7 @@ mod pijul_channel; mod pulumi; mod purescript; mod python; +mod quarto; mod raku; mod red; mod rlang; @@ -172,6 +173,7 @@ pub fn handle<'a>(module: &str, context: &'a Context) -> Option<Module<'a>> { "pulumi" => pulumi::module(context), "purescript" => purescript::module(context), "python" => python::module(context), + "quarto" => quarto::module(context), "raku" => raku::module(context), "rlang" => rlang::module(context), "red" => red::module(context), @@ -292,6 +294,7 @@ pub fn description(module: &str) -> &'static str { "pulumi" => "The current username, stack, and installed version of Pulumi", "purescript" => "The currently installed version of PureScript", "python" => "The currently installed version of Python", + "quarto" => "The current installed version of quarto", "raku" => "The currently installed version of Raku", "red" => "The currently installed version of Red", "rlang" => "The currently installed version of R", diff --git a/src/modules/quarto.rs b/src/modules/quarto.rs new file mode 100644 index 000000000..25c72b4c5 --- /dev/null +++ b/src/modules/quarto.rs @@ -0,0 +1,93 @@ +use super::{Context, Module, ModuleConfig}; + +use crate::configs::quarto::QuartoConfig; +use crate::formatter::{StringFormatter, VersionFormatter}; + +/// Creates a module with the current Quarto version +pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { + let mut module = context.new_module("quarto"); + let config = QuartoConfig::try_load(module.config); + + let is_quarto_project = context + .try_begin_scan()? + .set_files(&config.detect_files) + .set_extensions(&config.detect_extensions) + .set_folders(&config.detect_folders) + .is_match(); + + if !is_quarto_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" => { + let version = context + .exec_cmd("quarto", &["--version"])? + .stdout + .trim_end() + .to_owned(); + VersionFormatter::format_module_version( + module.get_name(), + &version, + config.version_format, + ) + .map(Ok) + } + _ => None, + }) + .parse(None, Some(context)) + }); + + module.set_segments(match parsed { + Ok(segments) => segments, + Err(error) => { + log::warn!("Error in module `quarto`:\n{}", error); + return None; + } + }); + + Some(module) +} + +#[cfg(test)] +mod tests { + use crate::test::ModuleRenderer; + use nu_ansi_term::Color; + use std::fs::File; + use std::io; + #[test] + fn read_quarto_not_present() -> io::Result<()> { + let dir = tempfile::tempdir()?; + + let actual = ModuleRenderer::new("quarto").path(dir.path()).collect(); + + let expected = None; + assert_eq!(expected, actual); + dir.close() + } + + #[test] + fn read_quarto_present() -> io::Result<()> { + let dir = tempfile::tempdir()?; + + File::create(dir.path().join("test.qmd"))?.sync_all()?; + + let actual = ModuleRenderer::new("quarto").path(dir.path()).collect(); + let expected = Some(format!( + "via {}", + Color::Rgb(117, 170, 219).bold().paint("⨁ v1.4.549 ") + )); + assert_eq!(expected, actual); + dir.close() + } +} |