Merge pull request #6510 from matrixhead/color-clear-to-eol

ls: Refactor `parse_width` function
This commit is contained in:
Daniel Hofstetter 2024-06-29 15:32:06 +02:00 committed by GitHub
commit cb5111c1b8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -753,7 +753,9 @@ fn extract_indicator_style(options: &clap::ArgMatches) -> IndicatorStyle {
} }
} }
fn parse_width(s: &str) -> Result<u16, LsError> { /// 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 { let radix = if s.starts_with('0') && s.len() > 1 {
8 8
} else { } else {
@ -766,7 +768,36 @@ fn parse_width(s: &str) -> Result<u16, LsError> {
_ => Err(LsError::InvalidLineWidth(s.into())), _ => 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,
};
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 { impl Config {
#[allow(clippy::cognitive_complexity)] #[allow(clippy::cognitive_complexity)]
pub fn from(options: &clap::ArgMatches) -> UResult<Self> { pub fn from(options: &clap::ArgMatches) -> UResult<Self> {
@ -926,26 +957,7 @@ impl Config {
numeric_uid_gid, numeric_uid_gid,
} }
}; };
let width = parse_width(options.get_one::<String>(options::WIDTH))?;
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,
},
},
};
#[allow(clippy::needless_bool)] #[allow(clippy::needless_bool)]
let mut show_control = if options.get_flag(options::HIDE_CONTROL_CHARS) { let mut show_control = if options.get_flag(options::HIDE_CONTROL_CHARS) {