summaryrefslogtreecommitdiffstats
path: root/src/modules
diff options
context:
space:
mode:
authorVirgile Andreani <armavica@ulminfo.fr>2024-03-20 17:50:12 -0400
committerGitHub <noreply@github.com>2024-03-20 22:50:12 +0100
commit0e49f04a6b249090cf3703c5dac041a51e6bf530 (patch)
tree9807d68b5a52c3a35465a02c80a591c979d1c240 /src/modules
parentd879317d513282e62d57347275911be042ee230d (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.rs3
-rw-r--r--src/modules/quarto.rs93
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()
+ }
+}