pub struct Cached<T> { /* private fields */ }Expand description
A credential that expires and can be obtained again.
A Mutex rather than a lock-free cell: obtaining twice concurrently is
harmless but wasteful, and this sits on the once-per-refresh path rather
than the once-per-request one. The lock is held across obtaining, so N
threads arriving at an expired credential together produce one request
rather than N.
Implementations§
Source§impl<T> Cached<T>
impl<T> Cached<T>
Sourcepub const fn new() -> Self
pub const fn new() -> Self
An empty cache, refreshing within REFRESH_WITHIN of expiry.
Sourcepub const fn with_margin(margin: Duration) -> Self
pub const fn with_margin(margin: Duration) -> Self
An empty cache with a margin of its own.
For tests, which cannot wait a minute to watch a margin work.
Sourcepub fn invalidate(&self)
pub fn invalidate(&self)
Drops what is held, so the next get obtains.
The reactive door: a store that has just been told its credential is no longer accepted calls this and tries once more.
Source§impl<T: Clone> Cached<T>
impl<T: Clone> Cached<T>
Sourcepub fn get(
&self,
obtain: impl FnOnce(Option<&T>) -> Result<Issued<T>, Error>,
) -> Result<T, Error>
pub fn get( &self, obtain: impl FnOnce(Option<&T>) -> Result<Issued<T>, Error>, ) -> Result<T, Error>
The current credential, obtaining or refreshing it as needed.
obtain is handed the credential it is replacing, if there is one and
it has merely gone stale — which is what lets Vault renew a token
rather than log in again. It is None on the first call and after
invalidate, because there is then nothing to
extend.
obtain is a closure rather than a trait method so this module stays
free of HTTP: what it decides is when, not how.
§Errors
Whatever obtain reports. What was held survives a failed obtain: a
credential that is merely close to expiry still works, and throwing it
away because a refresh failed would turn a recoverable moment into an
outage.
Trait Implementations§
Auto Trait Implementations§
impl<T> !Freeze for Cached<T>
impl<T> RefUnwindSafe for Cached<T>
impl<T> Send for Cached<T>where
T: Send,
impl<T> Sync for Cached<T>where
T: Send,
impl<T> Unpin for Cached<T>where
T: Unpin,
impl<T> UnsafeUnpin for Cached<T>where
T: UnsafeUnpin,
impl<T> UnwindSafe for Cached<T>
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> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
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 bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
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>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
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 rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
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 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.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
Source§fn whenever(&self, value: Condition) -> Painted<&T>
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);