diff --git a/crates/ruff/src/settings/options_base.rs b/crates/ruff/src/settings/options_base.rs index 15e84483f2..7be2617839 100644 --- a/crates/ruff/src/settings/options_base.rs +++ b/crates/ruff/src/settings/options_base.rs @@ -1,5 +1,30 @@ pub trait ConfigurationOptions { fn get_available_options() -> Vec<(&'static str, OptionEntry)>; + + /// Get an option entry by its fully-qualified name + /// (e.g. `foo.bar` refers to the `bar` option in the `foo` group). + fn get(name: Option<&str>) -> Option { + let mut entries = Self::get_available_options(); + + let mut parts_iter = name.into_iter().flat_map(|s| s.split('.')); + + while let Some(part) = parts_iter.next() { + let (_, field) = entries.into_iter().find(|(name, _)| *name == part)?; + match field { + OptionEntry::Field(..) => { + if parts_iter.next().is_some() { + return None; + } + + return Some(field); + } + OptionEntry::Group(fields) => { + entries = fields; + } + } + } + Some(OptionEntry::Group(entries)) + } } #[derive(Debug)] diff --git a/crates/ruff_cli/src/commands/config.rs b/crates/ruff_cli/src/commands/config.rs index 88d58ab8ec..9e94d1ac1b 100644 --- a/crates/ruff_cli/src/commands/config.rs +++ b/crates/ruff_cli/src/commands/config.rs @@ -6,43 +6,31 @@ use ruff::settings::{ use crate::ExitStatus; #[allow(clippy::print_stdout)] -pub(crate) fn config(option: Option<&str>) -> ExitStatus { - let entries = Options::get_available_options(); - let mut entries = &entries; +pub(crate) fn config(key: Option<&str>) -> ExitStatus { + let Some(entry) = Options::get(key) else { + println!("Unknown option"); + return ExitStatus::Error; + }; - let mut parts_iter = option.iter().flat_map(|s| s.split('.')); - - while let Some(part) = parts_iter.next() { - let Some((_, field)) = entries.iter().find(|(name, _)| *name == part) else { - println!("Unknown option"); - return ExitStatus::Error; - }; - match field { - OptionEntry::Field(OptionField { - doc, - default, - value_type, - example, - }) => { - if parts_iter.next().is_some() { - println!("Unknown option"); - return ExitStatus::Error; - } - - println!("{doc}"); - println!(); - println!("Default value: {default}"); - println!("Type: {value_type}"); - println!("Example usage:\n```toml\n{example}\n```"); - return ExitStatus::Success; - } - OptionEntry::Group(fields) => { - entries = fields; + match entry { + OptionEntry::Field(OptionField { + doc, + default, + value_type, + example, + }) => { + println!("{doc}"); + println!(); + println!("Default value: {default}"); + println!("Type: {value_type}"); + println!("Example usage:\n```toml\n{example}\n```"); + } + OptionEntry::Group(entries) => { + for (name, _) in entries { + println!("{name}"); } } } - for (name, _) in entries { - println!("{name}"); - } + ExitStatus::Success }