diff --git a/crates/nu-command/src/conversions/into/filesize.rs b/crates/nu-command/src/conversions/into/filesize.rs index c97209cd8c..706dc5c2c4 100644 --- a/crates/nu-command/src/conversions/into/filesize.rs +++ b/crates/nu-command/src/conversions/into/filesize.rs @@ -107,6 +107,11 @@ impl Command for SubCommand { example: "4KB | into filesize", result: Some(Value::test_filesize(4000)), }, + Example { + description: "Convert string with unit to filesize", + example: "'-1KB' | into filesize", + result: Some(Value::test_filesize(-1000)), + }, ] } } @@ -140,14 +145,29 @@ fn int_from_string(a_string: &str, span: Span) -> Result { // Now that we know the locale, get the thousands separator and remove it // so strings like 1,123,456 can be parsed as 1123456 let no_comma_string = a_string.replace(locale.separator(), ""); - match no_comma_string.trim().parse::() { - Ok(n) => Ok(n.0 as i64), - Err(_) => Err(ShellError::CantConvert { - to_type: "int".into(), - from_type: "string".into(), - span, - help: None, - }), + let clean_string = no_comma_string.trim(); + + // Hadle negative file size + if let Some(stripped_string) = clean_string.strip_prefix('-') { + match stripped_string.parse::() { + Ok(n) => Ok(-(n.as_u64() as i64)), + Err(_) => Err(ShellError::CantConvert { + to_type: "int".into(), + from_type: "string".into(), + span, + help: None, + }), + } + } else { + match clean_string.parse::() { + Ok(n) => Ok(n.0 as i64), + Err(_) => Err(ShellError::CantConvert { + to_type: "int".into(), + from_type: "string".into(), + span, + help: None, + }), + } } } diff --git a/crates/nu-command/tests/commands/into_filesize.rs b/crates/nu-command/tests/commands/into_filesize.rs index 4821d73205..2917e141db 100644 --- a/crates/nu-command/tests/commands/into_filesize.rs +++ b/crates/nu-command/tests/commands/into_filesize.rs @@ -61,3 +61,10 @@ fn into_filesize_negative_filesize() { assert!(actual.out.contains("-3.0 KiB")); } + +#[test] +fn into_negative_filesize() { + let actual = nu!("'-1' | into filesize"); + + assert!(actual.out.contains("-1 B")); +}