pub struct Etcd { /* private fields */ }Expand description
A key in etcd, as a configuration source.
Implementations§
Source§impl Etcd
impl Etcd
Sourcepub async fn new<E, S>(
endpoints: E,
key: impl Into<String>,
) -> Result<Self, Error>
pub async fn new<E, S>( endpoints: E, key: impl Into<String>, ) -> Result<Self, Error>
Connects to endpoints and reads key.
The format is taken from the key’s extension — myapp/db.json is JSON.
A key without one needs with_format.
§Errors
If the endpoints cannot be parsed. Not if they are unreachable: the
client connects lazily, so that surfaces on the first
fetch.
Sourcepub async fn with_options<E, S>(
endpoints: E,
key: impl Into<String>,
options: ConnectOptions,
) -> Result<Self, Error>
pub async fn with_options<E, S>( endpoints: E, key: impl Into<String>, options: ConnectOptions, ) -> Result<Self, Error>
As new, with etcd’s own connection options.
This is where authentication and TLS live, because that is where
etcd-client puts them — there is no second vocabulary to learn, and
options this crate has never heard of keep working.
let etcd = Etcd::with_options(
["https://etcd.internal:2379"],
"myapp/db.json",
ConnectOptions::new()
.with_user("myapp", std::env::var("ETCD_PASSWORD").unwrap())
.with_keep_alive(
std::time::Duration::from_secs(30),
std::time::Duration::from_secs(5),
),
)
.await?;The credentials live in the client afterwards, which is what lets an expired auth token be replaced without rebuilding anything.
§Errors
As new.
Sourcepub fn from_client(client: Client, key: impl Into<String>) -> Self
pub fn from_client(client: Client, key: impl Into<String>) -> Self
Uses a client the program already has.
For a caller that already talks to etcd and would rather not open a
second connection to it. The client is Clone — cheaply, it is a
handle — so sharing one costs nothing.
let etcd = Etcd::from_client(client, "myapp/db.json");A shared client recovers from an expired auth token like any other: the credentials live in the client, so refreshing the token needs nothing this source would have to own.
Sourcepub fn with_format(self, format: Format) -> Self
pub fn with_format(self, format: Format) -> Self
States the format, for a key whose name does not.
Sourcepub async fn watch<F>(&self, on_change: F) -> Result<(), Error>
pub async fn watch<F>(&self, on_change: F) -> Result<(), Error>
Calls on_change every time the key’s value moves, forever.
The first call happens when the first change arrives, not at startup: a watch reports changes, and reporting the current value as one would make every restart look like an edit. Fetch first if the starting value matters, which it usually does:
sink.apply(etcd.fetch().await?)?;
etcd.watch(move |document| sink.apply(document)).awaitCancellation is dropping the future. There is no stop flag, because there is nothing to poll one between: this suspends on the stream, so any executor’s cancellation already ends it immediately.
A deletion is not a change this reports. The key holding no value is not a configuration, and calling back with the last one — or with nothing — would both be worse than leaving the running snapshot alone.
§Errors
If the watch cannot be established, if the connection fails or ends, if
etcd cancels the watch — compaction is the usual reason — or if
on_change returns an error, which ends the watch, so a caller that
wants to survive a bad document should log it and return Ok.
This never returns Ok: a watch either runs or has failed, and a silent
success would leave a spawned task finished and a configuration frozen
with nothing said about either. Callers that want to reconnect should
loop around it.
Trait Implementations§
Source§impl AsyncRemoteSource for Etcd
impl AsyncRemoteSource for Etcd
Auto Trait Implementations§
impl !Freeze for Etcd
impl !RefUnwindSafe for Etcd
impl !UnwindSafe for Etcd
impl Send for Etcd
impl Sync for Etcd
impl Unpin for Etcd
impl UnsafeUnpin for Etcd
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> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::RequestSource§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);