pub struct NoUnwindVirtualMachine<'ctxt, R: ImportResolver, C: Cache>(/* private fields */);Expand description
An wrapper around VirtualMachine which doesn’t unwind the VM stack upon destruction.
Unwinding ensures all thunks are properly cleaned from their previous state if the VM abort, which makes it possible to run subsequent evaluations (whether in the same or another VM instance). Since VM are light instances that are built on the spot, the default behavior is to unwind upon dropping, to avoid bad surprises (and unwinding is virtually free if the evaluation succeeds, since the stack is then empty).
However, it could happen that in some workflows, one wishes to avoid the cost of unwinding. In that case, use this wrapper instead of VirtualMachine.
Implementations§
Source§impl<'ctxt, R: ImportResolver, C: Cache> NoUnwindVirtualMachine<'ctxt, R, C>
impl<'ctxt, R: ImportResolver, C: Cache> NoUnwindVirtualMachine<'ctxt, R, C>
pub fn new(vm: VirtualMachine<'ctxt, R, C>) -> Self
Methods from Deref<Target = VirtualMachine<'ctxt, R, C>>§
Sourcepub fn merge(
&mut self,
v1: NickelValue,
env1: Environment,
v2: NickelValue,
env2: Environment,
pos_op: PosIdx,
mode: MergeMode,
) -> Result<Closure, ErrorKind>
pub fn merge( &mut self, v1: NickelValue, env1: Environment, v2: NickelValue, env2: Environment, pos_op: PosIdx, mode: MergeMode, ) -> Result<Closure, ErrorKind>
Compute the merge of two evaluated operands. Support both standard merging and record contract application.
§Mode
In MergeMode::Contract mode, t1 must be the value and t2 must be the contract. It is
important as merge is not commutative in this mode.
Sourcepub fn continue_op(&mut self, closure: Closure) -> Result<Closure, ErrorKind>
pub fn continue_op(&mut self, closure: Closure) -> Result<Closure, ErrorKind>
Proceeds to the next step of the evaluation of a primitive operation.
Depending on the content of the stack, it either starts the evaluation of the next argument or finally proceed with the operation if all arguments are evaluated.
pub fn warn(&mut self, warning: Warning)
Sourcepub fn reset(&mut self)
pub fn reset(&mut self)
Reset the state of the machine (stacks, eval mode and state of cached elements) to prepare for another evaluation round.
pub fn import_resolver(&self) -> &R
pub fn import_resolver_mut(&mut self) -> &mut R
Sourcepub fn eval(&mut self, value: NickelValue) -> Result<NickelValue, EvalError>
pub fn eval(&mut self, value: NickelValue) -> Result<NickelValue, EvalError>
Evaluate a Nickel expression. Wrapper around VirtualMachine::eval_closure that starts from an empty local environment and drops the final environment.
Sourcepub fn eval_full(
&mut self,
value: NickelValue,
) -> Result<NickelValue, EvalError>
pub fn eval_full( &mut self, value: NickelValue, ) -> Result<NickelValue, EvalError>
Fully evaluate a Nickel term: the result is not a WHNF but to a value with all variables substituted.
Sourcepub fn eval_full_closure(
&mut self,
closure: Closure,
) -> Result<Closure, EvalError>
pub fn eval_full_closure( &mut self, closure: Closure, ) -> Result<Closure, EvalError>
Same as Self::eval_full, but takes a closure as an argument instead of a term.
Sourcepub fn eval_full_for_export(
&mut self,
value: NickelValue,
) -> Result<NickelValue, EvalError>
pub fn eval_full_for_export( &mut self, value: NickelValue, ) -> Result<NickelValue, EvalError>
Like Self::eval_full, but skips evaluating record fields marked not_exported.
Sourcepub fn eval_full_for_export_closure(
&mut self,
closure: Closure,
) -> Result<NickelValue, EvalError>
pub fn eval_full_for_export_closure( &mut self, closure: Closure, ) -> Result<NickelValue, EvalError>
Same as Self::eval_full_for_export, but takes a closure as an argument instead of a term.
Sourcepub fn eval_deep(
&mut self,
value: NickelValue,
) -> Result<NickelValue, EvalError>
pub fn eval_deep( &mut self, value: NickelValue, ) -> Result<NickelValue, EvalError>
Fully evaluates a Nickel term like eval_full, but does not substitute all variables.
Sourcepub fn eval_deep_closure(
&mut self,
closure: Closure,
) -> Result<NickelValue, EvalError>
pub fn eval_deep_closure( &mut self, closure: Closure, ) -> Result<NickelValue, EvalError>
Same as Self::eval_deep, but take a closure as an argument instead of a term.
Sourcepub fn extract_field_closure(
&mut self,
closure: Closure,
path: &FieldPath,
) -> Result<(Field, Environment), EvalError>
pub fn extract_field_closure( &mut self, closure: Closure, path: &FieldPath, ) -> Result<(Field, Environment), EvalError>
Take a term and a field path, and evaluate until the corresponding field can be extracted. Return the resulting field in its final environment.
Note that this method doesn’t evaluate the content of the field itself. Calling it with an empty path simply returns the original expression unevaluated in an empty environment. If you need to evaluate the value later, don’t forget to apply pending contracts stored in the field.
For example, extracting foo.bar.baz on a term exp will evaluate exp to a record and
try to extract the field foo. If anything goes wrong (the result isn’t a record or the
field bar doesn’t exist), a proper error is raised. Otherwise,
Self::extract_field_closure applies the same recipe recursively and evaluate the content
of the foo field extracted from exp to a record, tries to extract bar, and so on.
Sourcepub fn extract_field_value_closure(
&mut self,
closure: Closure,
path: &FieldPath,
) -> Result<Closure, EvalError>
pub fn extract_field_value_closure( &mut self, closure: Closure, path: &FieldPath, ) -> Result<Closure, EvalError>
Same as Self::extract_field_closure, but also requires that the field value is defined and returns the value directly.
This method also applies potential pending contracts to the value.
In theory, extracting the value could be done manually after calling to Self::extract_field_closure, instead of needing a separate method.
However, once Self::extract_field_closure returns, most contextual information required
to raise a proper error if the field is missing (e.g. positions) has been lost. So, if the
returned field’s value is None, we would have a hard time reporting a good error message.
On the other hand, Self::extract_field_value_closure raises the error earlier, when the
context is still available.
pub fn query( &mut self, v: NickelValue, path: &FieldPath, ) -> Result<Field, EvalError>
Sourcepub fn query_closure(
&mut self,
closure: Closure,
path: &FieldPath,
) -> Result<Field, EvalError>
pub fn query_closure( &mut self, closure: Closure, path: &FieldPath, ) -> Result<Field, EvalError>
Same as VirtualMachine::query, but starts from a closure instead of a term in an empty environment.
Sourcepub fn eval_closure(&mut self, closure: Closure) -> Result<Closure, EvalError>
pub fn eval_closure(&mut self, closure: Closure) -> Result<Closure, EvalError>
The main loop of evaluation.
Implement the evaluation loop of the core language. The specific implementations of primitive operations is delegated to the modules operation and merge.
§Arguments
clos: the closure to evaluateinitial_env: the initial environment containing the stdlib items. Accessible from anywhere in the program.
§Return
Either:
- an evaluation error
- the evaluated term with its final environment
Sourcepub fn eval_permissive(
&mut self,
value: NickelValue,
recursion_limit: usize,
) -> Vec<EvalError> ⓘ
pub fn eval_permissive( &mut self, value: NickelValue, recursion_limit: usize, ) -> Vec<EvalError> ⓘ
Evaluate a term, but attempt to continue on errors.
This differs from VirtualMachine::eval_full in three ways:
- We try to accumulate errors instead of bailing out. When recursing into record fields and array elements, we keep evaluating subsequent elements even if one fails.
- We only return the accumulated errors; we don’t return the eval’ed term.
- We support a recursion limit, to limit the number of times we recurse into arrays or records.
Trait Implementations§
Source§impl<'ctxt, R: ImportResolver, C: Cache> Deref for NoUnwindVirtualMachine<'ctxt, R, C>
impl<'ctxt, R: ImportResolver, C: Cache> Deref for NoUnwindVirtualMachine<'ctxt, R, C>
Source§impl<'ctxt, R: ImportResolver, C: Cache> DerefMut for NoUnwindVirtualMachine<'ctxt, R, C>
impl<'ctxt, R: ImportResolver, C: Cache> DerefMut for NoUnwindVirtualMachine<'ctxt, R, C>
Auto Trait Implementations§
impl<'ctxt, R, C> Freeze for NoUnwindVirtualMachine<'ctxt, R, C>
impl<'ctxt, R, C> !RefUnwindSafe for NoUnwindVirtualMachine<'ctxt, R, C>
impl<'ctxt, R, C> !Send for NoUnwindVirtualMachine<'ctxt, R, C>
impl<'ctxt, R, C> !Sync for NoUnwindVirtualMachine<'ctxt, R, C>
impl<'ctxt, R, C> Unpin for NoUnwindVirtualMachine<'ctxt, R, C>where
C: Unpin,
impl<'ctxt, R, C> UnsafeUnpin for NoUnwindVirtualMachine<'ctxt, R, C>
impl<'ctxt, R, C> !UnwindSafe for NoUnwindVirtualMachine<'ctxt, R, C>
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> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T, U> OverflowingInto<U> for Twhere
U: OverflowingFrom<T>,
impl<T, U> OverflowingInto<U> for Twhere
U: OverflowingFrom<T>,
fn overflowing_into(self) -> (U, bool)
Source§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read moreSource§fn fg_rgb<const R: u8, const G: u8, const B: u8>(
&self,
) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>
fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>
Source§fn bg_rgb<const R: u8, const G: u8, const B: u8>(
&self,
) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>
fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>
Source§fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>
fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>
Source§fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>
fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>
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>
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);