pub struct Metadata {
pub name: Cow<'static, str>,
pub source: Option<Source>,
pub provide_location: Option<&'static Location<'static>>,
/* private fields */
}Expand description
Metadata about a configuration value: its source’s name and location.
§Overview
Every Value produced by a Figment is Taged with Metadata
by its producing Provider. The metadata consists of:
- A name for the source, e.g. “TOML File”.
- The
Sourceitself, if it is known. - A default or custom interpolater.
- A source
Locationwhere a value’s provider was added to the containing figment, if it is known.
This information is used to produce insightful error messages as well as to
generate values like RelativePathBuf that know about their configuration
source.
§Errors
Errors produced by Figments contain the Metadata for the value
that caused the error. The Display implementation for Error uses the
metadata’s interpolater to display the path to the key for the value that
caused the error.
§Interpolation
Interpolation takes a figment profile and key path (a.b.c) and turns it
into a source-native path. The default interpolater returns a figment key
path prefixed with the profile if the profile is custom:
${profile}.${a}.${b}.${c}Providers are free to implement any interpolater for their metadata. For
example, the interpolater for Env uppercases each path key:
use figment::Metadata;
let metadata = Metadata::named("environment variable(s)")
.interpolater(|profile, path| {
let keys: Vec<_> = path.iter()
.map(|k| k.to_ascii_uppercase())
.collect();
format!("{}", keys.join("."))
});
let profile = figment::Profile::Default;
let interpolated = metadata.interpolate(&profile, &["key", "path"]);
assert_eq!(interpolated, "KEY.PATH");Fields§
§name: Cow<'static, str>The name of the configuration source for a given value.
source: Option<Source>The source of the configuration value, if it is known.
provide_location: Option<&'static Location<'static>>The source location where this value’s provider was added to the containing figment, if it is known.
Implementations§
Source§impl Metadata
impl Metadata
Sourcepub fn from<N, S>(name: N, source: S) -> Self
pub fn from<N, S>(name: N, source: S) -> Self
Creates a new Metadata with the given name and source.
§Example
use figment::Metadata;
let metadata = Metadata::from("AWS Config Store", "path/to/value");
assert_eq!(metadata.name, "AWS Config Store");
assert_eq!(metadata.source.unwrap().custom(), Some("path/to/value"));Sourcepub fn named<T: Into<Cow<'static, str>>>(name: T) -> Self
pub fn named<T: Into<Cow<'static, str>>>(name: T) -> Self
Creates a new Metadata with the given name and no source.
§Example
use figment::Metadata;
let metadata = Metadata::named("AWS Config Store");
assert_eq!(metadata.name, "AWS Config Store");
assert!(metadata.source.is_none());Sourcepub fn source<S: Into<Source>>(self, source: S) -> Self
pub fn source<S: Into<Source>>(self, source: S) -> Self
Sets the source of self to Some(source).
§Example
use figment::Metadata;
let metadata = Metadata::named("AWS Config Store").source("config/path");
assert_eq!(metadata.name, "AWS Config Store");
assert_eq!(metadata.source.unwrap().custom(), Some("config/path"));Sourcepub fn interpolater<I>(self, f: I) -> Self
pub fn interpolater<I>(self, f: I) -> Self
Sets the interpolater of self to the function f. The interpolater
can be invoked via Metadata::interpolate().
§Example
use figment::Metadata;
let metadata = Metadata::named("environment variable(s)")
.interpolater(|profile, path| {
let keys: Vec<_> = path.iter()
.map(|k| k.to_ascii_uppercase())
.collect();
format!("{}", keys.join("."))
});
let profile = figment::Profile::Default;
let interpolated = metadata.interpolate(&profile, &["key", "path"]);
assert_eq!(interpolated, "KEY.PATH");Sourcepub fn interpolate<K: AsRef<str>>(
&self,
profile: &Profile,
keys: &[K],
) -> String
pub fn interpolate<K: AsRef<str>>( &self, profile: &Profile, keys: &[K], ) -> String
Runs the interpolater in self on profile and keys.
§Example
use figment::{Metadata, Profile};
let url = "ftp://config.dev";
let md = Metadata::named("Network").source(url)
.interpolater(move |profile, keys| match profile.is_custom() {
true => format!("{}/{}/{}", url, profile, keys.join("/")),
false => format!("{}/{}", url, keys.join("/")),
});
let interpolated = md.interpolate(&Profile::Default, &["key", "path"]);
assert_eq!(interpolated, "ftp://config.dev/key/path");
let profile = Profile::new("static");
let interpolated = md.interpolate(&profile, &["key", "path"]);
assert_eq!(interpolated, "ftp://config.dev/static/key/path");Trait Implementations§
Auto Trait Implementations§
impl Freeze for Metadata
impl !RefUnwindSafe for Metadata
impl Send for Metadata
impl Sync for Metadata
impl Unpin for Metadata
impl !UnwindSafe for Metadata
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> 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<T> Pointable for T
impl<T> Pointable for T
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 80 bytes