diff --git a/crates/nu-protocol/src/value/mod.rs b/crates/nu-protocol/src/value/mod.rs index fd85ce9cf4..96617a91b4 100644 --- a/crates/nu-protocol/src/value/mod.rs +++ b/crates/nu-protocol/src/value/mod.rs @@ -3445,6 +3445,13 @@ impl Value { Err(ShellError::DivisionByZero { span: op }) } } + (Value::Duration { val: lhs, .. }, Value::Duration { val: rhs, .. }) => { + if *rhs != 0 { + Ok(Value::duration(lhs % rhs, span)) + } else { + Err(ShellError::DivisionByZero { span: op }) + } + } (Value::CustomValue { val: lhs, .. }, rhs) => { lhs.operation(span, Operator::Math(Math::Modulo), op, rhs) } diff --git a/src/tests/test_math.rs b/src/tests/test_math.rs index ee4d139e39..930742bb31 100644 --- a/src/tests/test_math.rs +++ b/src/tests/test_math.rs @@ -120,6 +120,14 @@ fn test_filesize_op() -> TestResult { run_test("-5kb + 4.5kb", "-500 B") } +#[test] +fn test_duration_op() -> TestResult { + run_test("4min + 20sec", "4min 20sec").unwrap(); + run_test("42sec * 2", "1min 24sec").unwrap(); + run_test("(3min + 14sec) / 2", "1min 37sec").unwrap(); + run_test("(4min + 20sec) mod 69sec", "53sec") +} + #[test] fn lt() -> TestResult { run_test("1 < 3", "true").unwrap();