diff --git a/crates/nu-command/src/lib.rs b/crates/nu-command/src/lib.rs index 4e0f0a7f4..34ca20542 100644 --- a/crates/nu-command/src/lib.rs +++ b/crates/nu-command/src/lib.rs @@ -8,6 +8,7 @@ mod filesystem; mod filters; mod formats; mod strings; +mod math; mod system; mod viewers; @@ -21,5 +22,6 @@ pub use filesystem::*; pub use filters::*; pub use formats::*; pub use strings::*; +pub use math::*; pub use system::*; pub use viewers::*; diff --git a/crates/nu-command/src/math/abs.rs b/crates/nu-command/src/math/abs.rs new file mode 100644 index 000000000..2bf717a67 --- /dev/null +++ b/crates/nu-command/src/math/abs.rs @@ -0,0 +1,60 @@ +use nu_protocol::ast::Call; +use nu_protocol::engine::{Command, EvaluationContext}; +use nu_protocol::{Example, ShellError, Signature, Span, Type, Value}; + +pub struct SubCommand; + +impl Command for SubCommand { + fn name(&self) -> &str { + "math abs" + } + + fn signature(&self) -> Signature { + Signature::build("math abs") + } + + fn usage(&self) -> &str { + "Returns absolute values of a list of numbers" + } + + fn run(&self, context: &EvaluationContext, call: &Call, input: Value) -> Result { + let mapped = input.map(move |val| match val.value { + Value::Int { val, span } => Value::int(val.abs(), span), + Value::Float { val, span } => Value::Float{val: val.abs(), span: span}, + Value::Duration { val, span } => Value::Duration{val: val.abs(), span: span}, + other => abs_default(other)?, + }); + Ok(mapped) + } + + fn examples(&self) -> Vec { + vec![Example { + description: "Get absolute of each value in a list of numbers", + example: "echo [-50 25] | math abs", + result: Some(vec![ + Value::test_int(50), + Value::test_int(25), + ]), + }] + } +} + +fn abs_default(_: Value) -> Result { + Value::Error(ShellError::unexpected( + "Only numerical values are supported", + )) + .into() +} + +#[cfg(test)] +mod tests { + use super::ShellError; + use super::SubCommand; + + #[test] + fn examples_work_as_expected() -> Result<(), ShellError> { + use crate::examples::test as test_examples; + + test_examples(SubCommand {}) + } +} diff --git a/crates/nu-command/src/math/mod.rs b/crates/nu-command/src/math/mod.rs new file mode 100644 index 000000000..ea889f5db --- /dev/null +++ b/crates/nu-command/src/math/mod.rs @@ -0,0 +1,3 @@ +pub mod abs; + +pub use abs::SubCommand as MathAbs;