Skip to main content

ThreadState

Struct ThreadState 

Source
pub struct ThreadState<T> {
Show 31 fields pub dettid: DetTid, pub detpid: Option<DetTid>, pub physical_tid: Option<i32>, pub mm_id: MmId, pub pedigree: Pedigree, pub stats: ThreadStats, pub preemption_points: Option<ThreadHistoryIterator>, pub interrupt_at: BTreeSet<u64>, pub clone_flags: Option<CloneFlags>, pub pending_vfork: Option<PendingVfork>, pub file_metadata: Arc<Mutex<FileMetadata>>, pub prng: Pcg64Mcg, pub chaos_prng: Pcg64Mcg, pub thread_logical_time: DetTime, pub committed_clock_value: u64, pub record_or_replay: T, pub end_of_timeslice: Option<LogicalTime>, pub replay_rcb_end: Option<u64>, pub last_replay_change_point: Option<LogicalTime>, pub chaos_epoch: u64, pub chaos_slowdown_factor: RcbTimeMultiplier, pub chaos_slowdown_active: bool, pub pending_chaos_epochs: Vec<ChaosEpochTransition>, pub max_timeslice_end: Option<LogicalTime>, pub last_grant_deadline: Option<Duration>, pub last_rcb_timer: Option<u64>, pub last_rcb_timer_is_max: bool, pub lone_grant: bool, pub lone_slice_end: Option<u64>, pub replaying_lone_slice_end: Option<u64>, pub lone_replay_unsound: bool, /* private fields */
}
Expand description

The Detcore per-thread state.

Fields§

§dettid: DetTid

The deterministic thread ID of the this thread.

§detpid: Option<DetTid>

The deterministic process ID of the this thread.

§physical_tid: Option<i32>

Host thread ID supplied by a backend whose scheduler identity is virtual. None keeps the existing direct-ID behavior for other backends.

§mm_id: MmId

Linux memory address space shared by tasks created with CLONE_VM.

§pedigree: Pedigree

This threads path within the thread/process ancestry tree. (The terminology comes from Cilk.)

§stats: ThreadStats

Counting various events.

§preemption_points: Option<ThreadHistoryIterator>

In chaos mode with –replay-preemptions-from, we hold a list of our future preemption points.

§interrupt_at: BTreeSet<u64>

User defined interruption points

§clone_flags: Option<CloneFlags>

clone flags when SYS_clone is called.

This is just a place to stash the value temporarily, where it can be read out by the child thread upon init_thread_state. After that point, it is consumed by the child and becomes None again.

Stated differently, this is just for message-passing communication.

§pending_vfork: Option<PendingVfork>

Registration metadata for a child whose parent cannot resume until the backend finishes the child. The child consumes this in handle_thread_start; the parent clears its copy when injection returns.

§file_metadata: Arc<Mutex<FileMetadata>>

Shared file metadata among all threads in the same process. Initialized for new threads (shared or fresh), and then overwritten again on execve.

§prng: Pcg64Mcg

pseudo random number state

§chaos_prng: Pcg64Mcg

RNG to drive chaos scheduling decisions, separate from other (guest) RNG.

§thread_logical_time: DetTime

logical time, measuring progress of this thread and only this thread.

§committed_clock_value: u64

the last RCB clock value committed to thread_logical_time

§record_or_replay: T

Thread state associated with record/replay.

§end_of_timeslice: Option<LogicalTime>

How much longer does this thread get to run before it must check-in with the scheduler? Note that this notion of time slice can extend across a region of time that includes syscalls (and thus handlers).

If set to None, the thread can run indefinitely without preemption.

This is in units of virtual Nanoseconds. And it is an exact time in the future, not a relative duration.

§replay_rcb_end: Option<u64>

Exact per-thread PMU RCB target for the active preemption-replay slice. None selects the legacy logical-time deadline path.

§last_replay_change_point: Option<LogicalTime>

In a preemption replay, the logical time of the last priority change point this thread filed (ThreadState::file_replay_change_point).

§chaos_epoch: u64

Deterministic chaos epoch this thread was in at its last next_timeslice. Used only to detect epoch transitions for CHAOSEPOCH logging; the epoch itself is recomputed each slice from thread_logical_time. Sentinel u64::MAX guarantees the first slice always logs its initial epoch.

§chaos_slowdown_factor: RcbTimeMultiplier

Exact multiplier currently used to convert this thread’s RCBs to virtual time.

§chaos_slowdown_active: bool

True when live chaos configuration or a replay artifact supplies the factor.

§pending_chaos_epochs: Vec<ChaosEpochTransition>

Transitions waiting to be committed into the preemption artifact.

§max_timeslice_end: Option<LogicalTime>

Absolute deadline enforced by the PMU-backed --max-timeslice timer. This is separate from end_of_timeslice so syscall-heavy workloads can use a shorter, cheap target deadline.

§last_grant_deadline: Option<Duration>

The deadline hint carried by the last scheduler reply this thread received (ThreadState::cap_timeslice_at_deadline). Applied when the reply arrives, and again by the two paths that then install a fresh slice end: thread start and the exec continuation.

§last_rcb_timer: Option<u64>

Track what our last timer was set for, just to double check that RCB timers are behaving as expected and see if we went over. (For exmaple, this behaves badly if threads are not pinned and our we migrate between cores.)

§last_rcb_timer_is_max: bool

Whether last_rcb_timer represents the maximum deadline rather than a manual interrupt.

§lone_grant: bool

Whether the scheduler’s last reply to this thread was a grant that found it the only thread able to run before it next enters Detcore (GlobalResponse::WithLoneGrant). Every reply without that mark clears it.

§lone_slice_end: Option<u64>

While the thread runs alone (Config::replays_lone_preemptions): the branch count, in committed_clock_value units, at which its current timeslice ends. No timer stops the guest there; the thread’s next entry into Detcore processes every such end at or before the count it reached, in order (Detcore::catch_up_lone_slice_ends).

§replaying_lone_slice_end: Option<u64>

While such an end is processed: its branch count, which the clock update reads in place of the hardware counter.

§lone_replay_unsound: bool

Set when a grant while such an end was processed did not find the thread alone, which the scheduler’s predicate rules out; taken by Detcore::catch_up_lone_slice_ends, which reports it.

Implementations§

Source§

impl<T> ThreadState<T>

Source

pub fn reseed_child_rngs(&mut self, parent: &Self, entropy: u128)

Replaces the host-TID-derived child streams with a backend-provided, deterministic identity before the thread enters its start hook.

Source

pub fn new(pid: DetPid, cfg: &Config, record_or_replay: T) -> Self

Create a fresh new thread state from nothing. In practice this is only used for the thread state of the root thread of the container.

Source

pub fn apply_initial_random_state( &mut self, bytes: &[u8], config: &Config, image: InitialImage, ) -> Result<(), Errno>

Apply a required, authenticated initial-image random handoff to the normal root. Errors are tool initialization failures, never guest errno.

Source

pub fn mk_request(&self, rid: ResourceID, perm: Permission) -> Resources

Build a singleton resource request from the current thread.

Source

pub fn chaos_prng_next_u64(&mut self, msg: &str) -> u64

Generate the next random number using the thread-local chaos_seed.

Source

pub fn add_fd( &self, fd: RawFd, flags: OFlag, ty: FdType, stat: Option<DetStat>, ) -> Result<(), Errno>

Add a new fd, with optional stat data, have side effects on other threads.

If stat data is not available, then perform an extra stat ourselves to populate it.

§Arguments
  • fd - file descriptor to add

  • flags - flags when creating fd

  • ty - fd type (regular file, socket, pipe, etc..)

  • stat - stat returned from fstat

Source

pub fn set_open_file_creator(&mut self, creator: DetTid)

Overrides the task identity embedded in subsequently allocated open-file descriptions.

Source

pub fn with_detfd<F, U>(&self, fd: RawFd, f: F) -> Result<U, Errno>
where F: FnMut(&mut DetFd) -> U,

Get a mutable reference of DetFd from a raw file descriptor, and run mutable function f on it (&mut DetFd).

Source

pub fn exec_blocking_overrides(&self) -> BTreeSet<RawFd>

Preserve logical blocking for scheduler-managed descriptors when exec replaces an in-process tool and its descriptor metadata.

Source

pub fn promote_shared_open_files(&self) -> Result<(), SharedOpenFileError>

Promote the OFDs whose model must stay one copy – random devices (their cursor) and timerfds (their virtual-time expirations, crate::fd::VirtualTimerfd) – before a backend physically copies or replaces its in-process Tool. The shared model owns their full state; this does not promote sockets or other OFDs. The record sequences of per-process files move to Detcore’s global state on their own (share_procfs_sequences, first). Call only while this task owns its serial grant, before the native lifecycle operation can expose a child/new image. Ptrace’s host-side Arc needs no promotion. See https://github.com/rrnewton/hermit/issues/4381.

Source

pub fn share_procfs_sequences(&self)

Before a backend whose tool runs in each guest process physically copies this process (a fork) or replaces its image: every description of a per-process file that follows its record’s sequence keeps that sequence in Detcore’s global state from then on, so the copies a fork makes share it as Linux’s processes share the one struct file and seq_file (ProcfsFile::share_sequence, Detcore::take_procfs_sequence). Local and RPC-free: the first operation after the fork, in either process, finds no sequence there yet and keeps its copy, which is the one the fork made. Runs in the caller’s turn, before the copy exists (promote_shared_open_files, and Detcore::handle_clone_family for SaBRe, whose runtime promotes nothing).

Source

pub fn reset_copied_open_file_locks(&self)

Rebuild only process-local locks after a physical process copy. This is RPC-free and precedes the child’s first scheduler admission. Ordinary same-process table clones retain their original shared locks.

Source

pub fn has_unsafe_vfork_flock_state(&self) -> bool

Whether some open file description holds a flock mode Detcore knows, or was invalidated by a process copy after a flock was granted through it (FileMetadata::has_unsafe_vfork_flock_state).

Source

pub fn has_unsafe_vfork_ofd_state(&self) -> bool

Whether a description in this table may hold an OFD lock. A copied vfork child (DBT) runs its lock calls natively, so the procfs::locks::LockLedger entry of such a description could go stale and admit a host’s identical /proc/locks row.

Source

pub fn forget_flock_modes(&self)

A new process can change every inherited open file description through a separately hosted tool state, so neither side may keep treating its cached flock mode as authoritative after fork.

Source

pub fn remove_fd(&self, fd: RawFd) -> Option<OpenFileId>

remove a rawfd

Source

pub fn dup_fd( &mut self, oldfd: RawFd, newfd: RawFd, flags: OFlag, ) -> Result<Option<OpenFileId>, Errno>

dup raw fds.

Source

pub fn thread_prng(&mut self) -> &mut Pcg64Mcg

get thread prng, note this rng is deterministic and should not be used for crypto.

Source

pub fn next_timeslice(&mut self, cfg: &Config) -> Option<Priority>

Choose the logical target and PMU maximum deadlines for the next timeslice.

Effects:

  • Sets end_of_timeslice for the new timeslice.
  • Sets max_timeslice_end when PMU-backed preemption is enabled.
  • Resets the statistics for the timeslice.

Returns: an optional new priority.

Source

pub fn reset_timeslice_for_explicit_yield(&mut self)

Close the current logical-timeslice statistics without selecting a new preemption point. Used when preemption replay reaches a deterministic guest sched_yield boundary.

Source

pub fn guest_past_first_execve(&self) -> bool

Are we within the execution of the (first) guest binary or any child processes called by it? Returns false if we are in the very beginning of execution, when the hermit container has forked our process, but we have not yet executed the guest binary. There are few guarantees during this early initialization period, and Detcore should make no assumptions, nor guarantee determinism!

Trait Implementations§

Source§

impl<T> AsMut<T> for ThreadState<T>

Source§

fn as_mut(&mut self) -> &mut T

Converts this type into a mutable reference of the (usually inferred) input type.
Source§

impl<T> AsRef<T> for ThreadState<T>

Source§

fn as_ref(&self) -> &T

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl<T: Clone> Clone for ThreadState<T>

Source§

fn clone(&self) -> ThreadState<T>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T> Debug for ThreadState<T>

We cannot assume that the record_or_replay “subtool” is Debug, so it is handy to be able to print the Detcore threadstate alone.

Source§

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

Formats the value using the given formatter. Read more
Source§

impl<T> Default for ThreadState<T>

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl<'de, T> Deserialize<'de> for ThreadState<T>
where T: Deserialize<'de>,

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl<T> Serialize for ThreadState<T>
where T: Serialize,

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

§

impl<T> !Freeze for ThreadState<T>

§

impl<T> RefUnwindSafe for ThreadState<T>
where T: RefUnwindSafe,

§

impl<T> Send for ThreadState<T>
where T: Send,

§

impl<T> Sync for ThreadState<T>
where T: Sync,

§

impl<T> Unpin for ThreadState<T>
where T: Unpin,

§

impl<T> UnsafeUnpin for ThreadState<T>
where T: UnsafeUnpin,

§

impl<T> UnwindSafe for ThreadState<T>
where T: UnwindSafe,

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<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

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.

§

impl<T> Paint for T
where T: ?Sized,

§

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 primary(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Primary].

§Example
println!("{}", value.primary());
§

fn fixed(&self, color: u8) -> Painted<&T>

Returns self with the fg() set to [Color :: Fixed].

§Example
println!("{}", value.fixed(color));
§

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));
§

fn black(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Black].

§Example
println!("{}", value.black());
§

fn red(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Red].

§Example
println!("{}", value.red());
§

fn green(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Green].

§Example
println!("{}", value.green());
§

fn yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Yellow].

§Example
println!("{}", value.yellow());
§

fn blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Blue].

§Example
println!("{}", value.blue());
§

fn magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Magenta].

§Example
println!("{}", value.magenta());
§

fn cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Cyan].

§Example
println!("{}", value.cyan());
§

fn white(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: White].

§Example
println!("{}", value.white());
§

fn bright_black(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightBlack].

§Example
println!("{}", value.bright_black());
§

fn bright_red(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightRed].

§Example
println!("{}", value.bright_red());
§

fn bright_green(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightGreen].

§Example
println!("{}", value.bright_green());
§

fn bright_yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightYellow].

§Example
println!("{}", value.bright_yellow());
§

fn bright_blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightBlue].

§Example
println!("{}", value.bright_blue());
§

fn bright_magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightMagenta].

§Example
println!("{}", value.bright_magenta());
§

fn bright_cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightCyan].

§Example
println!("{}", value.bright_cyan());
§

fn bright_white(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightWhite].

§Example
println!("{}", value.bright_white());
§

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>

Returns self with the bg() set to [Color :: Primary].

§Example
println!("{}", value.on_primary());
§

fn on_fixed(&self, color: u8) -> Painted<&T>

Returns self with the bg() set to [Color :: Fixed].

§Example
println!("{}", value.on_fixed(color));
§

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));
§

fn on_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Black].

§Example
println!("{}", value.on_black());
§

fn on_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Red].

§Example
println!("{}", value.on_red());
§

fn on_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Green].

§Example
println!("{}", value.on_green());
§

fn on_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Yellow].

§Example
println!("{}", value.on_yellow());
§

fn on_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Blue].

§Example
println!("{}", value.on_blue());
§

fn on_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Magenta].

§Example
println!("{}", value.on_magenta());
§

fn on_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Cyan].

§Example
println!("{}", value.on_cyan());
§

fn on_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: White].

§Example
println!("{}", value.on_white());
§

fn on_bright_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightBlack].

§Example
println!("{}", value.on_bright_black());
§

fn on_bright_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightRed].

§Example
println!("{}", value.on_bright_red());
§

fn on_bright_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightGreen].

§Example
println!("{}", value.on_bright_green());
§

fn on_bright_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightYellow].

§Example
println!("{}", value.on_bright_yellow());
§

fn on_bright_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightBlue].

§Example
println!("{}", value.on_bright_blue());
§

fn on_bright_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightMagenta].

§Example
println!("{}", value.on_bright_magenta());
§

fn on_bright_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightCyan].

§Example
println!("{}", value.on_bright_cyan());
§

fn on_bright_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightWhite].

§Example
println!("{}", value.on_bright_white());
§

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 bold(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Bold].

§Example
println!("{}", value.bold());
§

fn dim(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Dim].

§Example
println!("{}", value.dim());
§

fn italic(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Italic].

§Example
println!("{}", value.italic());
§

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());
§

fn invert(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Invert].

§Example
println!("{}", value.invert());
§

fn conceal(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Conceal].

§Example
println!("{}", value.conceal());
§

fn strike(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Strike].

§Example
println!("{}", value.strike());
§

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 mask(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Mask].

§Example
println!("{}", value.mask());
§

fn wrap(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Wrap].

§Example
println!("{}", value.wrap());
§

fn linger(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Linger].

§Example
println!("{}", value.linger());
§

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());
§

fn resetting(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Resetting].

§Example
println!("{}", value.resetting());
§

fn bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Bright].

§Example
println!("{}", value.bright());
§

fn on_bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: OnBright].

§Example
println!("{}", value.on_bright());
§

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);
§

fn new(self) -> Painted<Self>
where Self: Sized,

Create a new [Painted] with a default [Style]. Read more
§

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
§

impl<T> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows 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) -> R
where R: 'a,

Mutably borrows 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) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
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.
§

impl<T> WithSubscriber for T

§

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
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more