-
-
Notifications
You must be signed in to change notification settings - Fork 2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(odin): Add Odin Lang module (#5873)
* Add Odin lang module * add utils string and remove commit number from output * switch to new symbol because ZWJ support is rare * add config docs * add option to show the commit number * fix lack of trimming * fix formatting to comply with checks * Add trailing newline to comply with cargo fmt * Add new Odin test and add newline in cmd output
- Loading branch information
Showing
9 changed files
with
263 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
use serde::{Deserialize, Serialize}; | ||
|
||
#[derive(Clone, Deserialize, Serialize)] | ||
#[cfg_attr( | ||
feature = "config-schema", | ||
derive(schemars::JsonSchema), | ||
schemars(deny_unknown_fields) | ||
)] | ||
#[serde(default)] | ||
pub struct OdinConfig<'a> { | ||
pub format: &'a str, | ||
pub show_commit: bool, | ||
pub symbol: &'a str, | ||
pub style: &'a str, | ||
pub disabled: bool, | ||
pub detect_extensions: Vec<&'a str>, | ||
pub detect_files: Vec<&'a str>, | ||
pub detect_folders: Vec<&'a str>, | ||
} | ||
|
||
impl<'a> Default for OdinConfig<'a> { | ||
fn default() -> Self { | ||
OdinConfig { | ||
format: "via [$symbol($version )]($style)", | ||
show_commit: false, | ||
symbol: "Ø ", | ||
style: "bold bright-blue", | ||
disabled: false, | ||
detect_extensions: vec!["odin"], | ||
detect_files: vec![], | ||
detect_folders: vec![], | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -77,6 +77,7 @@ pub const PROMPT_ORDER: &[&str] = &[ | |
"nim", | ||
"nodejs", | ||
"ocaml", | ||
"odin", | ||
"opa", | ||
"perl", | ||
"php", | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
use super::{Context, Module, ModuleConfig}; | ||
|
||
use crate::configs::odin::OdinConfig; | ||
use crate::formatter::StringFormatter; | ||
|
||
/// Creates a module with the current Odin version | ||
pub fn module<'a>(context: &'a Context) -> Option<Module<'a>> { | ||
let mut module = context.new_module("odin"); | ||
let config = OdinConfig::try_load(module.config); | ||
|
||
let is_odin_project = context | ||
.try_begin_scan()? | ||
.set_files(&config.detect_files) | ||
.set_extensions(&config.detect_extensions) | ||
.set_folders(&config.detect_folders) | ||
.is_match(); | ||
|
||
if !is_odin_project { | ||
return None; | ||
} | ||
|
||
let parsed = StringFormatter::new(config.format).and_then(|formatter| { | ||
formatter | ||
.map_meta(|variable, _| match variable { | ||
"symbol" => Some(config.symbol), | ||
_ => None, | ||
}) | ||
.map_style(|variable| match variable { | ||
"style" => Some(Ok(config.style)), | ||
_ => None, | ||
}) | ||
.map(|variable| match variable { | ||
"version" => { | ||
let odin_version = context.exec_cmd("odin", &["version"])?.stdout; | ||
let trimmed_version = odin_version.split(' ').last()?.trim().to_string(); | ||
|
||
if config.show_commit { | ||
return Some(Ok(trimmed_version)); | ||
} | ||
|
||
let no_commit = trimmed_version.split(':').next()?.trim().to_string(); | ||
Some(Ok(no_commit)) | ||
} | ||
_ => None, | ||
}) | ||
.parse(None, Some(context)) | ||
}); | ||
|
||
module.set_segments(match parsed { | ||
Ok(segments) => segments, | ||
Err(error) => { | ||
log::warn!("Error in module `odin`:\n{}", error); | ||
return None; | ||
} | ||
}); | ||
|
||
Some(module) | ||
} | ||
|
||
#[cfg(test)] | ||
mod tests { | ||
use crate::test::ModuleRenderer; | ||
use crate::utils::CommandOutput; | ||
use nu_ansi_term::Color; | ||
use std::fs::File; | ||
use std::io; | ||
|
||
#[test] | ||
fn folder_without_odin() -> io::Result<()> { | ||
let dir = tempfile::tempdir()?; | ||
File::create(dir.path().join("odin.txt"))?.sync_all()?; | ||
let actual = ModuleRenderer::new("odin").path(dir.path()).collect(); | ||
let expected = None; | ||
assert_eq!(expected, actual); | ||
dir.close() | ||
} | ||
|
||
#[test] | ||
fn folder_with_odin_file() -> io::Result<()> { | ||
let dir = tempfile::tempdir()?; | ||
File::create(dir.path().join("main.odin"))?.sync_all()?; | ||
let actual = ModuleRenderer::new("odin").path(dir.path()).collect(); | ||
let expected = Some(format!( | ||
"via {}", | ||
Color::LightBlue.bold().paint("Ø dev-2024-03 ") | ||
)); | ||
assert_eq!(expected, actual); | ||
dir.close() | ||
} | ||
|
||
#[test] | ||
fn folder_with_odin_file_without_commit() -> io::Result<()> { | ||
let dir = tempfile::tempdir()?; | ||
File::create(dir.path().join("main.odin"))?.sync_all()?; | ||
let actual = ModuleRenderer::new("odin") | ||
.cmd( | ||
"odin version", | ||
Some(CommandOutput { | ||
stdout: String::from("odin version dev-2024-03\n"), | ||
stderr: String::default(), | ||
}), | ||
) | ||
.path(dir.path()) | ||
.collect(); | ||
let expected = Some(format!( | ||
"via {}", | ||
Color::LightBlue.bold().paint("Ø dev-2024-03 ") | ||
)); | ||
assert_eq!(expected, actual); | ||
dir.close() | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters