use super::registry::OPTION_SPECS; use super::reserved::{RESERVED_OPTION_NAMES, ReservedOptionName}; use super::{OptionScope, OptionSource, OptionSpec, OptionStatus}; /// Returns the canonical option specification for a known spelling. #[must_use] pub fn option_spec(name: &str) -> Option<&'static OptionSpec> { OPTION_SPECS .iter() .find(|s| s.name == name) .or_else(|| OPTION_SPECS.iter().find(|s| s.aliases.contains(&name))) } /// Returns whether an option is required by the `aria2-rust-pro` surface. #[must_use] pub fn is_required_pro_option(option: &str) -> bool { OPTION_SPECS.iter().any(|s| { s.name == option && (s.source == OptionSource::Pro || s.source == OptionSource::CompatibilityAlias) }) } /// Returns whether a status should be exposed in live option listings. #[must_use] pub const fn is_live_option_status(status: OptionStatus) -> bool { matches!( status, OptionStatus::Implemented | OptionStatus::Verified | OptionStatus::Deprecated ) } /// Filters the registry while preserving canonical-name uniqueness. fn unique_option_specs(predicate: impl Fn(&OptionSpec) -> bool) -> Vec<&'static OptionSpec> { let mut seen = std::collections::BTreeSet::new(); OPTION_SPECS .iter() .filter(|spec| predicate(spec) && seen.insert(spec.name)) .collect() } /// Returns all live option specs without duplicate canonical names. #[must_use] pub fn live_option_specs() -> Vec<&'static OptionSpec> { unique_option_specs(|spec| is_live_option_status(spec.status)) } /// Returns all options available in the global scope. #[must_use] pub fn global_option_specs() -> Vec<&'static OptionSpec> { unique_option_specs(|spec| { matches!(spec.metadata.scope, OptionScope::Global | OptionScope::Both) }) } /// Returns all options available in the per-download scope. #[must_use] pub fn per_download_option_specs() -> Vec<&'static OptionSpec> { unique_option_specs(|spec| { matches!( spec.metadata.scope, OptionScope::PerDownload | OptionScope::Both ) }) } /// Returns the reserved option-name table. #[must_use] pub const fn reserved_option_names() -> &'static [ReservedOptionName] { RESERVED_OPTION_NAMES } /// Returns the canonical RPC option name for a known spelling. #[must_use] pub fn rpc_option_name(name: &str) -> Option<&'static str> { option_spec(name).and_then(|s| s.rpc_names.first().copied()) } /// Returns the environment-variable name associated with an option. #[must_use] pub fn env_var_for_option(name: &str) -> Option { option_spec(name).map(|s| format!("ARIA2_{}", s.name.replace('-', "_").to_ascii_uppercase())) }