Struct scsys_core::ConfigBuilder
source · pub struct ConfigBuilder<St>where
St: BuilderState,{ /* private fields */ }Expand description
A configuration builder
It registers ordered sources of configuration to later build consistent Config from them.
Configuration sources it defines are defaults, Sources and overrides.
Defaults are always loaded first and can be overwritten by any of two other sources.
Overrides are always loaded last, thus cannot be overridden.
Both can be only set explicitly key by key in code
using set_default or set_override.
An intermediate category, Source, set groups of keys at once implicitly using data coming from external sources
like files, environment variables or others that one implements. Defining a Source is as simple as implementing
a trait for a struct.
Adding sources, setting defaults and overrides does not invoke any I/O nor builds a config.
It happens on demand when build (or its alternative) is called.
Therefore all errors, related to any of the Source will only show up then.
Sync and async builder
ConfigBuilder uses type parameter to keep track of builder state.
In DefaultState builder only supports Sources
In AsyncState it supports both Sources and AsyncSources at the price of building using async fn.
Examples
let mut builder = Config::builder()
.set_default("default", "1")?
.add_source(File::new("config/settings", FileFormat::Json))
// .add_async_source(...)
.set_override("override", "1")?;
match builder.build() {
Ok(config) => {
// use your config
},
Err(e) => {
// something went wrong
}
}If any AsyncSource is used, the builder will transition to AsyncState.
In such case, it is required to await calls to build and its non-consuming sibling.
Calls can be not chained as well
let mut builder = Config::builder();
builder = builder.set_default("default", "1")?;
builder = builder.add_source(File::new("config/settings", FileFormat::Json));
builder = builder.add_source(File::new("config/settings.prod", FileFormat::Json));
builder = builder.set_override("override", "1")?;Calling Config::builder yields builder in the default state.
If having an asynchronous state as the initial state is desired, turbofish notation needs to be used.
let mut builder = ConfigBuilder::<AsyncState>::default();If for some reason acquiring builder in default state is required without calling Config::builder
it can also be achieved.
let mut builder = ConfigBuilder::<DefaultState>::default();Implementations§
source§impl<St> ConfigBuilder<St>where
St: BuilderState,
impl<St> ConfigBuilder<St>where St: BuilderState,
sourcepub fn set_default<S, T>(
self,
key: S,
value: T
) -> Result<ConfigBuilder<St>, ConfigError>where
S: AsRef<str>,
T: Into<Value>,
pub fn set_default<S, T>( self, key: S, value: T ) -> Result<ConfigBuilder<St>, ConfigError>where S: AsRef<str>, T: Into<Value>,
Set a default value at key
This value can be overwritten by any Source, AsyncSource or override.
Errors
Fails if Expression::from_str(key) fails.
sourcepub fn set_override<S, T>(
self,
key: S,
value: T
) -> Result<ConfigBuilder<St>, ConfigError>where
S: AsRef<str>,
T: Into<Value>,
pub fn set_override<S, T>( self, key: S, value: T ) -> Result<ConfigBuilder<St>, ConfigError>where S: AsRef<str>, T: Into<Value>,
Set an override
This function sets an overwrite value. It will not be altered by any default, Source nor AsyncSource
Errors
Fails if Expression::from_str(key) fails.
sourcepub fn set_override_option<S, T>(
self,
key: S,
value: Option<T>
) -> Result<ConfigBuilder<St>, ConfigError>where
S: AsRef<str>,
T: Into<Value>,
pub fn set_override_option<S, T>( self, key: S, value: Option<T> ) -> Result<ConfigBuilder<St>, ConfigError>where S: AsRef<str>, T: Into<Value>,
Sets an override if value is Some(_)
This function sets an overwrite value if Some(_) is passed. If None is passed, this function does nothing.
It will not be altered by any default, Source nor AsyncSource
Errors
Fails if Expression::from_str(key) fails.
source§impl ConfigBuilder<DefaultState>
impl ConfigBuilder<DefaultState>
sourcepub fn add_source<T>(self, source: T) -> ConfigBuilder<DefaultState>where
T: Source + Send + Sync + 'static,
pub fn add_source<T>(self, source: T) -> ConfigBuilder<DefaultState>where T: Source + Send + Sync + 'static,
sourcepub fn add_async_source<T>(self, source: T) -> ConfigBuilder<AsyncState>where
T: AsyncSource + Send + Sync + 'static,
pub fn add_async_source<T>(self, source: T) -> ConfigBuilder<AsyncState>where T: AsyncSource + Send + Sync + 'static,
Registers new AsyncSource in this builder and forces transition to AsyncState.
Calling this method does not invoke any I/O. AsyncSource is only saved in internal register for later use.
sourcepub fn build(self) -> Result<Config, ConfigError>
pub fn build(self) -> Result<Config, ConfigError>
Reads all registered Sources.
This is the method that invokes all I/O operations.
For a non consuming alternative see build_cloned
Errors
If source collection fails, be it technical reasons or related to inability to read data as Config for different reasons,
this method returns error.
sourcepub fn build_cloned(&self) -> Result<Config, ConfigError>
pub fn build_cloned(&self) -> Result<Config, ConfigError>
Reads all registered Sources.
Similar to build, but it does not take ownership of ConfigBuilder to allow later reuse.
Internally it clones data to achieve it.
Errors
If source collection fails, be it technical reasons or related to inability to read data as Config for different reasons,
this method returns error.
source§impl ConfigBuilder<AsyncState>
impl ConfigBuilder<AsyncState>
sourcepub fn add_source<T>(self, source: T) -> ConfigBuilder<AsyncState>where
T: Source + Send + Sync + 'static,
pub fn add_source<T>(self, source: T) -> ConfigBuilder<AsyncState>where T: Source + Send + Sync + 'static,
sourcepub fn add_async_source<T>(self, source: T) -> ConfigBuilder<AsyncState>where
T: AsyncSource + Send + Sync + 'static,
pub fn add_async_source<T>(self, source: T) -> ConfigBuilder<AsyncState>where T: AsyncSource + Send + Sync + 'static,
Registers new AsyncSource in this builder.
Calling this method does not invoke any I/O. AsyncSource is only saved in internal register for later use.
sourcepub async fn build(self) -> impl Future<Output = Result<Config, ConfigError>>
pub async fn build(self) -> impl Future<Output = Result<Config, ConfigError>>
Reads all registered defaults, Sources, AsyncSources and overrides.
This is the method that invokes all I/O operations.
For a non consuming alternative see build_cloned
Errors
If source collection fails, be it technical reasons or related to inability to read data as Config for different reasons,
this method returns error.
sourcepub async fn build_cloned(
&self
) -> impl Future<Output = Result<Config, ConfigError>>
pub async fn build_cloned( &self ) -> impl Future<Output = Result<Config, ConfigError>>
Reads all registered defaults, Sources, AsyncSources and overrides.
Similar to build, but it does not take ownership of ConfigBuilder to allow later reuse.
Internally it clones data to achieve it.
Errors
If source collection fails, be it technical reasons or related to inability to read data as Config for different reasons,
this method returns error.
Trait Implementations§
source§impl<St> Clone for ConfigBuilder<St>where
St: Clone + BuilderState,
impl<St> Clone for ConfigBuilder<St>where St: Clone + BuilderState,
source§fn clone(&self) -> ConfigBuilder<St>
fn clone(&self) -> ConfigBuilder<St>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moresource§impl<St> Debug for ConfigBuilder<St>where
St: Debug + BuilderState,
impl<St> Debug for ConfigBuilder<St>where St: Debug + BuilderState,
source§impl<St> Default for ConfigBuilder<St>where
St: Default + BuilderState,
impl<St> Default for ConfigBuilder<St>where St: Default + BuilderState,
source§fn default() -> ConfigBuilder<St>
fn default() -> ConfigBuilder<St>
Auto Trait Implementations§
impl<St> RefUnwindSafe for ConfigBuilder<St>where St: RefUnwindSafe,
impl<St> Send for ConfigBuilder<St>where St: Send,
impl<St> Sync for ConfigBuilder<St>where St: Sync,
impl<St> Unpin for ConfigBuilder<St>where St: Unpin,
impl<St> UnwindSafe for ConfigBuilder<St>where St: UnwindSafe,
Blanket Implementations§
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where &'a Self: for<'a> IntoIterator,
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere Self: Borrow<B>, B: 'a + ?Sized, R: 'a,
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> Rwhere Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere Self: AsRef<U>, U: 'a + ?Sized, R: 'a,
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere Self: AsMut<U>, U: 'a + ?Sized, R: 'a,
self, then passes self.as_mut() into the pipe
function.§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere Self: Deref<Target = T>, T: ?Sized,
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere Self: DerefMut<Target = T> + Deref, T: ?Sized,
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,
.tap_ref_mut() only in debug builds, and is erased in release
builds.