Skip to content

Commit

Permalink
Merge pull request uutils#6510 from matrixhead/color-clear-to-eol
Browse files Browse the repository at this point in the history
ls: Refactor `parse_width` function
  • Loading branch information
cakebaker committed Jun 29, 2024
2 parents e08c43a + 91d1b81 commit cb5111c
Showing 1 changed file with 43 additions and 31 deletions.
74 changes: 43 additions & 31 deletions src/uu/ls/src/ls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -753,20 +753,51 @@ fn extract_indicator_style(options: &clap::ArgMatches) -> IndicatorStyle {
}
}

fn parse_width(s: &str) -> Result<u16, LsError> {
let radix = if s.starts_with('0') && s.len() > 1 {
8
} else {
10
/// Parses the width value from either the command line arguments or the environment variables.
fn parse_width(width_match: Option<&String>) -> Result<u16, LsError> {
let parse_width_from_args = |s: &str| -> Result<u16, LsError> {
let radix = if s.starts_with('0') && s.len() > 1 {
8
} else {
10
};
match u16::from_str_radix(s, radix) {
Ok(x) => Ok(x),
Err(e) => match e.kind() {
IntErrorKind::PosOverflow => Ok(u16::MAX),
_ => Err(LsError::InvalidLineWidth(s.into())),
},
}
};

let parse_width_from_env =
|columns: OsString| match columns.to_str().and_then(|s| s.parse().ok()) {
Some(columns) => columns,
None => {
show_error!(
"ignoring invalid width in environment variable COLUMNS: {}",
columns.quote()
);
DEFAULT_TERM_WIDTH
}
};

let calculate_term_size = || match terminal_size::terminal_size() {
Some((width, _)) => width.0,
None => DEFAULT_TERM_WIDTH,
};
match u16::from_str_radix(s, radix) {
Ok(x) => Ok(x),
Err(e) => match e.kind() {
IntErrorKind::PosOverflow => Ok(u16::MAX),
_ => Err(LsError::InvalidLineWidth(s.into())),

let ret = match width_match {
Some(x) => parse_width_from_args(x)?,
None => match std::env::var_os("COLUMNS") {
Some(columns) => parse_width_from_env(columns),
None => calculate_term_size(),
},
}
};

Ok(ret)
}

impl Config {
#[allow(clippy::cognitive_complexity)]
pub fn from(options: &clap::ArgMatches) -> UResult<Self> {
Expand Down Expand Up @@ -926,26 +957,7 @@ impl Config {
numeric_uid_gid,
}
};

let width = match options.get_one::<String>(options::WIDTH) {
Some(x) => parse_width(x)?,
None => match std::env::var_os("COLUMNS") {
Some(columns) => match columns.to_str().and_then(|s| s.parse().ok()) {
Some(columns) => columns,
None => {
show_error!(
"ignoring invalid width in environment variable COLUMNS: {}",
columns.quote()
);
DEFAULT_TERM_WIDTH
}
},
None => match terminal_size::terminal_size() {
Some((width, _)) => width.0,
None => DEFAULT_TERM_WIDTH,
},
},
};
let width = parse_width(options.get_one::<String>(options::WIDTH))?;

#[allow(clippy::needless_bool)]
let mut show_control = if options.get_flag(options::HIDE_CONTROL_CHARS) {
Expand Down

0 comments on commit cb5111c

Please sign in to comment.