pub struct ConfigResolver { /* private fields */ }Expand description
Resolves layered config input into the runtime view seen by the rest of the application.
Callers usually populate the individual source layers first and then ask the resolver for either the final runtime view or an explanation trace.
High-level flow:
- select one winning raw value per key using source and scope precedence
- interpolate placeholders inside the selected winners
- adapt and validate the interpolated values against the schema
- optionally expose an explanation trace that shows why each winner won
Contract:
- precedence rules live here, not in callers
- schema adaptation happens after winner selection, not while scanning layers
- bootstrap handling stays aligned with the config bootstrap helpers rather than becoming a separate merge system
Implementations§
Source§impl ConfigResolver
impl ConfigResolver
Sourcepub fn from_loaded_layers(layers: LoadedLayers) -> Self
pub fn from_loaded_layers(layers: LoadedLayers) -> Self
Creates a resolver from pre-loaded config layers.
Sourcepub fn from_loaded_layers_with_schema(
layers: LoadedLayers,
schema: ConfigSchema,
) -> Self
pub fn from_loaded_layers_with_schema( layers: LoadedLayers, schema: ConfigSchema, ) -> Self
Creates a resolver from pre-loaded config layers and an explicit schema.
Sourcepub fn set_schema(&mut self, schema: ConfigSchema)
pub fn set_schema(&mut self, schema: ConfigSchema)
Replaces the schema used for validation and adaptation.
Sourcepub fn schema_mut(&mut self) -> &mut ConfigSchema
pub fn schema_mut(&mut self) -> &mut ConfigSchema
Returns mutable access to the active schema.
Sourcepub fn defaults_mut(&mut self) -> &mut ConfigLayer
pub fn defaults_mut(&mut self) -> &mut ConfigLayer
Returns mutable access to the built-in defaults layer.
Sourcepub fn file_mut(&mut self) -> &mut ConfigLayer
pub fn file_mut(&mut self) -> &mut ConfigLayer
Returns mutable access to the config file layer.
Sourcepub fn presentation_mut(&mut self) -> &mut ConfigLayer
pub fn presentation_mut(&mut self) -> &mut ConfigLayer
Returns mutable access to the presentation defaults layer.
Sourcepub fn secrets_mut(&mut self) -> &mut ConfigLayer
pub fn secrets_mut(&mut self) -> &mut ConfigLayer
Returns mutable access to the secrets layer.
Sourcepub fn env_mut(&mut self) -> &mut ConfigLayer
pub fn env_mut(&mut self) -> &mut ConfigLayer
Returns mutable access to the environment layer.
Sourcepub fn cli_mut(&mut self) -> &mut ConfigLayer
pub fn cli_mut(&mut self) -> &mut ConfigLayer
Returns mutable access to the CLI layer.
Sourcepub fn session_mut(&mut self) -> &mut ConfigLayer
pub fn session_mut(&mut self) -> &mut ConfigLayer
Returns mutable access to the session layer.
Sourcepub fn set_defaults(&mut self, layer: ConfigLayer)
pub fn set_defaults(&mut self, layer: ConfigLayer)
Replaces the built-in defaults layer.
Sourcepub fn set_file(&mut self, layer: ConfigLayer)
pub fn set_file(&mut self, layer: ConfigLayer)
Replaces the config file layer.
Sourcepub fn set_presentation(&mut self, layer: ConfigLayer)
pub fn set_presentation(&mut self, layer: ConfigLayer)
Replaces the presentation defaults layer.
Sourcepub fn set_secrets(&mut self, layer: ConfigLayer)
pub fn set_secrets(&mut self, layer: ConfigLayer)
Replaces the secrets layer.
Sourcepub fn set_env(&mut self, layer: ConfigLayer)
pub fn set_env(&mut self, layer: ConfigLayer)
Replaces the environment layer.
Sourcepub fn set_cli(&mut self, layer: ConfigLayer)
pub fn set_cli(&mut self, layer: ConfigLayer)
Replaces the CLI layer.
Sourcepub fn set_session(&mut self, layer: ConfigLayer)
pub fn set_session(&mut self, layer: ConfigLayer)
Replaces the session layer.
Sourcepub fn resolve(
&self,
options: ResolveOptions,
) -> Result<ResolvedConfig, ConfigError>
pub fn resolve( &self, options: ResolveOptions, ) -> Result<ResolvedConfig, ConfigError>
Resolves all configured layers into the final runtime config.
Source precedence still applies inside this API, so later layers like session or CLI overrides can replace lower-priority defaults.
§Examples
use osp_cli::config::{ConfigResolver, LoadedLayers, ResolveOptions};
let mut layers = LoadedLayers::default();
layers.defaults.set("profile.default", "default");
layers.defaults.set("theme.name", "plain");
layers.session.set("theme.name", "dracula");
let resolved = ConfigResolver::from_loaded_layers(layers)
.resolve(ResolveOptions::default())
.unwrap();
assert_eq!(resolved.get_string("theme.name"), Some("dracula"));Sourcepub fn explain_key(
&self,
key: &str,
options: ResolveOptions,
) -> Result<ConfigExplain, ConfigError>
pub fn explain_key( &self, key: &str, options: ResolveOptions, ) -> Result<ConfigExplain, ConfigError>
Explains how a runtime key was selected, interpolated, and adapted.
The explanation keeps the raw winning value as well as the final adapted value so callers can see where interpolation or type coercion changed the original input.
§Examples
use osp_cli::config::{ConfigResolver, LoadedLayers, ResolveOptions};
let mut layers = LoadedLayers::default();
layers.defaults.set("profile.default", "default");
layers.defaults.set("theme.name", "plain");
layers.cli.set("theme.name", "dracula");
let explain = ConfigResolver::from_loaded_layers(layers)
.explain_key("theme.name", ResolveOptions::default())
.unwrap();
assert_eq!(explain.key, "theme.name");
assert_eq!(
explain.final_entry.unwrap().value.reveal(),
&osp_cli::config::ConfigValue::String("dracula".to_string())
);Sourcepub fn explain_bootstrap_key(
&self,
key: &str,
options: ResolveOptions,
) -> Result<BootstrapConfigExplain, ConfigError>
pub fn explain_bootstrap_key( &self, key: &str, options: ResolveOptions, ) -> Result<BootstrapConfigExplain, ConfigError>
Explains bootstrap resolution for a bootstrap-only key.
Trait Implementations§
Source§impl Clone for ConfigResolver
impl Clone for ConfigResolver
Source§fn clone(&self) -> ConfigResolver
fn clone(&self) -> ConfigResolver
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ConfigResolver
impl Debug for ConfigResolver
Source§impl Default for ConfigResolver
impl Default for ConfigResolver
Source§fn default() -> ConfigResolver
fn default() -> ConfigResolver
Auto Trait Implementations§
impl Freeze for ConfigResolver
impl RefUnwindSafe for ConfigResolver
impl Send for ConfigResolver
impl Sync for ConfigResolver
impl Unpin for ConfigResolver
impl UnsafeUnpin for ConfigResolver
impl UnwindSafe for ConfigResolver
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more