Skip to main content

PeekClient

Struct PeekClient 

Source
pub struct PeekClient {
Show 13 fields coordinator_client: CoordinatorClient, catalog_cache: Weak<Catalog>, compute_instances: BTreeMap<ComputeInstanceId, InstanceClient>, pub storage_collections: StorageCollectionsHandle, pub transient_id_gen: Arc<TransientIdGen>, pub optimizer_metrics: OptimizerMetrics, oracles: BTreeMap<Timeline, Arc<dyn TimestampOracle<Timestamp> + Send + Sync>>, persist_client: PersistClient, pub statement_logging_frontend: StatementLoggingFrontend, pub occ_write_semaphore: Arc<Semaphore>, pub frontend_read_then_write_enabled: bool, pub(crate) group_commit_notifier: GroupCommitNotifier, pub read_only: bool,
}
Expand description

Clients needed for peek sequencing in the Adapter Frontend.

Fields§

§coordinator_client: CoordinatorClient§catalog_cache: Weak<Catalog>

Cache of the latest catalog snapshot. Serves PeekClient::catalog_snapshot without a Coordinator round-trip while the catalog’s transient revision is unchanged.

Holds a Weak so that an idle session does not keep a superseded catalog version alive.

§compute_instances: BTreeMap<ComputeInstanceId, InstanceClient>

Channels to talk to each compute Instance task directly. Lazily populated. Note that these are never cleaned up. In theory, this could lead to a very slow memory leak if a long-running user session keeps peeking on clusters that are being created and dropped in a hot loop. Hopefully this won’t occur any time soon.

§storage_collections: StorageCollectionsHandle

Handle to storage collections for reading frontiers and policies.

§transient_id_gen: Arc<TransientIdGen>

A generator for transient GlobalIds, shared with Coordinator.

§optimizer_metrics: OptimizerMetrics§oracles: BTreeMap<Timeline, Arc<dyn TimestampOracle<Timestamp> + Send + Sync>>

Per-timeline oracles from the coordinator. Lazily populated.

§persist_client: PersistClient§statement_logging_frontend: StatementLoggingFrontend

Statement logging state for frontend peek sequencing.

§occ_write_semaphore: Arc<Semaphore>

Semaphore for limiting concurrent OCC (optimistic concurrency control) write operations.

§frontend_read_then_write_enabled: bool

Whether frontend OCC read-then-write is enabled (determined once at process startup).

§group_commit_notifier: GroupCommitNotifier

Requests a group commit. Used to advance the write timeline when we need the oracle to move but have nothing to write ourselves.

§read_only: bool

Whether the coordinator is in read-only mode. Mutations must be rejected.

Implementations§

Source§

impl PeekClient

Source

pub(crate) async fn try_frontend_peek( &mut self, portal_name: &str, session: &mut Session, logging: &mut ExecutionLogging, ) -> Result<Option<ExecuteResponse>, AdapterError>

Attempt to sequence a peek from the session task.

Returns Ok(Some(response)) if we handled the peek, or Ok(None) to fall back to the Coordinator’s sequencing. If it returns an error, it should be returned to the user.

logging holds the end-of-execution obligation for this statement. The caller retires it, this function only takes the statement over and, at the dispatch sites that hand execution off, defuses the slot.

Source

async fn try_frontend_peek_inner( &mut self, session: &mut Session, catalog: Arc<Catalog>, stmt: Option<Arc<Statement<Raw>>>, params: Params, logging: &mut ExecutionLogging, ) -> Result<Option<ExecuteResponse>, AdapterError>

This is encapsulated in an inner function so that the outer function can still do statement logging after the ? returns of the inner function.

Dispatch sites that hand the statement to the coordinator for asynchronous completion (registered peeks, subscribes) defuse the logging slot at the point where the coordinator takes over. Everywhere else the slot stays armed and SessionClient::execute logs the end from the returned result.

Source

pub(crate) async fn frontend_determine_timestamp( &mut self, session: &Session, id_bundle: &CollectionIdBundle, when: &QueryWhen, compute_instance: ComputeInstanceId, timeline_context: &TimelineContext, oracle_read_ts: Option<Timestamp>, real_time_recency_ts: Option<Timestamp>, ) -> Result<(TimestampDetermination, ReadHolds), AdapterError>

(Similar to Coordinator::determine_timestamp) Determines the timestamp for a query, acquires read holds that ensure the query remains executable at that time, and returns those. The caller is responsible for eventually dropping those read holds.

Note: self is taken &mut because of the lazy fetching in get_compute_instance_client.

Source

fn assert_read_holds_correct( read_holds: &ReadHolds, execution: &Execution, determination: &TimestampDetermination, target_cluster_id: ClusterId, in_immediate_multi_stmt_txn: bool, )

Source§

impl PeekClient

Source

pub(crate) async fn frontend_read_then_write( &mut self, session: &mut Session, plan: ReadThenWritePlan, target_cluster: TargetCluster, catalog: &Arc<Catalog>, statement_logging_id: Option<StatementLoggingId>, attempt_state: Arc<FrontendWriteAttemptState>, ) -> Result<ExecuteResponse, AdapterError>

Execute a read-then-write operation using frontend sequencing.

Called by session code when the frontend_read_then_write dyncfg is enabled. The caller owns the end-of-execution logging for statement_logging_id and verified and planned the portal against catalog, which stays in force through optimization and write-target generation capture.

Source

pub(crate) async fn background_read_then_write( &mut self, session: &mut Session, plan: ReadThenWritePlan, cluster_id: ComputeInstanceId, replica_id: ReplicaId, catalog: &Arc<Catalog>, ) -> Result<ExecuteResponse, AdapterError>

Executes a coordinator-owned read-then-write against system relations, pinned to replica_id.

See RtwCaller::Background for what the caller takes on by using this.

Source

async fn read_then_write( &mut self, session: &mut Session, plan: ReadThenWritePlan, target_cluster: TargetCluster, catalog: &Arc<Catalog>, statement_logging_id: Option<StatementLoggingId>, attempt_state: Arc<FrontendWriteAttemptState>, caller: RtwCaller, ) -> Result<ExecuteResponse, AdapterError>

Source

fn optimize_mir_read_then_write( &self, catalog: &Arc<Catalog>, session: &dyn SessionMetadata, plan: &ReadThenWritePlan, cluster_id: ComputeInstanceId, ) -> Result<(Optimizer, GlobalMirPlan<Unresolved>), AdapterError>

Builds the subscribe optimizer and the unresolved global MIR plan for a read-then-write.

The optimized expression is the selection with the mutation already applied, so the subscribe’s sink emits ready-to-write table diffs rather than query results. finishing and returning are deliberately not part of the dataflow, and unmaterializable functions are prepared one-shot.

Source

async fn oracle_read_ts( &mut self, timeline: &TimelineContext, ) -> Result<Option<Timestamp>, AdapterError>

The governing oracle’s read timestamp, used as a lower bound for timestamp selection. None when the selection needs no oracle.

Source

async fn ensure_read_linearized( &mut self, timeline: &TimelineContext, as_of: Timestamp, ) -> Result<(), AdapterError>

Block until the oracle for this query’s timeline has advanced to as_of. Returns immediately if it already has.

This implements the strict-serializable read guarantee for RTW: once this returns, any session observing the oracle sees a read timestamp at least as large as as_of, so reads at as_of (and writes derived from them) cannot appear to “go backwards” relative to subsequent queries.

Source

async fn submit_blind_write( &self, conn_id: ConnectionId, target_id: CatalogItemId, target_global_id: GlobalId, diffs: Vec<(Row, Diff)>, statement_logging_id: Option<StatementLoggingId>, attempt_state: &FrontendWriteAttemptState, ) -> Result<Timestamp, AdapterError>

Submits frontier-independent diffs to group commit, which picks the write timestamp, and returns the timestamp the write committed at.

Only valid for diffs that do not depend on an observed read frontier: the write lands at a timestamp this caller does not choose.

Source

async fn create_internal_subscribe( &self, df_desc: Box<DataflowDescription<LirRelationExpr>>, cluster_id: ComputeInstanceId, replica_id: Option<ReplicaId>, depends_on: BTreeSet<GlobalId>, as_of: Timestamp, arity: usize, sink_id: GlobalId, owner: ActiveSubscribeOwner, start_time: EpochMillis, read_holds: ReadHolds, ) -> Result<SubscribeHandle, AdapterError>

Creates an internal subscribe, meaning one that writes no mz_subscriptions row. Returns a SubscribeHandle that ensures cleanup on drop.

Source

async fn run_occ_loop( &self, subscribe_handle: SubscribeHandle, target_id: CatalogItemId, target_global_id: GlobalId, kind: MutationKind, returning: Vec<MirScalarExpr>, max_result_size: u64, max_query_result_size: u64, row_set_finishing_seconds: Histogram, max_occ_retries: usize, table_desc: RelationDesc, write_conn_id: Option<ConnectionId>, statement_logging_id: Option<StatementLoggingId>, as_of: Timestamp, write_oracle: Option<Arc<dyn TimestampOracle<Timestamp> + Send + Sync>>, attempt_state: &FrontendWriteAttemptState, ) -> (usize, Result<OccOutcome, AdapterError>)

Run the OCC loop: drain the subscribe at as_of, apply the mutation, and submit the resulting diffs as a write.

Semantically a SELECT at target - 1 followed by an INSERT at target. write_oracle chooses target, the subscribe’s frontier certifies the payload is complete below it, and a target the target table has moved past comes back as WriteResult::TimestampPassed, whose next eligible timestamp the loop adopts. At most max_occ_retries attempts.

A subscribe that ends on its own has diffs no frontier can change, and those are returned as OccOutcome::Blind rather than written.

Contract on the caller, both ends of the read: the oracle’s read timestamp must be at or above as_of on entry, and an OccOutcome::NoRowsMatched must be linearized against its empty_as_of before the response goes out.

write_oracle is None only for a timestamp-independent selection. Such a statement reads at Timestamp::maximum(), so it observes no progress past its as_of and always leaves through the blind path.

Returns (retry_count, result) so the caller can record OCC retry metrics regardless of whether the operation succeeded or failed.

Source§

impl PeekClient

Source

pub(crate) fn new( coordinator_client: CoordinatorClient, catalog: &Arc<Catalog>, storage_collections: StorageCollectionsHandle, transient_id_gen: Arc<TransientIdGen>, optimizer_metrics: OptimizerMetrics, persist_client: PersistClient, statement_logging_frontend: StatementLoggingFrontend, occ_write_semaphore: Arc<Semaphore>, frontend_read_then_write_enabled: bool, group_commit_notifier: GroupCommitNotifier, read_only: bool, ) -> Self

Creates a PeekClient.

catalog seeds the catalog snapshot cache, so that the session’s first statements don’t need a Command::CatalogSnapshot round-trip.

Source

pub async fn ensure_compute_instance_client( &mut self, compute_instance: ComputeInstanceId, ) -> Result<InstanceClient, CollectionLookupError>

Source

pub async fn ensure_oracle( &mut self, timeline: Timeline, ) -> Result<&mut Arc<dyn TimestampOracle<Timestamp> + Send + Sync>, AdapterError>

Source

pub async fn catalog_snapshot(&mut self, context: &str) -> Arc<Catalog>

Fetch a snapshot of the catalog.

Serves from the session-side cache when the catalog’s transient revision is unchanged since the cached snapshot was taken (see Catalog::transient_revision_is_current). An unchanged revision means the cached snapshot is identical to what a fresh fetch would return. Otherwise falls back to a Command::CatalogSnapshot round-trip and re-populates the cache.

Cache misses record the round-trip time in the adapter metrics, labeled by context. Hits and misses are counted in catalog_snapshot_cache.

Source

pub(crate) async fn call_coordinator<T, F>( &self, f: F, ) -> Result<T, AdapterError>
where F: FnOnce(Sender<T>) -> Command,

Calls the coordinator and returns an error if it drops the response.

Source

pub(crate) fn coordinator_client(&self) -> &CoordinatorClient

The client for sending commands to the coordinator.

Source

pub async fn acquire_read_holds_and_least_valid_write( &mut self, id_bundle: &CollectionIdBundle, ) -> Result<(ReadHolds, Antichain<Timestamp>), CollectionLookupError>

Acquire read holds on the given compute/storage collections, and determine the smallest common valid write frontier among the specified collections.

Similar to Coordinator::acquire_read_holds and TimestampProvider::least_valid_write combined.

Note: Unlike the Coordinator/StorageController’s least_valid_write that treats sinks specially when fetching storage frontiers (see mz_storage_controller::collections_frontiers), we intentionally do not special‑case sinks here because peeks never read from sinks. Therefore, using StorageCollections::collections_frontiers is sufficient.

Note: self is taken &mut because of the lazy fetching in get_compute_instance_client.

Source

pub(crate) async fn implement_fast_path_peek_plan( &mut self, fast_path: FastPathPlan, timestamp: Timestamp, finishing: RowSetFinishing, compute_instance: ComputeInstanceId, target_replica: Option<ReplicaId>, intermediate_result_type: SqlRelationType, max_result_size: u64, max_returned_query_size: Option<u64>, row_set_finishing_seconds: Histogram, input_read_holds: ReadHolds, peek_stash_read_batch_size_bytes: usize, peek_stash_read_memory_budget_bytes: usize, conn_id: ConnectionId, depends_on: BTreeSet<GlobalId>, watch_set: Option<WatchSetCreation>, logging: &mut ExecutionLogging, ) -> Result<ExecuteResponse, AdapterError>

Implement a fast-path peek plan. This is similar to Coordinator::implement_peek_plan, but only for fast path peeks.

Note: self is taken &mut because of the lazy fetching in get_compute_instance_client.

Note: input_read_holds has holds for all inputs. For fast-path peeks, this includes the peek target. For slow-path peeks (to be implemented later), we’ll need to additionally call into the Controller to acquire a hold on the peek target after we create the dataflow.

For a constant peek the logging slot stays armed and the caller logs the end from the returned result. For a PeekExisting/PeekPersist peek, successful registration with the coordinator hands ownership of the end to the coordinator and the slot is defused here. That holds even when the subsequent client.peek() fails to issue.

Source

fn begin_statement_logging( &self, session: &mut Session, params: &Params, logging: &Arc<QCell<PreparedStatementLoggingInfo>>, catalog: &Catalog, lifecycle_timestamps: Option<LifecycleTimestamps>, ) -> StatementLoggingGuard

Begins a new statement execution log entry, sampling permitting.

Only ExecutionLogging::take_over may call this: an entry that exists without the session task owning its end would stay unfinished forever.

Source

pub(crate) fn log_began_execution( &self, record: StatementBeganExecutionRecord, mseh_update: Row, prepared_statement: Option<PreparedStatementEvent>, )

Log the beginning of statement execution.

Source

pub(crate) fn log_set_cluster( &self, id: StatementLoggingId, cluster_id: ClusterId, cluster_name: String, )

Log cluster selection for a statement.

Source

pub(crate) fn log_set_timestamp( &self, id: StatementLoggingId, timestamp: Timestamp, )

Log timestamp determination for a statement.

Source

pub(crate) fn log_set_transient_index_id( &self, id: StatementLoggingId, transient_index_id: GlobalId, )

Log transient index ID for a statement.

Source

pub(crate) fn log_lifecycle_event( &self, id: StatementLoggingId, event: StatementLifecycleEvent, )

Log a statement lifecycle event.

Trait Implementations§

Source§

impl Debug for PeekClient

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

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<U> As for U

Source§

fn as_<T>(self) -> T
where T: CastFrom<U>, U: Sized,

Casts self to type T. The semantics of numeric casting with the as operator are followed, so <T as As>::as_::<U> can be used in the same way as T as U for numeric conversions. Read more
Source§

impl<T> AsAny for T
where T: Any,

Source§

fn as_any(&self) -> &(dyn Any + 'static)

Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Source§

fn type_name(&self) -> &'static str

Gets the type name of self
Source§

impl<T> AsAny for T
where T: Any,

Source§

fn as_any(&self) -> &(dyn Any + 'static)

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, U> CastInto<U> for T
where U: CastFrom<T>,

Source§

fn cast_into(self) -> U

Performs the cast.
Source§

impl<T> Conv for T

Source§

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

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

impl<T> Downcast for T
where T: AsAny + ?Sized,

Source§

fn is<T>(&self) -> bool
where T: AsAny,

Returns true if the boxed type is the same as T. Read more
Source§

fn downcast_ref<T>(&self) -> Option<&T>
where T: AsAny,

Forward to the method defined on the type Any.
Source§

fn downcast_mut<T>(&mut self) -> Option<&mut T>
where T: AsAny,

Forward to the method defined on the type Any.
Source§

impl<T> FmtForward for T

Source§

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

Source§

impl<T> FutureExt for T

Source§

fn with_context(self, otel_cx: Context) -> WithContext<Self>

Attaches the provided Context to this type, returning a WithContext wrapper. Read more
Source§

fn with_current_context(self) -> WithContext<Self>

Attaches the current Context to this type, returning a WithContext wrapper. Read more
Source§

impl<T> Instrument for T

Source§

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

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

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.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<Unshared, Shared> IntoShared<Shared> for Unshared
where Shared: FromUnshared<Unshared>,

Source§

fn into_shared(self) -> Shared

Creates a shared type from an unshared type.
Source§

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
Source§

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

Source§

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

Source§

impl<T, U> OverrideFrom<Option<&T>> for U
where U: OverrideFrom<T>,

Source§

fn override_from(self, layer: &Option<&T>) -> U

Override the configuration represented by Self with values from the given layer.
Source§

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

Source§

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

§Example
println!("{}", value.linger());
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.

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

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

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

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

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

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

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

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

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

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

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

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

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

Create a new Painted with a default Style. Read more
Source§

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
Source§

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

Source§

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
Source§

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
Source§

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
Source§

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
Source§

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
Source§

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.
Source§

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.
Source§

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.
Source§

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> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

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

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<P, R> ProtoType<R> for P
where R: RustType<P>,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<'a, S, T> Semigroup<&'a S> for T
where T: Semigroup<S>,

Source§

fn plus_equals(&mut self, rhs: &&'a S)

The method of std::ops::AddAssign, for types that do not implement AddAssign.
Source§

impl<T> ServiceExt for T

Source§

fn map_response_body<F>(self, f: F) -> MapResponseBody<Self, F>
where Self: Sized,

Available on crate feature map-response-body only.
Apply a transformation to the response body. Read more
Source§

fn decompression(self) -> Decompression<Self>
where Self: Sized,

Available on crate features decompression-br or decompression-deflate or decompression-gzip or decompression-zstd only.
Decompress response bodies. Read more
Source§

fn trace_for_http(self) -> Trace<Self, SharedClassifier<ServerErrorsAsFailures>>
where Self: Sized,

Available on crate feature trace only.
High level tracing that classifies responses using HTTP status codes. Read more
Source§

fn trace_for_grpc(self) -> Trace<Self, SharedClassifier<GrpcErrorsAsFailures>>
where Self: Sized,

Available on crate feature trace only.
High level tracing that classifies responses using gRPC headers. Read more
Source§

fn follow_redirects(self) -> FollowRedirect<Self>
where Self: Sized,

Available on crate feature follow-redirect only.
Follow redirect resposes using the Standard policy. Read more
Source§

impl<T> Tap for T

Source§

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

Immutable access to a value. Read more
Source§

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

Mutable access to a value. Read more
Source§

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
Source§

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
Source§

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
Source§

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
Source§

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
Source§

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
Source§

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

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

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

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

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.
Source§

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.
Source§

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.
Source§

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.
Source§

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.
Source§

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> TryConv for T

Source§

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.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

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
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

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