Skip to main content

Dynamic

Struct Dynamic 

Source
pub struct Dynamic<T> { /* private fields */ }
Expand description

A configuration owned by a value rather than a type.

Construct one from a Builder carrying the sources; everything the type-level surface does through generated statics happens here through the instance’s own storage. Two instances of the same T are fully independent: separate snapshots, separate reload hooks, separate watchers, separate caches if configured.

Cloning is deliberately absent: a Dynamic is an owner — share one behind an Arc when several places read it, which is also what keeps “who stops the watcher” a question with one answer.

Implementations§

Source§

impl<T: DeserializeOwned + Send + Sync + 'static> Dynamic<T>

Source

pub fn new(builder: Builder<T>) -> Self

Wraps builder around storage this instance owns.

The builder’s sources, cache and validation hook all apply unchanged; an installer the builder already carried (a generated builder()’s static cell) is replaced by this instance’s own.

Source

pub fn init(&self) -> Result<(), Error>

Loads and installs as this instance’s snapshot.

The same lifecycle as a type’s init(): validation runs before anything installs, a configured cache is written after a clean load and recovered from when the sources will not load.

§Errors

Whatever the load reports: a file that will not parse, a missing required value, a validation refusal with no cache to fall back on.

Source

pub fn init_and_current(&self) -> Result<Arc<T>, Error>

init, handing back the snapshot it installed.

Worth more here than on the type-level surface: an instance’s current is an Option — nothing can panic with a type’s name in it — so the split form ends in an expect that this removes. What comes back is this call’s snapshot, not whatever a reload made current a moment later.

§Errors

Exactly init’s.

Source

pub fn current(&self) -> Option<Arc<T>>

The installed snapshot, if init has succeeded.

One atomic load, no lock — cheap enough per request, but take it once per request and reuse the Arc, or a reload landing mid-request shows one request two configurations. None before the first successful install: an instance has no place to panic with the type’s name in it, so absence is an answer rather than an accident.

Source

pub fn generation(&self) -> u64

Installs since this instance was created; zero before the first.

Monotonic, and the number a reload hook should read when it needs a total order — on_reload does not define one across overlapping reloads.

Source

pub fn meta(&self) -> Option<SnapshotMeta>

What is true of the installed snapshot, or None before the first.

For operators — which generation is live, how long ago it landed — and deliberately off the read path: current does not consult it, so the value and its metadata are two loads that a reload landing between them leaves one install apart. See SnapshotMeta.

Source

pub fn load(&self) -> Result<T, Error>

Reads the sources and deserializes, installing nothing.

§Errors

The same failures as init.

Source

pub fn reload(&self) -> Result<(), Error>

One reload: load, validate, install, rewrite the cache.

A failure installs nothing — the previous snapshot keeps serving.

§Errors

The same failures as load.

Source

pub fn on_reload(&self, hook: impl Fn(&Arc<T>, &Arc<T>) + Send + Sync + 'static)

Runs hook after every later install, for the instance’s lifetime.

The same contract as the type-level on_reload: called with the outgoing and incoming snapshots, on whichever thread performed the reload — compare, then signal the subsystem that owns the resource.

§Concurrent reloads

Each call sees a consistent (previous, current) pair: both were installed, and current was installed after previous.

The order of calls is not defined when two reloads overlap. Two hooks may observe the same pair, and one hook may see (A, B) after another saw (B, C). A hook that needs a total order should read generation — which is monotonic — rather than infer one from its arguments.

Reloads are not serialised against each other on purpose: a lock held across user callbacks would let one slow hook delay every reader, and a hook that blocked would then block reloads.

Source

pub fn on_reload_scoped( &self, hook: impl Fn(&Arc<T>, &Arc<T>) + Send + Sync + 'static, ) -> HookGuard<T>

on_reload, until the returned guard drops.

The same concurrency contract: a consistent pair every call, in no defined order across overlapping reloads.

Source

pub fn on_reload_with( &self, hook: impl Fn(&ReloadEvent<T>) + Send + Sync + 'static, )

on_reload, told why.

The callback receives a ReloadEvent: both snapshots, the ReloadReason, and the install’s SnapshotMeta. Same list, same registration order, same panic isolation as the pair form — and it fires for the first install too, with previous: None, which the pair form has nowhere to say.

Source

pub fn on_reload_with_scoped( &self, hook: impl Fn(&ReloadEvent<T>) + Send + Sync + 'static, ) -> HookGuard<T>

on_reload_with, until the returned guard drops.

Source

pub fn status(&self) -> ConfigStatus

What is true of this instance right now: generation, when it landed, why, and how the reloads since have gone.

A handful of atomic loads and no I/O — no source is re-read — so an exporter can call it per scrape. See ConfigStatus for what it carries and, as deliberately, what it does not.

Source

pub fn builder(&self) -> &Builder<T>

This instance’s builder, for the diagnostics that answer without installing: source_of, is_set, check, explain, snapshot.

The instance does not re-wrap them — the builder’s answers are the instance’s answers, because the builder is where its sources live.

Source

pub fn key(&self) -> &str

The section key this instance reads.

Source§

impl<T: DeserializeOwned + Send + Sync + 'static> Dynamic<T>

Source

pub fn watch(&self, debounce: Duration) -> Result<WatchHandle>

Available on crate feature watch only.

Reloads on file changes until the returned handle is dropped.

The same watcher as everything else — same debounce, same directory-level watches — registered under this instance rather than the type: two instances of one T watch side by side, and a second watch on the same instance is AlreadyExists, exactly the one-watcher-per-owner contract the type-level surface has.

§Errors

As the builder’s watch: no watchable directory, a backend that cannot start, or this instance already being watched.

Source

pub fn watch_with( &self, debounce: Duration, mode: WatchMode, ) -> Result<WatchHandle>

Available on crate feature watch only.

watch with the detection strategy chosen explicitly — polling is what network and overlay filesystems need.

§Errors

As watch.

Source§

impl<T: DeserializeOwned + Send + Sync + 'static> Dynamic<T>

Source

pub fn changes(&self) -> Changes<T>

Available on crate feature async only.

A handle woken by every later install of this instance.

The same contract as the type-level changes(): the snapshot current at this call counts as already seen, and a handle taken before init sees the first install as its first change — “wake me when configuration exists”. The handle keeps the instance’s storage alive, so it outliving the Dynamic is safe rather than subtle.

Source

pub async fn load_async(&self) -> Result<T, Error>

Available on crate feature async only.

load, off the async executor.

§Errors

The same failures as load.

Source

pub async fn init_async(&self) -> Result<(), Error>

Available on crate feature async only.

init, off the async executor.

§Errors

The same failures as init.

Source

pub async fn init_and_current_async(&self) -> Result<Arc<T>, Error>

Available on crate feature async only.

init_and_current, off the async executor.

§Errors

The same failures as init.

Trait Implementations§

Source§

impl<T> Debug for Dynamic<T>

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<T> !Freeze for Dynamic<T>

§

impl<T> !RefUnwindSafe for Dynamic<T>

§

impl<T> !UnwindSafe for Dynamic<T>

§

impl<T> Send for Dynamic<T>
where T: Sync + Send,

§

impl<T> Sync for Dynamic<T>
where T: Sync + Send,

§

impl<T> Unpin for Dynamic<T>

§

impl<T> UnsafeUnpin for Dynamic<T>

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