Struct smart_config::fallback::Manual
source · pub struct Manual { /* private fields */ }
Expand description
Custom fallback value provider.
§Use cases
This provider is useful when configuration parameter deserialization logic is hard to express using conventional methods, such as:
- Composite configuration parameters that rely on several environment variables.
In this case, you can use the getter closure to access variables via
Env
and combine them into a single value. - Configuration values that need additional validation to make the configuration object
correct by construction. For example, if your config has an optional field, which should
be
None
either if it’s absent or set to the"unset"
value, you can first get it viaEnv
, and then only provide value if it’s not equal to"unset"
. You can think of it as afilter
ormap
function in this case.
§Examples
use smart_config::{
fallback, testing, value::{ValueOrigin, WithOrigin},
DescribeConfig, DeserializeConfig,
};
// Value source combining two env variables. It usually makes sense to split off
// the definition like this so that it's more readable.
const COMBINED_VARS: &'static dyn fallback::FallbackSource =
&fallback::Manual::new("$TEST_ENV - $TEST_NETWORK", || {
let env = fallback::Env("TEST_ENV").get_raw()?;
let network = fallback::Env("TEST_NETWORK").get_raw()?;
let origin = Arc::new(ValueOrigin::EnvVars);
Some(WithOrigin::new(format!("{env} - {network}").into(), origin))
});
#[derive(DescribeConfig, DeserializeConfig)]
struct TestConfig {
#[config(default_t = "app".into(), fallback = COMBINED_VARS)]
app: String,
}
let config: TestConfig = testing::Tester::default()
.set_env("TEST_ENV", "stage")
.set_env("TEST_NETWORK", "goerli")
.test(smart_config::config!())?;
assert_eq!(config.app, "stage - goerli");
Implementations§
Trait Implementations§
source§impl FallbackSource for Manual
impl FallbackSource for Manual
source§fn provide_value(&self) -> Option<WithOrigin>
fn provide_value(&self) -> Option<WithOrigin>
Potentially provides a value for the param. Read more
Auto Trait Implementations§
impl Freeze for Manual
impl RefUnwindSafe for Manual
impl Send for Manual
impl Sync for Manual
impl Unpin for Manual
impl UnwindSafe for Manual
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
Mutably borrows from an owned value. Read more