Struct aws_smithy_types::config_bag::ConfigBag

source ·
pub struct ConfigBag { /* private fields */ }
Expand description

Layered configuration structure

See the module docs for more documentation.

Implementations§

source§

impl ConfigBag

source

pub fn base() -> Self

Create a new config bag “base”.

source

pub fn of_layers(layers: impl IntoIterator<Item = Layer>) -> Self

Create a ConfigBag consisting of the given layers.

source

pub fn push_layer(&mut self, layer: Layer) -> &mut Self

Add the given layer to the config bag.

source

pub fn push_shared_layer(&mut self, layer: FrozenLayer) -> &mut Self

Add a frozen/shared layer to the config bag.

source

pub fn interceptor_state(&mut self) -> &mut Layer

Return a mutable reference to the interceptor state.

source

pub fn load<T: Storable>(&self) -> <T::Storer as Store>::ReturnedType<'_>

Load a value (or values) of type T depending on how T implements Storable

source

pub fn get_mut_from_interceptor_state<T>(&mut self) -> Option<&mut T>
where T: Storable<Storer = StoreReplace<T>> + Send + Sync + Debug + 'static,

Return a mutable reference to T if found within the interceptor state.

This method does not search the tail of the config bag (i.e., the collection of frozen layers).

If the caller is unsure whether T exists in the interceptor state, consider using Self::get_mut instead, which requires T to implement Clone, however.

source

pub fn get_mut<T>(&mut self) -> Option<&mut T>
where T: Storable<Storer = StoreReplace<T>> + Send + Sync + Debug + Clone + 'static,

Return a mutable reference to T if found within the config bag

This method requires T to implement Clone because, if the requested item is found in the tail of the config bag, it will be cloned and moved to the head (i.e., the interceptor state).

If the caller is certain that T already exists in the interceptor state, consider using Self::get_mut_from_interceptor_state instead, which does not require T to be Clone.

source

pub fn get_mut_or_default<T>(&mut self) -> &mut T
where T: Storable<Storer = StoreReplace<T>> + Send + Sync + Debug + Clone + Default + 'static,

Returns a mutable reference to T if it is stored in the top layer of the bag

  • If T is in a deeper layer of the bag, that value will be cloned and inserted into the top layer
  • If T is not present in the bag, the Default implementation will be used.
source

pub fn get_mut_or_else<T>(&mut self, default: impl Fn() -> T) -> &mut T
where T: Storable<Storer = StoreReplace<T>> + Send + Sync + Debug + Clone + 'static,

Returns a mutable reference to T if it is stored in the top layer of the bag

  • If T is in a deeper layer of the bag, that value will be cloned and inserted into the top layer
  • If T is not present in the bag, default will be used to construct a new value
source

pub fn with_fn( self, name: impl Into<Cow<'static, str>>, next: impl Fn(&mut Layer), ) -> ConfigBag

Add another layer to this configuration bag

Hint: If you want to re-use this layer, call freeze first.

§Examples
use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace};

#[derive(Debug, Eq, PartialEq)]
struct ExampleStr(&'static str);
impl Storable for ExampleStr {
    type Storer = StoreReplace<Self>;
}

#[derive(Debug, Eq, PartialEq)]
struct ExampleInt(i32);
impl Storable for ExampleInt {
    type Storer = StoreReplace<Self>;
}

let mut bag = ConfigBag::base();
bag = bag.with_fn("first", |layer: &mut Layer| { layer.store_put(ExampleStr("a")); });

// We can now load the example string out
assert_eq!(bag.load::<ExampleStr>(), Some(&ExampleStr("a")));

// But there isn't a number stored in the bag yet
assert_eq!(bag.load::<ExampleInt>(), None);

// Add a layer with an example int
bag = bag.with_fn("second", |layer: &mut Layer| { layer.store_put(ExampleInt(1)); });

// Now the example int can be retrieved
assert_eq!(bag.load::<ExampleInt>(), Some(&ExampleInt(1)));
source

pub fn add_layer(self, name: impl Into<Cow<'static, str>>) -> ConfigBag

Add a new layer with name after freezing the top layer so far

source

pub fn sourced_get<T: Store>(&self) -> T::ReturnedType<'_>

Return a value (or values) of type T depending on how it has been stored in a ConfigBag

It flexibly chooses to return a single value vs. an iterator of values depending on how T implements a Store trait.

Trait Implementations§

source§

impl Debug for ConfigBag

source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

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> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 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<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