diff --git a/crates/nu-command/src/strings/base/hex.rs b/crates/nu-command/src/strings/base/hex.rs index 189b22742e..9604bacd85 100644 --- a/crates/nu-command/src/strings/base/hex.rs +++ b/crates/nu-command/src/strings/base/hex.rs @@ -53,7 +53,7 @@ impl Command for DecodeHex { call: &Call, input: PipelineData, ) -> Result { - todo!() + super::decode(data_encoding::HEXLOWER_PERMISSIVE, call.span(), input) } } diff --git a/crates/nu-command/src/strings/base/mod.rs b/crates/nu-command/src/strings/base/mod.rs index d7e248a032..6a30c0d21f 100644 --- a/crates/nu-command/src/strings/base/mod.rs +++ b/crates/nu-command/src/strings/base/mod.rs @@ -54,14 +54,17 @@ fn get_string(input: PipelineData, call_span: Span) -> Result<(String, Span), Sh match val { Value::String { val, .. } => Ok((val, span)), - _ => { - todo!("Invalid type") - } + value => Err(ShellError::TypeMismatch { + err_message: "binary or string".to_owned(), + span: call_span, + }), } } - PipelineData::ListStream(..) => { - todo!() - } + PipelineData::ListStream(list, ..) => Err(ShellError::PipelineMismatch { + exp_input_type: "binary or string".to_owned(), + dst_span: call_span, + src_span: list.span(), + }), PipelineData::ByteStream(stream, ..) => { let span = stream.span(); Ok((stream.into_string()?, span)) @@ -80,20 +83,23 @@ fn get_binary(input: PipelineData, call_span: Span) -> Result<(Vec, Span), S Value::Binary { val, .. } => Ok((val, span)), Value::String { val, .. } => Ok((val.into_bytes(), span)), - _ => { - todo!("Invalid type") - } + value => Err(ShellError::TypeMismatch { + err_message: "binary or string".to_owned(), + span: call_span, + }), } } - PipelineData::ListStream(..) => { - todo!() - } + PipelineData::ListStream(list, ..) => Err(ShellError::PipelineMismatch { + exp_input_type: "binary or string".to_owned(), + dst_span: call_span, + src_span: list.span(), + }), PipelineData::ByteStream(stream, ..) => { let span = stream.span(); Ok((stream.into_bytes()?, span)) } - PipelineData::Empty => { - todo!("Can't have empty data"); - } + PipelineData::Empty => Err(ShellError::PipelineEmpty { + dst_span: call_span, + }), } } diff --git a/crates/nu-command/tests/commands/base/base32.rs b/crates/nu-command/tests/commands/base/base32.rs index e6fae31808..dd7b49313d 100644 --- a/crates/nu-command/tests/commands/base/base32.rs +++ b/crates/nu-command/tests/commands/base/base32.rs @@ -2,16 +2,14 @@ use nu_test_support::nu; #[test] fn canonical() { - for value in super::random_bytes() { - let outcome = nu!("{} | encode base32 | decode base32 | to nuon", value); - assert_eq!(outcome.out, value); + super::test_canonical("base32"); + super::test_canonical("base32 --nopad"); +} - let outcome = nu!( - "{} | encode base32 --nopad | decode base32 --nopad | to nuon", - value - ); - assert_eq!(outcome.out, value); - } +#[test] +fn const_() { + super::test_const("base32"); + super::test_const("base32 --nopad"); } #[test] diff --git a/crates/nu-command/tests/commands/base/base32hex.rs b/crates/nu-command/tests/commands/base/base32hex.rs index adb1494bd9..eadbc9038c 100644 --- a/crates/nu-command/tests/commands/base/base32hex.rs +++ b/crates/nu-command/tests/commands/base/base32hex.rs @@ -2,16 +2,14 @@ use nu_test_support::nu; #[test] fn canonical() { - for value in super::random_bytes() { - let outcome = nu!("{} | encode base32hex | decode base32hex | to nuon", value); - assert_eq!(outcome.out, value); + super::test_canonical("base32hex"); + super::test_canonical("base32hex --nopad"); +} - let outcome = nu!( - "{} | encode base32hex --nopad | decode base32hex --nopad | to nuon", - value - ); - assert_eq!(outcome.out, value); - } +#[test] +fn const_() { + super::test_const("base32hex"); + super::test_const("base32hex --nopad"); } #[test] diff --git a/crates/nu-command/tests/commands/base/base64.rs b/crates/nu-command/tests/commands/base/base64.rs index 12b5f49fff..ac3554352c 100644 --- a/crates/nu-command/tests/commands/base/base64.rs +++ b/crates/nu-command/tests/commands/base/base64.rs @@ -2,31 +2,18 @@ use nu_test_support::nu; #[test] fn canonical() { - for value in super::random_bytes() { - let outcome = nu!( - "{} | encode new-base64 | decode new-base64 | to nuon", - value - ); - assert_eq!(outcome.out, value); + super::test_canonical("new-base64"); + super::test_canonical("new-base64 --url"); + super::test_canonical("new-base64 --nopad"); + super::test_canonical("new-base64 --url --nopad"); +} - let outcome = nu!( - "{} | encode new-base64 --url | decode new-base64 --url | to nuon", - value - ); - assert_eq!(outcome.out, value); - - let outcome = nu!( - "{} | encode new-base64 --nopad | decode new-base64 --nopad | to nuon", - value - ); - assert_eq!(outcome.out, value); - - let outcome = nu!( - "{} | encode new-base64 --url --nopad | decode new-base64 --url --nopad | to nuon", - value - ); - assert_eq!(outcome.out, value); - } +#[test] +fn const_() { + super::test_const("new-base64"); + super::test_const("new-base64 --url"); + super::test_const("new-base64 --nopad"); + super::test_const("new-base64 --url --nopad"); } #[test] diff --git a/crates/nu-command/tests/commands/base/hex.rs b/crates/nu-command/tests/commands/base/hex.rs index 5f497408b6..d5bc336491 100644 --- a/crates/nu-command/tests/commands/base/hex.rs +++ b/crates/nu-command/tests/commands/base/hex.rs @@ -2,10 +2,12 @@ use nu_test_support::nu; #[test] fn canonical() { - for value in super::random_bytes() { - let outcome = nu!("{} | encode hex | decode hex | to nuon", value); - assert_eq!(outcome.out, value); - } + super::test_canonical("hex"); +} + +#[test] +fn const_() { + super::test_const("hex"); } #[test] diff --git a/crates/nu-command/tests/commands/base/mod.rs b/crates/nu-command/tests/commands/base/mod.rs index 09828c9211..308f0b35df 100644 --- a/crates/nu-command/tests/commands/base/mod.rs +++ b/crates/nu-command/tests/commands/base/mod.rs @@ -2,13 +2,15 @@ use data_encoding::HEXUPPER; use rand::prelude::*; use rand_chacha::ChaCha8Rng; +use nu_test_support::nu; + mod base32; mod base32hex; mod base64; mod hex; /// Generate a few random binaries. -pub fn random_bytes() -> Vec { +fn random_bytes() -> Vec { const NUM: usize = 32; let mut rng = ChaCha8Rng::seed_from_u64(4); @@ -17,8 +19,26 @@ pub fn random_bytes() -> Vec { let length = rng.gen_range(0..512); let mut bytes = vec![0u8; length]; rng.fill_bytes(&mut bytes); - let hex_bytes = HEXUPPER.encode(&bytes); - format!("0x[{}]", hex_bytes) + HEXUPPER.encode(&bytes) }) .collect() } + +pub fn test_canonical(cmd: &str) { + for value in random_bytes() { + let outcome = nu!("0x[{}] | encode {1} | decode {1} | to nuon", value, cmd); + let nuon_value = format!("0x[{value}]"); + assert_eq!(outcome.out, nuon_value); + } +} + +pub fn test_const(cmd: &str) { + for value in random_bytes() { + let outcome = nu!( + r#"const out = (0x[{}] | encode {1} | decode {1} | encode hex); $out"#, + value, + cmd + ); + assert_eq!(outcome.out, value); + } +}