Skip to main content

Service

Struct Service 

Source
pub struct Service {
    appservice_in_room_cache: RwLock<HashMap<OwnedRoomId, HashMap<String, bool>>>,
    services: Arc<OnceServices>,
    db: Data,
}
Expand description

Persistent room-membership cache and derived-index service.

Paired indexes answer membership queries in either direction, while room aggregates track counts and participating servers. A process-local cache memoizes appservice membership decisions.

Fields§

§appservice_in_room_cache: RwLock<HashMap<OwnedRoomId, HashMap<String, bool>>>§services: Arc<OnceServices>§db: Data

Implementations§

Source§

impl Service

Source

pub async fn update_membership(&self, __arg1: MembershipUpdate<'_>) -> Result

Applies one membership transition to the derived cache indexes.

Remote users are created before their transition is recorded, and paired forward and reverse rows change together. Joins can copy predecessor-room account data, while leaves can trigger push-badge refresh and configured forget behavior. Aggregate room counts are rebuilt only when requested by the update descriptor.

Source§

impl Service

Source

pub async fn update_joined_count(&self, room_id: &RoomId)

Rebuilds a room’s aggregate membership and server indexes.

Current join, invite, and knock rows are counted, and participating servers are reconciled in one database transaction. Source-stream errors are skipped, and the room’s appservice membership cache is invalidated after the transaction executes.

Source§

impl Service

Source

fn joined_count<'a>( &'a self, room_id: &'a RoomId, ) -> impl Future<Output = (u64, HashSet<OwnedServerName>)> + Send + 'a

Source§

impl Service

Source

pub(crate) fn mark_as_joined( &self, user_id: &UserId, room_id: &RoomId, count: PduCount, )

Writes the paired indexes for a current join transition.

Invite, leave, and knock rows for the same user and room are removed in the same transaction. This low-level helper skips once-joined bookkeeping, predecessor copying, and aggregate rebuilding performed by super::Service::update_membership.

Source§

impl Service

Source

pub(crate) fn mark_as_left( &self, user_id: &UserId, room_id: &RoomId, count: PduCount, )

Writes the paired indexes for a current leave transition.

The leave state starts as an empty event array, and join, invite, and knock rows are removed in the same transaction. This low-level helper skips leave policy and aggregate rebuilding performed by super::Service::update_membership.

Source§

impl Service

Source

pub(crate) fn mark_as_knocked( &self, user_id: &UserId, room_id: &RoomId, count: PduCount, knocked_state: StrippedRoomState, )

Writes the paired indexes for a current knock transition.

Missing stripped state is stored as an empty array, and join, invite, and leave rows are removed in the same transaction. This low-level helper skips aggregate rebuilding performed by super::Service::update_membership.

Source§

impl Service

Source

pub fn forget(&self, room_id: &RoomId, user_id: &UserId)

Forgets a user’s retained leave state for a room.

Only the paired leave rows are deleted; once-joined history and other room data remain untouched. Without a separate forget marker, absence of these rows is the durable forgotten state.

Source§

impl Service

Source

fn mark_as_once_joined(&self, user_id: &UserId, room_id: &RoomId)

Source§

impl Service

Source

pub(crate) async fn mark_as_invited( &self, user_id: &UserId, room_id: &RoomId, count: PduCount, last_state: StrippedRoomState, invite_via: Option<Vec<OwnedServerName>>, ) -> Result

Writes the paired indexes for a current invite transition.

Missing or empty stripped state preserves an existing nonempty invite row, while a new state replaces it. Nonempty routing hints are merged into the room’s aggregate hint row and committed with the membership indexes; other membership rows are removed in the same transaction.

Source§

impl Service

Source

async fn ensure_remote_user(&self, user_id: &UserId) -> Result

Source§

impl Service

Source

async fn handle_join( &self, room_id: &RoomId, user_id: &UserId, count: PduCount, ) -> Result

Source§

impl Service

Source

async fn copy_predecessor_data( &self, room_id: &RoomId, user_id: &UserId, ) -> Result

Source§

impl Service

Source

async fn copy_predecessor_tags( &self, room_id: &RoomId, user_id: &UserId, predecessor: &RoomId, )

Source§

impl Service

Source

async fn copy_predecessor_direct( &self, room_id: &RoomId, user_id: &UserId, predecessor: &RoomId, ) -> Result

Source§

impl Service

Source

async fn handle_leave( &self, room_id: &RoomId, user_id: &UserId, count: PduCount, )

Source§

impl Service

Source

pub(crate) async fn add_servers_invite_via( &self, txn: &mut Txn, room_id: &RoomId, servers: Vec<OwnedServerName>, )

Merges invitation routing hints into the caller’s membership transaction.

The existing reader exposes only the aggregate row’s final server, so older hints before that tail are not retained by this rewrite. Concurrent callers are not serialized and can overwrite one another’s read-modify-write result.

Source§

impl Service

Source

pub async fn servers_route_via( &self, room_id: &RoomId, ) -> Result<Vec<OwnedServerName>>

Selects up to five servers likely to remain useful for room routing.

The highest-power user’s server is considered first, followed by servers in descending joined-user count. The two sources are not deduplicated, and a missing power-level event simply omits the first candidate.

See https://spec.matrix.org/latest/appendices/#routing.

Source§

impl Service

Source

pub async fn most_powerful_user_server( &self, room_id: &RoomId, ) -> Option<OwnedServerName>

Returns the highest-power user’s server when its level is at least 50.

Missing, unreadable, or malformed power-level state returns None. Equal-power ties follow the underlying users map’s iteration order.

Source§

impl Service

Source

pub async fn popular_servers(&self, room_id: &RoomId) -> Vec<OwnedServerName>

Returns participating servers ordered by descending joined-user count.

Joined members are counted per server and the resulting servers are sorted. Read failures skipped by the membership stream can reduce the observed counts, and equal-count ordering is unspecified.

Source§

impl Service

Source

pub fn servers_invite_via<'a>( &'a self, room_id: &'a RoomId, ) -> impl Stream<Item = &ServerName> + Send + 'a

Streams the final routing hint from each matching aggregate row.

The current room-keyed representation stores several servers in one value, but this accessor exposes only the last decoded server and therefore at most one item per room. Storage and decoding failures are skipped. Yielded names borrow the cursor and are invalid after the next poll; consume or own each item before advancing.

Source§

impl Service

Source

pub async fn appservice_in_room( &self, room_id: &RoomId, appservice: &RegistrationInfo, ) -> bool

Tests whether an appservice participates in a room.

A registration participates when its sender or a namespace-matching user is joined. Results are memoized by room and registration identifier. Membership rebuilds and explicit clears remove cached entries, but do not fence an in-flight lookup from republishing an older result. Deleting a room’s membership indexes does not invalidate this cache.

Source§

impl Service

Source

pub fn get_appservice_in_room_cache_usage(&self) -> (usize, usize)

Returns the appservice membership cache’s room count and capacity.

The first value counts room-level map entries rather than individual registrations. The second reports the backing map’s current allocation capacity.

Source§

impl Service

Source

pub fn clear_appservice_in_room_cache(&self)

Clears every memoized appservice membership decision.

Persistent membership indexes are not changed. Later uncached lookups recompute and cache their answers from current joined membership, but a lookup already in flight can republish an older result after the clear.

Source§

impl Service

Source

pub fn remote_room_servers<'a>( &'a self, room_id: &'a RoomId, ) -> impl Stream<Item = &ServerName> + Send + 'a

Returns a stream of the remote servers participating in this room.

Our own server is filtered out, so the result is the federation fan-out set for the room. Items borrow the database cursor and are invalid after the next poll; consume or own each item before advancing. Storage errors are skipped as in Self::room_servers.

Source§

impl Service

Source

pub fn room_servers<'a>( &'a self, room_id: &'a RoomId, ) -> impl Stream<Item = &ServerName> + Send + 'a

Streams all servers recorded as participating in a room.

Storage and key-decoding failures are skipped. Each server name borrows the cursor and must be consumed or owned before the stream advances.

Source§

impl Service

Source

pub async fn server_in_room<'a>( &'a self, server: &'a ServerName, room_id: &'a RoomId, ) -> bool

Tests whether a server is recorded as participating in a room.

The reverse server-to-room index supplies the answer. Missing rows and storage failures both return false.

Source§

impl Service

Source

pub fn server_rooms<'a>( &'a self, server: &'a ServerName, ) -> impl Stream<Item = &RoomId> + Send + 'a

Streams all rooms recorded for a participating server.

Storage and key-decoding failures are skipped. Each room identifier borrows the cursor and must be consumed or owned before the stream advances.

Source§

impl Service

Source

pub fn servers(&self) -> impl Stream<Item = &ServerName> + Send + '_

Streams each server participating in at least one known room.

Adjacent duplicate prefixes are collapsed, yielding server names in ascending key order. Storage and decoding failures are skipped, and each item borrows the cursor until its next poll.

Source§

impl Service

Source

pub async fn server_shares_room(&self, server: &ServerName) -> bool

Tests whether a server participates in any known room.

The check stops at the first reverse-index row. Errors skipped by Self::server_rooms are indistinguishable from absence.

Source§

impl Service

Source

pub async fn server_sees_user( &self, server: &ServerName, user_id: &UserId, ) -> bool

Tests whether a server shares a joined room with a user.

The check searches rooms recorded for the server for any current user join. Index errors are treated as absent rows by the underlying helpers.

Source§

impl Service

Source

pub async fn user_sees_user(&self, user_a: &UserId, user_b: &UserId) -> bool

Tests whether two users share a currently joined room.

The check consumes only the first intersection result. Storage or decoding failures skipped by the joined-room streams can produce false.

Source§

impl Service

Source

pub fn get_shared_rooms<'a>( &'a self, user_a: &'a UserId, user_b: &'a UserId, ) -> impl Stream<Item = &RoomId> + Send + 'a

Streams rooms in which both users are currently joined.

The two key-ordered joined-room streams are intersected without materializing either set. Items borrow their source database cursor and are invalid after the next poll; consume or own each item before advancing. Read failures are skipped by the source streams.

Source§

impl Service

Source

pub fn room_members<'a>( &'a self, room_id: &'a RoomId, ) -> impl Stream<Item = &UserId> + Send + 'a

Streams all users currently indexed as joined to a room.

Storage and key-decoding failures are skipped. Each user identifier borrows the cursor and must be consumed or owned before the stream advances.

Source§

impl Service

Source

pub fn room_members_checked<'a>( &'a self, room_id: &'a RoomId, ) -> impl Stream<Item = Result<&'a UserId>> + Send + 'a

Streams joined users within the room’s exact encoded prefix.

Storage and user-key decoding failures are surfaced as error items rather than dropped. User IDs borrow the cursor and must be consumed or owned before advancing it.

Source§

impl Service

Source

pub async fn room_joined_count(&self, room_id: &RoomId) -> Result<u64>

Returns the stored number of users currently joined to a room.

The aggregate is rebuilt from membership indexes by Self::update_joined_count. Missing or malformed count rows return an error.

Source§

impl Service

Source

pub async fn room_invited_count(&self, room_id: &RoomId) -> Result<u64>

Returns the stored number of users currently invited to a room.

The aggregate is rebuilt from membership indexes by Self::update_joined_count. Missing or malformed count rows return an error.

Source§

impl Service

Source

pub async fn room_knocked_count(&self, room_id: &RoomId) -> Result<u64>

Returns the stored number of users currently knocking on a room.

The aggregate is rebuilt from membership indexes by Self::update_joined_count. Missing or malformed count rows return an error.

Source§

impl Service

Source

pub fn active_local_users_in_room<'a>( &'a self, room_id: &'a RoomId, ) -> impl Stream<Item = &UserId> + Send + 'a

Streams active local users currently joined to a room.

Local joined users are filtered through the user service, excluding guests and deactivated accounts. The stream otherwise inherits Self::room_members’s cursor lifetime and error policy.

Source§

impl Service

Source

pub fn local_users_in_room<'a>( &'a self, room_id: &'a RoomId, ) -> impl Stream<Item = &UserId> + Send + 'a

Streams all local users currently joined to a room.

Guest and deactivated accounts remain included. The stream otherwise inherits Self::room_members’s cursor lifetime and error policy.

Source§

impl Service

Source

pub fn local_users_invited_to_room<'a>( &'a self, room_id: &'a RoomId, ) -> impl Stream<Item = &UserId> + Send + 'a

Streams local users currently invited to a room.

Remote invitees are filtered out by server name. The stream otherwise inherits Self::room_members_invited’s cursor lifetime and error policy.

Source§

impl Service

Source

pub fn room_useroncejoined<'a>( &'a self, room_id: &'a RoomId, ) -> impl Stream<Item = &UserId> + Send + 'a

Streams user identifiers from the once-joined index under a room prefix.

Once-joined rows are currently written with user-first keys, while this accessor probes a room-first prefix, so the stored layout can yield no matches. Yielded user identifiers borrow the database cursor and are invalid after the next poll; consume or own each item before advancing. Storage and decoding failures are skipped.

Source§

impl Service

Source

pub fn room_members_invited<'a>( &'a self, room_id: &'a RoomId, ) -> impl Stream<Item = &UserId> + Send + 'a

Streams all users currently indexed as invited to a room.

Storage and key-decoding failures are skipped. Each user identifier borrows the cursor and must be consumed or owned before the stream advances.

Source§

impl Service

Source

pub fn room_members_knocked<'a>( &'a self, room_id: &'a RoomId, ) -> impl Stream<Item = &UserId> + Send + 'a

Streams all users currently indexed as knocking on a room.

Storage and key-decoding failures are skipped. Each user identifier borrows the cursor and must be consumed or owned before the stream advances.

Source§

impl Service

Source

pub async fn get_invite_count( &self, room_id: &RoomId, user_id: &UserId, ) -> Result<u64>

Returns the stream position associated with a user’s current invite.

This value identifies the membership transition rather than counting invitations. Missing or malformed index rows return an error.

Source§

impl Service

Source

pub async fn get_knock_count( &self, room_id: &RoomId, user_id: &UserId, ) -> Result<u64>

Returns the stream position associated with a user’s current knock.

This value identifies the membership transition rather than counting knocks. Missing or malformed index rows return an error.

Source§

impl Service

Source

pub async fn get_left_count( &self, room_id: &RoomId, user_id: &UserId, ) -> Result<u64>

Returns the stream position associated with a user’s current leave row.

This value identifies the membership transition rather than counting leaves. Missing or malformed index rows return an error.

Source§

impl Service

Source

pub async fn get_joined_count( &self, room_id: &RoomId, user_id: &UserId, ) -> Result<u64>

Returns the stream position associated with a user’s current join.

This value identifies the membership transition rather than counting joins. A join recorded before positions were stored holds an empty value and reads as zero. Missing or malformed index rows return an error.

Source§

impl Service

Source

pub fn all_user_memberships<'a>( &'a self, user_id: &'a UserId, ) -> impl Stream<Item = (MembershipState, &RoomId)> + Send + 'a

Streams every cached membership category for a user.

Join, leave, invite, and knock indexes are combined without a global ordering guarantee. Yielded room identifiers borrow their source database cursor and are invalid after the next poll; consume or own each item before advancing. Source-stream errors are skipped.

Source§

impl Service

Source

pub fn user_memberships<'a>( &'a self, user_id: &'a UserId, mask: Option<&[MembershipState]>, ) -> impl Stream<Item = (MembershipState, &RoomId)> + Send + 'a

Streams selected cached membership categories for a user.

A missing mask selects join, leave, invite, and knock; an empty mask selects none. Category streams are interleaved without a global ordering guarantee, and their storage errors are skipped. Yielded room identifiers borrow their source database cursor and are invalid after the next poll; consume or own each item before advancing.

Source§

impl Service

Source

pub fn rooms_joined<'a>( &'a self, user_id: &'a UserId, ) -> impl Stream<Item = &RoomId> + Send + 'a

Streams rooms in which a user is currently indexed as joined.

The raw user prefix preserves the established key scan. Storage and decoding failures are skipped, and each room identifier borrows the cursor until its next poll.

Source§

impl Service

Source

pub fn rooms_joined_checked<'a>( &'a self, user_id: &'a UserId, ) -> impl Stream<Item = Result<&'a RoomId>> + Send + 'a

Streams joined rooms within the user’s exact encoded prefix.

Storage and room-key decoding failures are surfaced as error items rather than dropped. Room IDs borrow the cursor and must be consumed or owned before advancing it.

Source§

impl Service

Source

pub fn rooms_invited<'a>( &'a self, user_id: &'a UserId, ) -> impl Stream<Item = &RoomId> + Send + 'a

Streams rooms in which a user is currently indexed as invited.

The raw user prefix preserves the established key scan. Storage and decoding failures are skipped, and each room identifier borrows the cursor until its next poll.

Source§

impl Service

Source

pub fn rooms_knocked<'a>( &'a self, user_id: &'a UserId, ) -> impl Stream<Item = &RoomId> + Send + 'a

Streams rooms in which a user is currently indexed as knocking.

The raw user prefix preserves the established key scan. Storage and decoding failures are skipped, and each room identifier borrows the cursor until its next poll.

Source§

impl Service

Source

pub fn rooms_left<'a>( &'a self, user_id: &'a UserId, ) -> impl Stream<Item = &RoomId> + Send + 'a

Streams rooms for which a user’s leave state is retained.

Forgotten rooms have no leave row and therefore do not appear. Storage and decoding failures are skipped, and each room identifier borrows the cursor until its next poll.

Source§

impl Service

Source

pub fn rooms_invited_state<'a>( &'a self, user_id: &'a UserId, ) -> impl Stream<Item = (OwnedRoomId, Vec<Raw<AnyStrippedStateEvent>>)> + Send + 'a

Streams stored stripped state for a user’s current invitations.

Each item owns its room identifier and decoded state vector. Storage, key-decoding, and state-deserialization failures are skipped.

Source§

impl Service

Source

pub fn rooms_knocked_state<'a>( &'a self, user_id: &'a UserId, ) -> impl Stream<Item = (OwnedRoomId, Vec<Raw<AnyStrippedStateEvent>>)> + Send + 'a

Streams stored stripped state for a user’s current knocks.

Each item owns its room identifier and decoded state vector. Storage, key-decoding, and state-deserialization failures are skipped.

Source§

impl Service

Source

pub fn rooms_left_state<'a>( &'a self, user_id: &'a UserId, ) -> impl Stream<Item = (OwnedRoomId, Vec<Raw<AnySyncStateEvent>>)> + Send + 'a

Streams stored state for rooms a user has left but not forgotten.

Both native state arrays and compatible single-event rows are accepted. Storage and key-decoding failures are skipped, while unusable state values yield an empty event vector for their room.

Source§

impl Service

Source

pub async fn invite_state( &self, user_id: &UserId, room_id: &RoomId, ) -> Result<Vec<Raw<AnyStrippedStateEvent>>>

Returns the stripped state stored for a user’s current invitation.

The value is decoded as an array of stripped state events. Missing rows, storage failures, and malformed state return an error.

Source§

impl Service

Source

pub async fn has_invite_state( &self, user_id: &UserId, room_id: &RoomId, ) -> Result<bool>

Whether the user’s stored invite carries any stripped state.

The row is probed raw rather than decoded through Self::invite_state, so no stripped state is materialized to answer it. A failed read is an error rather than an absent row.

Source§

impl Service

Source

pub async fn knock_state( &self, user_id: &UserId, room_id: &RoomId, ) -> Result<Vec<Raw<AnyStrippedStateEvent>>>

Returns the stripped state stored for a user’s current knock.

The value is decoded as an array of stripped state events. Missing rows, storage failures, and malformed state return an error.

Source§

impl Service

Source

pub async fn left_state( &self, user_id: &UserId, room_id: &RoomId, ) -> Result<Vec<Raw<AnyStrippedStateEvent>>>

Returns the cached state for a room a user has left.

Native state arrays and compatible single-event rows are normalized into one vector. Missing or unreadable rows return an error, while an unusable stored JSON shape is logged and becomes an empty vector.

Source§

impl Service

Source

pub async fn user_membership( &self, user_id: &UserId, room_id: &RoomId, ) -> Option<MembershipState>

Infers a user’s cached membership state for one room.

Current indexes take precedence in join, leave, knock, then invite order. When none exists, a once-joined marker is reported as Ban; no marker returns None. Read failures from the boolean probes are treated as absence.

Source§

impl Service

Source

pub async fn once_joined(&self, user_id: &UserId, room_id: &RoomId) -> bool

Tests whether a user has ever been marked as joined to a room.

The durable marker survives later membership transitions and explicit forget operations. Missing rows and storage failures both return false.

Source§

impl Service

Source

pub async fn is_joined_any<'a, Rooms>( &self, user_id: &UserId, room_ids: Rooms, ) -> bool
where Rooms: IntoIterator<Item = &'a RoomId> + Send, Rooms::IntoIter: Send,

Tests whether a user is currently joined to any of the given rooms.

The rooms are probed concurrently and the first joined room decides the answer; an empty set of rooms answers false. A probe that fails counts as not joined, as it does for Self::is_joined.

Source§

impl Service

Source

pub async fn is_joined<'a>( &'a self, user_id: &'a UserId, room_id: &'a RoomId, ) -> bool

Tests whether a user is currently indexed as joined to a room.

The user-to-room join index supplies the answer. Missing rows and storage failures both return false.

Source§

impl Service

Source

pub async fn is_knocked<'a>( &'a self, user_id: &'a UserId, room_id: &'a RoomId, ) -> bool

Tests whether a user is currently indexed as knocking on a room.

The stored knock-state row supplies the answer. Missing rows and storage failures both return false.

Source§

impl Service

Source

pub async fn is_invited(&self, user_id: &UserId, room_id: &RoomId) -> bool

Tests whether a user is currently indexed as invited to a room.

The stored invite-state row supplies the answer. Missing rows and storage failures both return false.

Source§

impl Service

Source

pub async fn is_left(&self, user_id: &UserId, room_id: &RoomId) -> bool

Tests whether a user’s leave state is currently retained for a room.

Explicitly forgotten rooms have no row and return false. Missing rows and storage failures are otherwise indistinguishable.

Source§

impl Service

Source

pub async fn delete_room_join_counts( &self, room_id: &RoomId, force: bool, ) -> Result

Deletes a room’s aggregate and paired membership indexes.

Aggregate rows and every paired index row found during enumeration are deleted in one database transaction. Local users’ leave rows survive unless force is true, while remote leave rows are always removed. Once-joined markers and appservice membership-cache entries are untouched. Storage errors encountered during enumeration are skipped and can leave index rows behind.

Trait Implementations§

Source§

impl Service for Service

Source§

fn build(args: &Args<'_>) -> Result<Arc<Self>>

Implement the construction of the service instance. Services are generally singletons so expect this to only be called once for a service type. Note that it may be called again after a server reload, but the prior instance will have been dropped first. Failure will shutdown the server with an error.
Source§

fn name(&self) -> &str

Return the name of the service. i.e. crate::service::make_name(std::module_path!())
Source§

fn worker<'async_trait>( self: Arc<Self>, ) -> Pin<Box<dyn Future<Output = Result> + Send + 'async_trait>>
where Self: 'async_trait,

Implement the service’s worker loop. The service manager spawns a task and calls this function after all services have been built.
Source§

fn interrupt<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Interrupt the service. This is sent to initiate a graceful shutdown. The service worker should return from its work loop.
Source§

fn clear_cache<'life0, 'async_trait>( &'life0 self, ) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait,

Clear any caches or similar runtime state.
Source§

fn memory_usage<'life0, 'life1, 'async_trait>( &'life0 self, _out: &'life1 mut (dyn Write + Send), ) -> Pin<Box<dyn Future<Output = Result> + Send + 'async_trait>>
where Self: 'async_trait, 'life0: 'async_trait, 'life1: 'async_trait,

Memory usage report in a markdown string.
Source§

fn unconstrained(&self) -> bool

Return true if the service worker opts out of the tokio cooperative budgeting. This can reduce tail latency at the risk of event loop starvation.

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

impl<T> DropFlavorWrapper<T> for T

§

type Flavor = MayDrop

The DropFlavor that [wrap]s T into Self
Source§

impl<T> ExpectInto for T

Source§

fn expect_into<Dst>(self) -> Dst
where Dst: TryFrom<Self>, Self: Sized,

Converts the value into Dst and returns the successful result. Read more
Source§

impl<T> Expected for T

Source§

fn expected_add(self, rhs: Self) -> Self
where Self: Sized + CheckedAdd,

Adds rhs with an expectation that the operation is valid. Read more
Source§

fn expected_sub(self, rhs: Self) -> Self
where Self: Sized + CheckedSub,

Subtracts rhs with an expectation that the operation is valid. Read more
Source§

fn expected_mul(self, rhs: Self) -> Self
where Self: Sized + CheckedMul,

Multiplies by rhs with an expectation that the operation is valid. Read more
Source§

fn expected_div(self, rhs: Self) -> Self
where Self: Sized + CheckedDiv,

Divides by rhs with an expectation that the operation is valid. Read more
Source§

fn expected_rem(self, rhs: Self) -> Self
where Self: Sized + CheckedRem,

Computes the remainder with an expectation that the operation is valid. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, W> HasTypeWitness<W> for T
where W: MakeTypeWitness<Arg = T>, T: ?Sized,

§

const WITNESS: W = W::MAKE

A constant of the type witness
§

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

§

const TYPE_EQ: TypeEq<T, <T as Identity>::Type> = TypeEq::NEW

Proof that Self is the same type as Self::Type, provides methods for casting between Self and Self::Type.
§

type Type = T

The same type as Self, used to emulate type equality bounds (T == U) with associated type equality constraints (T: Identity<Type = U>).
§

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.

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
§

impl<T> JsonCastable<CanonicalJsonValue> for T

§

impl<T> JsonCastable<Value> for T

§

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

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

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

Initializes a with the given initializer. Read more
§

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

Dereferences the given pointer. Read more
§

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

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

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

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

§

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
§

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

Source§

type Output = T

Should always be Self
§

impl<T> ServiceExt for T

§

fn add_extension<T>(self, value: T) -> AddExtension<Self, T>
where Self: Sized,

Add some shareable value to request extensions. Read more
§

fn compression(self) -> Compression<Self>
where Self: Sized,

Compresses response bodies. Read more
§

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

Decompress response bodies. Read more
§

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

High level tracing that classifies responses using HTTP status codes. Read more
§

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

High level tracing that classifies responses using gRPC headers. Read more
§

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

Follow redirect resposes using the Standard policy. Read more
§

fn sensitive_headers( self, headers: impl IntoIterator<Item = HeaderName>, ) -> SetSensitiveRequestHeaders<SetSensitiveResponseHeaders<Self>>
where Self: Sized,

Mark headers as sensitive on both requests and responses. Read more
§

fn sensitive_request_headers( self, headers: impl IntoIterator<Item = HeaderName>, ) -> SetSensitiveRequestHeaders<Self>
where Self: Sized,

Mark headers as sensitive on requests. Read more
§

fn sensitive_response_headers( self, headers: impl IntoIterator<Item = HeaderName>, ) -> SetSensitiveResponseHeaders<Self>
where Self: Sized,

Mark headers as sensitive on responses. Read more
§

fn override_request_header<M>( self, header_name: HeaderName, make: M, ) -> SetRequestHeader<Self, M>
where Self: Sized,

Insert a header into the request. Read more
§

fn append_request_header<M>( self, header_name: HeaderName, make: M, ) -> SetRequestHeader<Self, M>
where Self: Sized,

Append a header into the request. Read more
§

fn insert_request_header_if_not_present<M>( self, header_name: HeaderName, make: M, ) -> SetRequestHeader<Self, M>
where Self: Sized,

Insert a header into the request, if the header is not already present. Read more
§

fn override_response_header<M>( self, header_name: HeaderName, make: M, ) -> SetResponseHeader<Self, M>
where Self: Sized,

Insert a header into the response. Read more
§

fn append_response_header<M>( self, header_name: HeaderName, make: M, ) -> SetResponseHeader<Self, M>
where Self: Sized,

Append a header into the response. Read more
§

fn insert_response_header_if_not_present<M>( self, header_name: HeaderName, make: M, ) -> SetResponseHeader<Self, M>
where Self: Sized,

Insert a header into the response, if the header is not already present. Read more
§

fn catch_panic(self) -> CatchPanic<Self, DefaultResponseForPanic>
where Self: Sized,

Catch panics and convert them into 500 Internal Server responses. Read more
Source§

impl<T> Tried for T

Source§

fn try_add(self, rhs: Self) -> Result<Self, Error>
where Self: Sized + CheckedAdd,

Adds rhs with checked arithmetic. Read more
Source§

fn try_sub(self, rhs: Self) -> Result<Self, Error>
where Self: Sized + CheckedSub,

Subtracts rhs with checked arithmetic. Read more
Source§

fn try_mul(self, rhs: Self) -> Result<Self, Error>
where Self: Sized + CheckedMul,

Multiplies by rhs with checked arithmetic. Read more
Source§

fn try_div(self, rhs: Self) -> Result<Self, Error>
where Self: Sized + CheckedDiv,

Divides by rhs with checked arithmetic. Read more
Source§

fn try_rem(self, rhs: Self) -> Result<Self, Error>
where Self: Sized + CheckedRem,

Computes the remainder by rhs with checked arithmetic. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

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