Skip to content

Commit

Permalink
numfmt: implement missing --suffix option
Browse files Browse the repository at this point in the history
adds support for the --suffix option from issue uutils#1280.
  • Loading branch information
sbentmar committed Jan 1, 2022
1 parent cb051e7 commit af5919e
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 4 deletions.
26 changes: 22 additions & 4 deletions src/uu/numfmt/src/format.rs
Expand Up @@ -220,16 +220,34 @@ fn format_string(
options: &NumfmtOptions,
implicit_padding: Option<isize>,
) -> Result<String> {
// strip the (optional) suffix before applying any transformation
let source_without_suffix = if let Some(suffix) = &options.suffix {
source.strip_suffix(suffix).unwrap_or(source)
} else {
source
};

let number = transform_to(
transform_from(source, &options.transform.from)?,
transform_from(source_without_suffix, &options.transform.from)?,
&options.transform.to,
options.round,
)?;

// bring back the suffix before applying padding
let number_with_suffix = if let Some(suffix) = &options.suffix {
format!("{}{}", number, suffix)
} else {
number
};

Ok(match implicit_padding.unwrap_or(options.padding) {
0 => number,
p if p > 0 => format!("{:>padding$}", number, padding = p as usize),
p => format!("{:<padding$}", number, padding = p.abs() as usize),
0 => number_with_suffix,
p if p > 0 => format!("{:>padding$}", number_with_suffix, padding = p as usize),
p => format!(
"{:<padding$}",
number_with_suffix,
padding = p.abs() as usize
),
})
}

Expand Down
12 changes: 12 additions & 0 deletions src/uu/numfmt/src/numfmt.rs
Expand Up @@ -142,13 +142,16 @@ fn parse_options(args: &ArgMatches) -> Result<NumfmtOptions> {
_ => unreachable!("Should be restricted by clap"),
};

let suffix = args.value_of(options::SUFFIX).map(|s| s.to_owned());

Ok(NumfmtOptions {
transform,
padding,
header,
fields,
delimiter,
round,
suffix,
})
}

Expand Down Expand Up @@ -242,5 +245,14 @@ pub fn uu_app() -> App<'static, 'static> {
.default_value("from-zero")
.possible_values(&["up", "down", "from-zero", "towards-zero", "nearest"]),
)
.arg(
Arg::with_name(options::SUFFIX)
.long(options::SUFFIX)
.help(
"print SUFFIX after each formatted number, and accept \
inputs optionally ending with SUFFIX",
)
.value_name("SUFFIX"),
)
.arg(Arg::with_name(options::NUMBER).hidden(true).multiple(true))
}
2 changes: 2 additions & 0 deletions src/uu/numfmt/src/options.rs
Expand Up @@ -11,6 +11,7 @@ pub const HEADER_DEFAULT: &str = "1";
pub const NUMBER: &str = "NUMBER";
pub const PADDING: &str = "padding";
pub const ROUND: &str = "round";
pub const SUFFIX: &str = "suffix";
pub const TO: &str = "to";
pub const TO_DEFAULT: &str = "none";

Expand All @@ -26,6 +27,7 @@ pub struct NumfmtOptions {
pub fields: Vec<Range>,
pub delimiter: Option<String>,
pub round: RoundMethod,
pub suffix: Option<String>,
}

#[derive(Clone, Copy)]
Expand Down
64 changes: 64 additions & 0 deletions tests/by-util/test_numfmt.rs
Expand Up @@ -505,3 +505,67 @@ fn test_round() {
.stdout_only(exp.join("\n") + "\n");
}
}

#[test]
fn test_suffix_is_added_if_not_supplied() {
new_ucmd!()
.args(&["--suffix=TEST"])
.pipe_in("1000")
.succeeds()
.stdout_only("1000TEST\n");
}

#[test]
fn test_suffix_is_preserved() {
new_ucmd!()
.args(&["--suffix=TEST"])
.pipe_in("1000TEST")
.succeeds()
.stdout_only("1000TEST\n");
}

#[test]
fn test_suffix_is_only_applied_to_selected_field() {
new_ucmd!()
.args(&["--suffix=TEST", "--field=2"])
.pipe_in("1000 2000 3000")
.succeeds()
.stdout_only("1000 2000TEST 3000\n");
}

#[test]
fn test_transform_with_suffix_on_input() {
new_ucmd!()
.args(&["--suffix=TEST", "--to=si"])
.pipe_in("2000TEST")
.succeeds()
.stdout_only("2.0KTEST\n");
}

#[test]
fn test_transform_without_suffix_on_input() {
new_ucmd!()
.args(&["--suffix=TEST", "--to=si"])
.pipe_in("2000")
.succeeds()
.stdout_only("2.0KTEST\n");
}

#[test]
fn test_transform_with_suffix_and_delimiter() {
new_ucmd!()
.args(&["--suffix=mysuffix", "--to=si", "-d=|"])
.pipe_in("1000mysuffix|2000|3000")
.succeeds()
.stdout_only("1.0Kmysuffix|2000|3000\n");
}

#[test]
fn test_suffix_with_padding() {
new_ucmd!()
.args(&["--suffix=padme", "--padding=12"])
.pipe_in("1000 2000 3000")
.succeeds()
.stdout_only(" 1000padme 2000 3000\n");
}

0 comments on commit af5919e

Please sign in to comment.