From 1e94793df5a969dcc4322f68b995c79b3a28576a Mon Sep 17 00:00:00 2001 From: krober Date: Wed, 18 May 2022 08:57:20 -0500 Subject: [PATCH] Add str title-case (#5573) Co-authored-by: kyle --- crates/nu-command/src/default_context.rs | 1 + .../nu-command/src/strings/str_/case/mod.rs | 2 + .../src/strings/str_/case/title_case.rs | 92 +++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 crates/nu-command/src/strings/str_/case/title_case.rs diff --git a/crates/nu-command/src/default_context.rs b/crates/nu-command/src/default_context.rs index bbf1fb086..da21fcf71 100644 --- a/crates/nu-command/src/default_context.rs +++ b/crates/nu-command/src/default_context.rs @@ -194,6 +194,7 @@ pub fn create_default_context(cwd: impl AsRef) -> EngineState { StrStartsWith, StrSubstring, StrTrim, + StrTitleCase, StrUpcase }; diff --git a/crates/nu-command/src/strings/str_/case/mod.rs b/crates/nu-command/src/strings/str_/case/mod.rs index b4df44a49..fbf7492d3 100644 --- a/crates/nu-command/src/strings/str_/case/mod.rs +++ b/crates/nu-command/src/strings/str_/case/mod.rs @@ -6,6 +6,7 @@ pub mod pascal_case; pub mod screaming_snake_case; pub mod snake_case; pub mod str_; +pub mod title_case; pub mod upcase; pub use camel_case::SubCommand as StrCamelCase; @@ -16,6 +17,7 @@ pub use pascal_case::SubCommand as StrPascalCase; pub use screaming_snake_case::SubCommand as StrScreamingSnakeCase; pub use snake_case::SubCommand as StrSnakeCase; pub use str_::Str; +pub use title_case::SubCommand as StrTitleCase; pub use upcase::SubCommand as StrUpcase; use nu_engine::CallExt; diff --git a/crates/nu-command/src/strings/str_/case/title_case.rs b/crates/nu-command/src/strings/str_/case/title_case.rs new file mode 100644 index 000000000..521afb331 --- /dev/null +++ b/crates/nu-command/src/strings/str_/case/title_case.rs @@ -0,0 +1,92 @@ +use inflector::cases::titlecase::to_title_case; +use nu_protocol::ast::Call; +use nu_protocol::engine::{Command, EngineState, Stack}; +use nu_protocol::{ + Category, Example, PipelineData, ShellError, Signature, Span, SyntaxShape, Value, +}; + +use crate::operate; + +#[derive(Clone)] +pub struct SubCommand; + +impl Command for SubCommand { + fn name(&self) -> &str { + "str title-case" + } + + fn signature(&self) -> Signature { + Signature::build("str title-case") + .rest( + "rest", + SyntaxShape::CellPath, + "optionally convert text to Title Case by column paths", + ) + .category(Category::Strings) + } + + fn usage(&self) -> &str { + "Convert a string to Title Case" + } + + fn run( + &self, + engine_state: &EngineState, + stack: &mut Stack, + call: &Call, + input: PipelineData, + ) -> Result { + operate(engine_state, stack, call, input, &to_title_case) + } + + fn examples(&self) -> Vec { + vec![ + Example { + description: "convert a string to Title Case", + example: "'nu-shell' | str title-case", + result: Some(Value::String { + val: "Nu Shell".to_string(), + span: Span::test_data(), + }), + }, + Example { + description: "convert a string to Title Case", + example: "'this is a test case' | str title-case", + result: Some(Value::String { + val: "This Is A Test Case".to_string(), + span: Span::test_data(), + }), + }, + Example { + description: "convert a column from a table to Title Case", + example: r#"[[title, count]; ['nu test', 100]] | str title-case title"#, + result: Some(Value::List { + vals: vec![Value::Record { + span: Span::test_data(), + cols: vec!["title".to_string(), "count".to_string()], + vals: vec![ + Value::String { + val: "Nu Test".to_string(), + span: Span::test_data(), + }, + Value::test_int(100), + ], + }], + span: Span::test_data(), + }), + }, + ] + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_examples() { + use crate::test_examples; + + test_examples(SubCommand {}) + } +}