Skip to main content

LoadSpec

Struct LoadSpec 

Source
pub struct LoadSpec<'a> {
Show 17 fields pub key: &'a str, pub sources: &'a [Source<'a>], pub env_prefix: Option<&'a str>, pub search: Option<Search<'a>>, pub profile_env: Option<&'a str>, pub defaults: Option<&'a Layer>, pub remote: Option<&'a Remote>, pub secrets_dir: Option<&'a str>, pub env_files: &'a [&'a str], pub aliases: Option<&'a Aliases>, pub env_bindings: Option<&'a EnvBindings>, pub flags: Option<&'a Layer>, pub overrides: Option<&'a Layer>, pub nest: &'a str, pub allow_empty_env: bool, pub strict_env: bool, pub whole_document: bool,
}
Expand description

Everything the loader needs: which layers, which section, which env prefix.

Prefer new and the with_* methods over a struct literal, so that a later release can add a knob without breaking every call site.

Fields§

§key: &'a str

The configuration section this maps to, e.g. "db".

§sources: &'a [Source<'a>]

Layers, merged left to right. Later sources win.

§env_prefix: Option<&'a str>

Environment variable prefix, e.g. "APP_". Combined with key. None ignores the environment entirely.

§search: Option<Search<'a>>

Where to look for configuration files by name, if anywhere.

Discovered files are merged before sources, so an explicitly listed file still has the last word.

§profile_env: Option<&'a str>

Environment variable naming the active profile, e.g. "APP_ENV".

When it is set to production, every file gains a sibling layer: config.toml is followed by config.production.toml, discovered or listed alike. A variant that does not exist is skipped like any other missing file.

§defaults: Option<&'a Layer>

Values below the files: consulted only when nothing else supplies a key.

§remote: Option<&'a Remote>

A document fetched from a remote store: above the files, below the environment.

§secrets_dir: Option<&'a str>

A directory of single-value files — one file per key, the filename is the key, the contents are the value.

How Docker and Kubernetes mount secrets. Nesting is spelled in the filename with nest, so one setting governs this layer and the environment alike; a directory that is not there is skipped like a missing file.

§env_files: &'a [&'a str]

.env files, read as the environment layer rather than as documents.

Merged in order, just below the real environment: a variable somebody exported for this run should beat a file in the repository.

§aliases: Option<&'a Aliases>

Old key paths that still resolve, filling a gap rather than overriding.

§env_bindings: Option<&'a EnvBindings>

Fields bound to environment variables by name: just above the prefixed environment layer, because a binding is the more specific statement.

§flags: Option<&'a Layer>

Values from the command line: above the environment, below overrides.

§overrides: Option<&'a Layer>

Values above everything, including the environment.

§nest: &'a str

Separator that introduces nesting in an environment variable name.

Defaults to "__", so APP_DB_POOL__MAX_SIZE is pool.max_size. A single separator cannot mean both “word break” and “nesting”, so whatever this is set to, it has to be something a field name will not contain.

§allow_empty_env: bool

Whether FOO= counts as set-to-empty.

Defaults to false, which treats it as unset. An unset value rendered into a deployment template leaves exactly FOO=, and letting that blank out a perfectly good configured value is a bad afternoon. Turn it on when empty really is a value you need to be able to send.

§strict_env: bool

Rejects environment values from the yes/no/on/off family instead of letting them arrive as strings where a boolean was meant.

§whole_document: bool

Whether the documents this reads carry a section header at all.

false — the default — means every top-level key in a document is a section, which is what lets one file serve several configuration types and what key selects out of it.

true means the document is this section’s values — {"host": "0.0.0.0", "port": 8000}, with no server above it. The key still names the load: the environment prefix, the cache entry and what a diagnostic calls this configuration are all still built from it. It simply stops being looked for inside the document. See with_whole_document.

Implementations§

Source§

impl<'a> LoadSpec<'a>

Source

pub const fn new(key: &'a str, sources: &'a [Source<'a>]) -> Self

A spec that reads sources and selects key, ignoring the environment.

Looks for {name}.{ext} in each of paths, in order.

Every directory that has a match contributes one file, so the search order is the layering order. Discovered files sit below the explicit sources.

Source

pub const fn with_profile_env(self, variable: &'a str) -> Self

Layers a per-profile sibling over every file.

variable names the environment variable holding the profile, so the profile itself is resolved at load time rather than baked in.

Source

pub const fn with_defaults(self, layer: &'a Layer) -> Self

Values consulted only when no file and no variable supplies a key.

Source

pub const fn with_env_files(self, files: &'a [&'a str]) -> Self

.env files, merged just below the real environment.

Needs the dotenv feature; without it, a non-empty list is an error at load time naming the feature rather than a list silently ignored.

Source

pub const fn with_aliases(self, aliases: &'a Aliases) -> Self

Old key paths that still resolve.

Source

pub const fn with_env_bindings(self, bindings: &'a EnvBindings) -> Self

Fields bound to environment variables by name.

Source

pub const fn with_remote(self, remote: &'a Remote) -> Self

A remote store’s document, layered over the files.

Source

pub const fn with_secrets_dir(self, path: &'a str) -> Self

A directory of single-value files, layered just below the .env files and the environment.

One directory level: every regular file in it is one key, named by the file and valued by its contents with a single trailing newline removed. Subdirectories are not descended into — nesting is spelled in the filename with with_nest, which is what a Kubernetes mount produces anyway.

Source

pub const fn with_flags(self, layer: &'a Layer) -> Self

Values from the command line, layered over the environment.

Source

pub const fn with_overrides(self, layer: &'a Layer) -> Self

Values that win over the files, the environment and the flags alike.

Source

pub const fn with_env(self, prefix: &'a str) -> Self

Layers environment variables named {prefix}{KEY}_* over the files.

Source

pub const fn with_nest(self, separator: &'a str) -> Self

Uses separator instead of __ to introduce nesting.

Source

pub const fn with_empty_env(self, allow: bool) -> Self

Treats FOO= as set-to-empty rather than unset.

Source

pub const fn with_strict_env(self, strict: bool) -> Self

Rejects ambiguous environment spellings instead of guessing.

APP_DB_TLS=off reads like a boolean and arrives as the string "off" — silently correct into a String field, silently wrong everywhere else. Strict mode makes the yes/no/on/off family (and null/nil/none) an error naming the variable; write true, false, or the value you actually mean.

Source

pub const fn with_whole_document(self, whole: bool) -> Self

Reads each document as this section’s values, with no section header.

The default layout is one file, several sections: every top-level key names one, and key says which is yours. That is what lets a config.toml hold [db] and [server] for two configuration types that know nothing about each other.

A file that is only this configuration has no use for the header, and a file this crate did not write may not have one to begin with — a container image’s {"host": "0.0.0.0", "port": 8000}, a chart’s rendered values, a file some other tool owns. This says so.

Everything else is unchanged, and that is the point: the environment prefix is still {prefix}{KEY}_, profile variants (config.production.toml) still layer on top, defaults, flags, overrides, aliases, the secrets directory, the cache and every diagnostic all behave exactly as they do for a sectioned load. Only where a document’s values are found changes.

It applies to every document this spec reads — listed files, discovered files, inline text and the remote store’s document — because a load whose sources disagreed about their own shape would be a load nobody could reason about.

Trait Implementations§

Source§

impl<'a> Clone for LoadSpec<'a>

Source§

fn clone(&self) -> LoadSpec<'a>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'a> Copy for LoadSpec<'a>

Source§

impl Debug for LoadSpec<'_>

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a> !RefUnwindSafe for LoadSpec<'a>

§

impl<'a> !UnwindSafe for LoadSpec<'a>

§

impl<'a> Freeze for LoadSpec<'a>

§

impl<'a> Send for LoadSpec<'a>

§

impl<'a> Sync for LoadSpec<'a>

§

impl<'a> Unpin for LoadSpec<'a>

§

impl<'a> UnsafeUnpin for LoadSpec<'a>

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

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

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

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> Paint for T
where T: ?Sized,

Source§

fn fg(&self, value: Color) -> Painted<&T>

Returns a styled value derived from self with the foreground set to value.

This method should be used rarely. Instead, prefer to use color-specific builder methods like red() and green(), which have the same functionality but are pithier.

§Example

Set foreground color to white using fg():

use yansi::{Paint, Color};

painted.fg(Color::White);

Set foreground color to white using white().

use yansi::Paint;

painted.white();
Source§

fn primary(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Primary].

§Example
println!("{}", value.primary());
Source§

fn fixed(&self, color: u8) -> Painted<&T>

Returns self with the fg() set to [Color :: Fixed].

§Example
println!("{}", value.fixed(color));
Source§

fn rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the fg() set to [Color :: Rgb].

§Example
println!("{}", value.rgb(r, g, b));
Source§

fn black(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Black].

§Example
println!("{}", value.black());
Source§

fn red(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Red].

§Example
println!("{}", value.red());
Source§

fn green(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Green].

§Example
println!("{}", value.green());
Source§

fn yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Yellow].

§Example
println!("{}", value.yellow());
Source§

fn blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Blue].

§Example
println!("{}", value.blue());
Source§

fn magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Magenta].

§Example
println!("{}", value.magenta());
Source§

fn cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Cyan].

§Example
println!("{}", value.cyan());
Source§

fn white(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: White].

§Example
println!("{}", value.white());
Source§

fn bright_black(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightBlack].

§Example
println!("{}", value.bright_black());
Source§

fn bright_red(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightRed].

§Example
println!("{}", value.bright_red());
Source§

fn bright_green(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightGreen].

§Example
println!("{}", value.bright_green());
Source§

fn bright_yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightYellow].

§Example
println!("{}", value.bright_yellow());
Source§

fn bright_blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightBlue].

§Example
println!("{}", value.bright_blue());
Source§

fn bright_magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightMagenta].

§Example
println!("{}", value.bright_magenta());
Source§

fn bright_cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightCyan].

§Example
println!("{}", value.bright_cyan());
Source§

fn bright_white(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightWhite].

§Example
println!("{}", value.bright_white());
Source§

fn bg(&self, value: Color) -> Painted<&T>

Returns a styled value derived from self with the background set to value.

This method should be used rarely. Instead, prefer to use color-specific builder methods like on_red() and on_green(), which have the same functionality but are pithier.

§Example

Set background color to red using fg():

use yansi::{Paint, Color};

painted.bg(Color::Red);

Set background color to red using on_red().

use yansi::Paint;

painted.on_red();
Source§

fn on_primary(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Primary].

§Example
println!("{}", value.on_primary());
Source§

fn on_fixed(&self, color: u8) -> Painted<&T>

Returns self with the bg() set to [Color :: Fixed].

§Example
println!("{}", value.on_fixed(color));
Source§

fn on_rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the bg() set to [Color :: Rgb].

§Example
println!("{}", value.on_rgb(r, g, b));
Source§

fn on_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Black].

§Example
println!("{}", value.on_black());
Source§

fn on_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Red].

§Example
println!("{}", value.on_red());
Source§

fn on_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Green].

§Example
println!("{}", value.on_green());
Source§

fn on_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Yellow].

§Example
println!("{}", value.on_yellow());
Source§

fn on_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Blue].

§Example
println!("{}", value.on_blue());
Source§

fn on_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Magenta].

§Example
println!("{}", value.on_magenta());
Source§

fn on_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Cyan].

§Example
println!("{}", value.on_cyan());
Source§

fn on_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: White].

§Example
println!("{}", value.on_white());
Source§

fn on_bright_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightBlack].

§Example
println!("{}", value.on_bright_black());
Source§

fn on_bright_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightRed].

§Example
println!("{}", value.on_bright_red());
Source§

fn on_bright_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightGreen].

§Example
println!("{}", value.on_bright_green());
Source§

fn on_bright_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightYellow].

§Example
println!("{}", value.on_bright_yellow());
Source§

fn on_bright_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightBlue].

§Example
println!("{}", value.on_bright_blue());
Source§

fn on_bright_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightMagenta].

§Example
println!("{}", value.on_bright_magenta());
Source§

fn on_bright_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightCyan].

§Example
println!("{}", value.on_bright_cyan());
Source§

fn on_bright_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightWhite].

§Example
println!("{}", value.on_bright_white());
Source§

fn attr(&self, value: Attribute) -> Painted<&T>

Enables the styling Attribute value.

This method should be used rarely. Instead, prefer to use attribute-specific builder methods like bold() and underline(), which have the same functionality but are pithier.

§Example

Make text bold using attr():

use yansi::{Paint, Attribute};

painted.attr(Attribute::Bold);

Make text bold using using bold().

use yansi::Paint;

painted.bold();
Source§

fn bold(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Bold].

§Example
println!("{}", value.bold());
Source§

fn dim(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Dim].

§Example
println!("{}", value.dim());
Source§

fn italic(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Italic].

§Example
println!("{}", value.italic());
Source§

fn underline(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Underline].

§Example
println!("{}", value.underline());

Returns self with the attr() set to [Attribute :: Blink].

§Example
println!("{}", value.blink());

Returns self with the attr() set to [Attribute :: RapidBlink].

§Example
println!("{}", value.rapid_blink());
Source§

fn invert(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Invert].

§Example
println!("{}", value.invert());
Source§

fn conceal(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Conceal].

§Example
println!("{}", value.conceal());
Source§

fn strike(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Strike].

§Example
println!("{}", value.strike());
Source§

fn quirk(&self, value: Quirk) -> Painted<&T>

Enables the yansi Quirk value.

This method should be used rarely. Instead, prefer to use quirk-specific builder methods like mask() and wrap(), which have the same functionality but are pithier.

§Example

Enable wrapping using .quirk():

use yansi::{Paint, Quirk};

painted.quirk(Quirk::Wrap);

Enable wrapping using wrap().

use yansi::Paint;

painted.wrap();
Source§

fn mask(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Mask].

§Example
println!("{}", value.mask());
Source§

fn wrap(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Wrap].

§Example
println!("{}", value.wrap());
Source§

fn linger(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Linger].

§Example
println!("{}", value.linger());
Source§

fn clear(&self) -> Painted<&T>

👎Deprecated since 1.0.1:

renamed to resetting() due to conflicts with Vec::clear(). The clear() method will be removed in a future release.

Returns self with the quirk() set to [Quirk :: Clear].

§Example
println!("{}", value.clear());
Source§

fn resetting(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Resetting].

§Example
println!("{}", value.resetting());
Source§

fn bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Bright].

§Example
println!("{}", value.bright());
Source§

fn on_bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: OnBright].

§Example
println!("{}", value.on_bright());
Source§

fn whenever(&self, value: Condition) -> Painted<&T>

Conditionally enable styling based on whether the Condition value applies. Replaces any previous condition.

See the crate level docs for more details.

§Example

Enable styling painted only when both stdout and stderr are TTYs:

use yansi::{Paint, Condition};

painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);
Source§

fn new(self) -> Painted<Self>
where Self: Sized,

Create a new Painted with a default Style. Read more
Source§

fn paint<S>(&self, style: S) -> Painted<&Self>
where S: Into<Style>,

Apply a style wholesale to self. Any previous style is replaced. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

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

Source§

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

Source§

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.
Source§

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

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

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
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

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