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 via Env, and then only provide value if it’s not equal to "unset". You can think of it as a filter or map 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§

source§

impl Manual

source

pub const fn new( description: &'static str, getter: fn() -> Option<WithOrigin>, ) -> Self

Creates a provider with the specified human-readable description and a getter function.

Trait Implementations§

source§

impl Debug for Manual

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Manual

source§

fn fmt(&self, formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl FallbackSource for Manual

source§

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> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToString for T
where T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more