Struct rocket_db_pools::figment::Figment
pub struct Figment { /* private fields */ }
Expand description
Combiner of Provider
s for configuration value extraction.
Overview
A Figment
combines providers by merging or joining their provided data.
The combined value or a subset of the combined value can be extracted into
any type that implements Deserialize
. Additionally, values can be nested
in profiles, and a profile can be selected via Figment::select()
for
extraction; the profile to be extracted can be retrieved with
Figment::profile()
and defaults to Profile::Default
. The top-level
docs contain a broad overview of these topics.
Conflict Resolution
Conflicts arising from two providers providing values for the same key are
resolved via one of four strategies: join
, adjoin
, merge
, and
admerge
. In general, join
and adjoin
prefer existing values while
merge
and admerge
prefer later values. The ad-
strategies additionally
concatenate conflicting arrays whereas the non-ad-
strategies treat arrays
as non-composite values.
The table below summarizes these strategies and their behavior, with the column label referring to the type of the value pointed to by the conflicting keys:
Strategy | Dictionaries | Arrays | All Others |
---|---|---|---|
join | Union, Recurse | Keep Existing | Keep Existing |
adjoin | Union, Recurse | Concatenate | Keep Existing |
merge | Union, Recurse | Use Incoming | Use Incoming |
admerge | Union, Recurse | Concatenate | Use Incoming |
Description
If both keys point to a dictionary, the dictionaries are always unioned, irrespective of the strategy, and conflict resolution proceeds recursively with each key in the union.
If both keys point to an array:
join
uses the existing valuemerge
uses the incoming valueadjoin
andadmerge
concatenate the arrays
If both keys point to a non-composite (String
, Num
, etc.) or values
of different kinds (i.e, array and num):
join
andadjoin
use the existing valuemerge
andadmerge
use the incoming value
For examples, refer to each strategy’s documentation.
Extraction
The configuration or a subset thereof can be extracted from a Figment
in
one of several ways:
Figment::extract()
, which extracts the complete value into anyT: Deserialize
.Figment::extract_inner()
, which extracts a subset of the value for a given key path.Figment::find_value()
, which returns the raw, serializedValue
for a given key path.
A “key path” is a string of the form a.b.c
(e.g, item
, item.fruits
,
etc.) where each component delimited by a .
is a key for the dictionary of
the preceding key in the path, or the root dictionary if it is the first key
in the path. See Value::find()
for examples.
Metadata
Every value collected by a Figment
is accompanied by the metadata produced
by the value’s provider. Additionally, Metadata::provide_location
is set
by from
, merge
and join
to the caller’s location. Metadata
can be
retrieved in one of several ways:
Figment::metadata()
, which returns an iterator over all of the metadata for all values.Figment::find_metadata()
, which returns the metadata for a value at a given key path.Figment::get_metadata()
, which returns the metadata for a givenTag
, itself retrieved viaTagged
orValue::tag()
.
Implementations§
§impl Figment
impl Figment
pub fn new() -> Figment
pub fn new() -> Figment
Creates a new Figment
with the default profile selected and no
providers.
use figment::Figment;
let figment = Figment::new();
assert_eq!(figment.metadata().count(), 0);
pub fn from<T>(provider: T) -> Figmentwhere
T: Provider,
pub fn from<T>(provider: T) -> Figmentwhere T: Provider,
Creates a new Figment
with the default profile selected and an initial
provider
.
use figment::Figment;
use figment::providers::Env;
let figment = Figment::from(Env::raw());
assert_eq!(figment.metadata().count(), 1);
pub fn join<T>(self, provider: T) -> Figmentwhere
T: Provider,
pub fn join<T>(self, provider: T) -> Figmentwhere T: Provider,
Joins provider
into the current figment.
See conflict resolution for details.
use figment::Figment;
use figment::util::map;
use figment::value::{Dict, Map};
let figment = Figment::new()
.join(("string", "original"))
.join(("vec", vec!["item 1"]))
.join(("map", map!["string" => "inner original"]));
let new_figment = Figment::new()
.join(("string", "replaced"))
.join(("vec", vec!["item 2"]))
.join(("map", map!["string" => "inner replaced", "new" => "value"]))
.join(("new", "value"));
let figment = figment.join(new_figment); // **join**
let string: String = figment.extract_inner("string").unwrap();
assert_eq!(string, "original"); // existing value retained
let vec: Vec<String> = figment.extract_inner("vec").unwrap();
assert_eq!(vec, vec!["item 1"]); // existing value retained
let map: Map<String, String> = figment.extract_inner("map").unwrap();
assert_eq!(map, map! {
"string".into() => "inner original".into(), // existing value retained
"new".into() => "value".into(), // new key added
});
let new: String = figment.extract_inner("new").unwrap();
assert_eq!(new, "value"); // new key added
pub fn adjoin<T>(self, provider: T) -> Figmentwhere
T: Provider,
pub fn adjoin<T>(self, provider: T) -> Figmentwhere T: Provider,
Joins provider
into the current figment while concatenating vectors.
See conflict resolution for details.
use figment::Figment;
use figment::util::map;
use figment::value::{Dict, Map};
let figment = Figment::new()
.join(("string", "original"))
.join(("vec", vec!["item 1"]))
.join(("map", map!["vec" => vec!["inner item 1"]]));
let new_figment = Figment::new()
.join(("string", "replaced"))
.join(("vec", vec!["item 2"]))
.join(("map", map!["vec" => vec!["inner item 2"], "new" => vec!["value"]]))
.join(("new", "value"));
let figment = figment.adjoin(new_figment); // **adjoin**
let string: String = figment.extract_inner("string").unwrap();
assert_eq!(string, "original"); // existing value retained
let vec: Vec<String> = figment.extract_inner("vec").unwrap();
assert_eq!(vec, vec!["item 1", "item 2"]); // arrays concatenated
let map: Map<String, Vec<String>> = figment.extract_inner("map").unwrap();
assert_eq!(map, map! {
"vec".into() => vec!["inner item 1".into(), "inner item 2".into()], // arrays concatenated
"new".into() => vec!["value".into()], // new key added
});
let new: String = figment.extract_inner("new").unwrap();
assert_eq!(new, "value"); // new key added
pub fn merge<T>(self, provider: T) -> Figmentwhere
T: Provider,
pub fn merge<T>(self, provider: T) -> Figmentwhere T: Provider,
Merges provider
into the current figment.
See conflict resolution for details.
use figment::Figment;
use figment::util::map;
use figment::value::{Dict, Map};
let figment = Figment::new()
.join(("string", "original"))
.join(("vec", vec!["item 1"]))
.join(("map", map!["string" => "inner original"]));
let new_figment = Figment::new()
.join(("string", "replaced"))
.join(("vec", vec!["item 2"]))
.join(("map", map!["string" => "inner replaced", "new" => "value"]))
.join(("new", "value"));
let figment = figment.merge(new_figment); // **merge**
let string: String = figment.extract_inner("string").unwrap();
assert_eq!(string, "replaced"); // incoming value replaced existing
let vec: Vec<String> = figment.extract_inner("vec").unwrap();
assert_eq!(vec, vec!["item 2"]); // incoming value replaced existing
let map: Map<String, String> = figment.extract_inner("map").unwrap();
assert_eq!(map, map! {
"string".into() => "inner replaced".into(), // incoming value replaced existing
"new".into() => "value".into(), // new key added
});
let new: String = figment.extract_inner("new").unwrap();
assert_eq!(new, "value"); // new key added
pub fn admerge<T>(self, provider: T) -> Figmentwhere
T: Provider,
pub fn admerge<T>(self, provider: T) -> Figmentwhere T: Provider,
Merges provider
into the current figment while concatenating vectors.
See conflict resolution for details.
use figment::Figment;
use figment::util::map;
use figment::value::{Dict, Map};
let figment = Figment::new()
.join(("string", "original"))
.join(("vec", vec!["item 1"]))
.join(("map", map!["vec" => vec!["inner item 1"]]));
let new_figment = Figment::new()
.join(("string", "replaced"))
.join(("vec", vec!["item 2"]))
.join(("map", map!["vec" => vec!["inner item 2"], "new" => vec!["value"]]))
.join(("new", "value"));
let figment = figment.admerge(new_figment); // **admerge**
let string: String = figment.extract_inner("string").unwrap();
assert_eq!(string, "replaced"); // incoming value replaced existing
let vec: Vec<String> = figment.extract_inner("vec").unwrap();
assert_eq!(vec, vec!["item 1", "item 2"]); // arrays concatenated
let map: Map<String, Vec<String>> = figment.extract_inner("map").unwrap();
assert_eq!(map, map! {
"vec".into() => vec!["inner item 1".into(), "inner item 2".into()], // arrays concatenated
"new".into() => vec!["value".into()], // new key added
});
let new: String = figment.extract_inner("new").unwrap();
assert_eq!(new, "value"); // new key added
pub fn select<P>(self, profile: P) -> Figmentwhere
P: Into<Profile>,
pub fn select<P>(self, profile: P) -> Figmentwhere P: Into<Profile>,
Sets the profile to extract from to profile
.
Example
use figment::Figment;
let figment = Figment::new().select("staging");
assert_eq!(figment.profile(), "staging");
pub fn focus(&self, key: &str) -> Figment
pub fn focus(&self, key: &str) -> Figment
Returns a new Figment
containing only the sub-dictionaries at key
.
This “sub-figment” is a focusing of self
with the property that:
self.find(key + ".sub")
<=>focused.find("sub")
In other words, all values in self
with a key starting with key
are
in focused
without the prefix and vice-versa.
Example
use figment::{Figment, providers::{Format, Toml}};
figment::Jail::expect_with(|jail| {
jail.create_file("Config.toml", r#"
cat = [1, 2, 3]
dog = [4, 5, 6]
[subtree]
cat = "meow"
dog = "woof!"
[subtree.bark]
dog = true
cat = false
"#)?;
let root = Figment::from(Toml::file("Config.toml"));
assert_eq!(root.extract_inner::<Vec<u8>>("cat").unwrap(), vec![1, 2, 3]);
assert_eq!(root.extract_inner::<Vec<u8>>("dog").unwrap(), vec![4, 5, 6]);
assert_eq!(root.extract_inner::<String>("subtree.cat").unwrap(), "meow");
assert_eq!(root.extract_inner::<String>("subtree.dog").unwrap(), "woof!");
let subtree = root.focus("subtree");
assert_eq!(subtree.extract_inner::<String>("cat").unwrap(), "meow");
assert_eq!(subtree.extract_inner::<String>("dog").unwrap(), "woof!");
assert_eq!(subtree.extract_inner::<bool>("bark.cat").unwrap(), false);
assert_eq!(subtree.extract_inner::<bool>("bark.dog").unwrap(), true);
let bark = subtree.focus("bark");
assert_eq!(bark.extract_inner::<bool>("cat").unwrap(), false);
assert_eq!(bark.extract_inner::<bool>("dog").unwrap(), true);
let not_a_dict = root.focus("cat");
assert!(not_a_dict.extract_inner::<bool>("cat").is_err());
assert!(not_a_dict.extract_inner::<bool>("dog").is_err());
Ok(())
});
pub fn extract<'a, T>(&self) -> Result<T, Error>where
T: Deserialize<'a>,
pub fn extract<'a, T>(&self) -> Result<T, Error>where T: Deserialize<'a>,
Deserializes the collected value into T
.
Example
use serde::Deserialize;
use figment::{Figment, providers::{Format, Toml, Json, Env}};
#[derive(Debug, PartialEq, Deserialize)]
struct Config {
name: String,
numbers: Option<Vec<usize>>,
debug: bool,
}
figment::Jail::expect_with(|jail| {
jail.create_file("Config.toml", r#"
name = "test"
numbers = [1, 2, 3, 10]
"#)?;
jail.set_env("config_name", "env-test");
jail.create_file("Config.json", r#"
{
"name": "json-test",
"debug": true
}
"#)?;
let config: Config = Figment::new()
.merge(Toml::file("Config.toml"))
.merge(Env::prefixed("CONFIG_"))
.join(Json::file("Config.json"))
.extract()?;
assert_eq!(config, Config {
name: "env-test".into(),
numbers: vec![1, 2, 3, 10].into(),
debug: true
});
Ok(())
});
pub fn extract_inner<'a, T>(&self, key: &str) -> Result<T, Error>where
T: Deserialize<'a>,
pub fn extract_inner<'a, T>(&self, key: &str) -> Result<T, Error>where T: Deserialize<'a>,
Deserializes the value at the key
path in the collected value into
T
.
Example
use figment::{Figment, providers::{Format, Toml, Json}};
figment::Jail::expect_with(|jail| {
jail.create_file("Config.toml", r#"
numbers = [1, 2, 3, 10]
"#)?;
jail.create_file("Config.json", r#"{ "debug": true } "#)?;
let numbers: Vec<usize> = Figment::new()
.merge(Toml::file("Config.toml"))
.join(Json::file("Config.json"))
.extract_inner("numbers")?;
assert_eq!(numbers, vec![1, 2, 3, 10]);
Ok(())
});
pub fn metadata(&self) -> impl Iterator<Item = &Metadata>
pub fn metadata(&self) -> impl Iterator<Item = &Metadata>
Returns an iterator over the metadata for all of the collected values in
the order in which they were added to self
.
Example
use figment::{Figment, providers::{Format, Toml, Json}};
let figment = Figment::new()
.merge(Toml::file("Config.toml"))
.join(Json::file("Config.json"));
assert_eq!(figment.metadata().count(), 2);
for (i, md) in figment.metadata().enumerate() {
match i {
0 => assert!(md.name.starts_with("TOML")),
1 => assert!(md.name.starts_with("JSON")),
_ => unreachable!(),
}
}
pub fn profile(&self) -> &Profile
pub fn profile(&self) -> &Profile
Returns the selected profile.
Example
use figment::Figment;
let figment = Figment::new();
assert_eq!(figment.profile(), "default");
let figment = figment.select("staging");
assert_eq!(figment.profile(), "staging");
pub fn profiles(&self) -> impl Iterator<Item = &Profile>
pub fn profiles(&self) -> impl Iterator<Item = &Profile>
Returns an iterator over profiles with valid configurations in this figment. Note: this may not include the selected profile if the selected profile has no configured values.
Example
use figment::{Figment, providers::Serialized};
let figment = Figment::new();
let profiles = figment.profiles().collect::<Vec<_>>();
assert_eq!(profiles.len(), 0);
let figment = Figment::new()
.join(Serialized::default("key", "hi"))
.join(Serialized::default("key", "hey").profile("debug"));
let mut profiles = figment.profiles().collect::<Vec<_>>();
profiles.sort();
assert_eq!(profiles, &["debug", "default"]);
let figment = Figment::new()
.join(Serialized::default("key", "hi").profile("release"))
.join(Serialized::default("key", "hi").profile("testing"))
.join(Serialized::default("key", "hey").profile("staging"))
.select("debug");
let mut profiles = figment.profiles().collect::<Vec<_>>();
profiles.sort();
assert_eq!(profiles, &["release", "staging", "testing"]);
pub fn find_value(&self, key: &str) -> Result<Value, Error>
pub fn find_value(&self, key: &str) -> Result<Value, Error>
Finds the value at key
path in the combined value. See
Value::find()
for details on the syntax for key
.
Example
use serde::Deserialize;
use figment::{Figment, providers::{Format, Toml, Json, Env}};
figment::Jail::expect_with(|jail| {
jail.create_file("Config.toml", r#"
name = "test"
[package]
name = "my-package"
"#)?;
jail.create_file("Config.json", r#"
{
"author": { "name": "Bob" }
}
"#)?;
let figment = Figment::new()
.merge(Toml::file("Config.toml"))
.join(Json::file("Config.json"));
let name = figment.find_value("name")?;
assert_eq!(name.as_str(), Some("test"));
let package_name = figment.find_value("package.name")?;
assert_eq!(package_name.as_str(), Some("my-package"));
let author_name = figment.find_value("author.name")?;
assert_eq!(author_name.as_str(), Some("Bob"));
Ok(())
});
pub fn find_metadata(&self, key: &str) -> Option<&Metadata>
pub fn find_metadata(&self, key: &str) -> Option<&Metadata>
Finds the metadata for the value at key
path. See Value::find()
for details on the syntax for key
.
Example
use serde::Deserialize;
use figment::{Figment, providers::{Format, Toml, Json, Env}};
figment::Jail::expect_with(|jail| {
jail.create_file("Config.toml", r#" name = "test" "#)?;
jail.set_env("CONF_AUTHOR", "Bob");
let figment = Figment::new()
.merge(Toml::file("Config.toml"))
.join(Env::prefixed("CONF_").only(&["author"]));
let name_md = figment.find_metadata("name").unwrap();
assert!(name_md.name.starts_with("TOML"));
let author_md = figment.find_metadata("author").unwrap();
assert!(author_md.name.contains("CONF_"));
assert!(author_md.name.contains("environment"));
Ok(())
});
pub fn get_metadata(&self, tag: Tag) -> Option<&Metadata>
pub fn get_metadata(&self, tag: Tag) -> Option<&Metadata>
Returns the metadata with the given tag
if this figment contains a
value with said metadata.
Example
use serde::Deserialize;
use figment::{Figment, providers::{Format, Toml, Json, Env}};
figment::Jail::expect_with(|jail| {
jail.create_file("Config.toml", r#" name = "test" "#)?;
jail.create_file("Config.json", r#" { "author": "Bob" } "#)?;
let figment = Figment::new()
.merge(Toml::file("Config.toml"))
.join(Json::file("Config.json"));
let name = figment.find_value("name").unwrap();
let metadata = figment.get_metadata(name.tag()).unwrap();
assert!(metadata.name.starts_with("TOML"));
let author = figment.find_value("author").unwrap();
let metadata = figment.get_metadata(author.tag()).unwrap();
assert!(metadata.name.starts_with("JSON"));
Ok(())
});
Trait Implementations§
Auto Trait Implementations§
impl !RefUnwindSafe for Figment
impl Send for Figment
impl Sync for Figment
impl Unpin for Figment
impl !UnwindSafe for Figment
Blanket Implementations§
§impl<'a, T> AsTaggedExplicit<'a> for Twhere
T: 'a,
impl<'a, T> AsTaggedExplicit<'a> for Twhere T: 'a,
§impl<'a, T> AsTaggedImplicit<'a> for Twhere
T: 'a,
impl<'a, T> AsTaggedImplicit<'a> for Twhere T: 'a,
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
§impl<T> Conv for T
impl<T> Conv for T
§impl<Choices> CoproductSubsetter<CNil, HNil> for Choices
impl<Choices> CoproductSubsetter<CNil, HNil> for Choices
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where &'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
§impl<T> IntoCollection<T> for T
impl<T> IntoCollection<T> for T
§fn into_collection<A>(self) -> SmallVec<A>where
A: Array<Item = T>,
fn into_collection<A>(self) -> SmallVec<A>where A: Array<Item = T>,
self
into a collection.fn mapped<U, F, A>(self, f: F) -> SmallVec<A>where F: FnMut(T) -> U, A: Array<Item = U>,
source§impl<T> IntoSql for T
impl<T> IntoSql for T
source§fn into_sql<T>(self) -> Self::Expressionwhere
Self: AsExpression<T> + Sized,
T: SqlType + TypedExpressionType,
fn into_sql<T>(self) -> Self::Expressionwhere Self: AsExpression<T> + Sized, T: SqlType + TypedExpressionType,
self
to an expression for Diesel’s query builder. Read moresource§fn as_sql<'a, T>(&'a self) -> <&'a Self as AsExpression<T>>::Expressionwhere
&'a Self: AsExpression<T>,
T: SqlType + TypedExpressionType,
fn as_sql<'a, T>(&'a self) -> <&'a Self as AsExpression<T>>::Expressionwhere &'a Self: AsExpression<T>, T: SqlType + TypedExpressionType,
&self
to an expression for Diesel’s query builder. Read more§impl<T, U, I> LiftInto<U, I> for Twhere
U: LiftFrom<T, I>,
impl<T, U, I> LiftInto<U, I> for Twhere U: LiftFrom<T, I>,
§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere T: ?Sized,
§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();
§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
§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();
§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
§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();
§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
§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();
§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);
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere Self: Borrow<B>, B: 'a + ?Sized, R: 'a,
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> Rwhere Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere Self: AsRef<U>, U: 'a + ?Sized, R: 'a,
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere Self: AsMut<U>, U: 'a + ?Sized, R: 'a,
self
, then passes self.as_mut()
into the pipe
function.§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<T, Conn> RunQueryDsl<Conn> for T
impl<T, Conn> RunQueryDsl<Conn> for T
source§fn execute<'query, 'conn>(
self,
conn: &'conn mut Conn
) -> <Conn as AsyncConnection>::ExecuteFuture<'conn, 'query>where
Conn: AsyncConnection + Send,
Self: ExecuteDsl<Conn> + 'query,
fn execute<'query, 'conn>( self, conn: &'conn mut Conn ) -> <Conn as AsyncConnection>::ExecuteFuture<'conn, 'query>where Conn: AsyncConnection + Send, Self: ExecuteDsl<Conn> + 'query,
source§fn load<'query, U, 'conn>(
self,
conn: &'conn mut Conn
) -> AndThen<Self::LoadFuture<'conn>, TryCollect<Self::Stream<'conn>, Vec<U>>, fn(_: Self::Stream<'conn>) -> TryCollect<Self::Stream<'conn>, Vec<U>>>where
U: Send,
Conn: AsyncConnection,
Self: LoadQuery<'query, Conn, U> + 'query,
fn load<'query, U, 'conn>( self, conn: &'conn mut Conn ) -> AndThen<Self::LoadFuture<'conn>, TryCollect<Self::Stream<'conn>, Vec<U>>, fn(_: Self::Stream<'conn>) -> TryCollect<Self::Stream<'conn>, Vec<U>>>where U: Send, Conn: AsyncConnection, Self: LoadQuery<'query, Conn, U> + 'query,
source§fn load_stream<'conn, 'query, U>(
self,
conn: &'conn mut Conn
) -> Self::LoadFuture<'conn>where
Conn: AsyncConnection,
U: 'conn,
Self: LoadQuery<'query, Conn, U> + 'query,
fn load_stream<'conn, 'query, U>( self, conn: &'conn mut Conn ) -> Self::LoadFuture<'conn>where Conn: AsyncConnection, U: 'conn, Self: LoadQuery<'query, Conn, U> + 'query,
Stream
] with the returned rows. Read moresource§fn get_result<'query, 'conn, U>(
self,
conn: &'conn mut Conn
) -> AndThen<Self::LoadFuture<'conn>, Map<StreamFuture<Pin<Box<Self::Stream<'conn>>>>, fn(_: (Option<Result<U, Error>>, Pin<Box<Self::Stream<'conn>>>)) -> Result<U, Error>>, fn(_: Self::Stream<'conn>) -> Map<StreamFuture<Pin<Box<Self::Stream<'conn>>>>, fn(_: (Option<Result<U, Error>>, Pin<Box<Self::Stream<'conn>>>)) -> Result<U, Error>>>where
U: Send + 'conn,
Conn: AsyncConnection,
Self: LoadQuery<'query, Conn, U> + 'query,
fn get_result<'query, 'conn, U>( self, conn: &'conn mut Conn ) -> AndThen<Self::LoadFuture<'conn>, Map<StreamFuture<Pin<Box<Self::Stream<'conn>>>>, fn(_: (Option<Result<U, Error>>, Pin<Box<Self::Stream<'conn>>>)) -> Result<U, Error>>, fn(_: Self::Stream<'conn>) -> Map<StreamFuture<Pin<Box<Self::Stream<'conn>>>>, fn(_: (Option<Result<U, Error>>, Pin<Box<Self::Stream<'conn>>>)) -> Result<U, Error>>>where U: Send + 'conn, Conn: AsyncConnection, Self: LoadQuery<'query, Conn, U> + 'query,
source§fn get_results<'query, U, 'conn>(
self,
conn: &'conn mut Conn
) -> AndThen<Self::LoadFuture<'conn>, TryCollect<Self::Stream<'conn>, Vec<U>>, fn(_: Self::Stream<'conn>) -> TryCollect<Self::Stream<'conn>, Vec<U>>>where
U: Send,
Conn: AsyncConnection,
Self: LoadQuery<'query, Conn, U> + 'query,
fn get_results<'query, U, 'conn>( self, conn: &'conn mut Conn ) -> AndThen<Self::LoadFuture<'conn>, TryCollect<Self::Stream<'conn>, Vec<U>>, fn(_: Self::Stream<'conn>) -> TryCollect<Self::Stream<'conn>, Vec<U>>>where U: Send, Conn: AsyncConnection, Self: LoadQuery<'query, Conn, U> + 'query,
Vec
with the affected rows. Read moresource§fn first<'query, 'conn, U>(
self,
conn: &'conn mut Conn
) -> AndThen<<Self::Output as LoadQuery<'query, Conn, U>>::LoadFuture<'conn>, Map<StreamFuture<Pin<Box<<Self::Output as LoadQuery<'query, Conn, U>>::Stream<'conn>>>>, fn(_: (Option<Result<U, Error>>, Pin<Box<<Self::Output as LoadQuery<'query, Conn, U>>::Stream<'conn>>>)) -> Result<U, Error>>, fn(_: <Self::Output as LoadQuery<'query, Conn, U>>::Stream<'conn>) -> Map<StreamFuture<Pin<Box<<Self::Output as LoadQuery<'query, Conn, U>>::Stream<'conn>>>>, fn(_: (Option<Result<U, Error>>, Pin<Box<<Self::Output as LoadQuery<'query, Conn, U>>::Stream<'conn>>>)) -> Result<U, Error>>>where
U: Send + 'conn,
Conn: AsyncConnection,
Self: LimitDsl,
Self::Output: LoadQuery<'query, Conn, U> + Send + 'query,
fn first<'query, 'conn, U>( self, conn: &'conn mut Conn ) -> AndThen<<Self::Output as LoadQuery<'query, Conn, U>>::LoadFuture<'conn>, Map<StreamFuture<Pin<Box<<Self::Output as LoadQuery<'query, Conn, U>>::Stream<'conn>>>>, fn(_: (Option<Result<U, Error>>, Pin<Box<<Self::Output as LoadQuery<'query, Conn, U>>::Stream<'conn>>>)) -> Result<U, Error>>, fn(_: <Self::Output as LoadQuery<'query, Conn, U>>::Stream<'conn>) -> Map<StreamFuture<Pin<Box<<Self::Output as LoadQuery<'query, Conn, U>>::Stream<'conn>>>>, fn(_: (Option<Result<U, Error>>, Pin<Box<<Self::Output as LoadQuery<'query, Conn, U>>::Stream<'conn>>>)) -> Result<U, Error>>>where U: Send + 'conn, Conn: AsyncConnection, Self: LimitDsl, Self::Output: LoadQuery<'query, Conn, U> + Send + 'query,
§impl<Source> Sculptor<HNil, HNil> for Source
impl<Source> Sculptor<HNil, HNil> for Source
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere Self: Deref<Target = T>, T: ?Sized,
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere Self: DerefMut<Target = T> + Deref, T: ?Sized,
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere Self: Borrow<B>, B: ?Sized,
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere Self: BorrowMut<B>, B: ?Sized,
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere Self: AsRef<R>, R: ?Sized,
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere Self: AsMut<R>, R: ?Sized,
.tap_ref_mut()
only in debug builds, and is erased in release
builds.