Skip to main content

AuthPlugin

Struct AuthPlugin 

Source
pub struct AuthPlugin<U: UserModel = AuthUser> {
    pub user_model_name: Option<String>,
    pub default_routes_prefix: Option<String>,
    pub form_routes_prefix: Option<String>,
    pub user_in_templates: bool,
    /* private fields */
}
Expand description

The built-in authentication plugin, generic over the user model.

U defaults to AuthUser so AuthPlugin::default() continues to work in all existing code unchanged. Apps that need a custom user type opt in with one line:

.plugin(AuthPlugin::<CustomUser>::default())

§user_model_name

An optional informational string surfaced in OpenAPI schemas and the admin nav. Default None (resolved from U::NAME by the plugin itself when left empty). Set it explicitly when the type name is insufficient:

AuthPlugin::<TenantUser>::default().user_model_name("tenant_user")

Fields§

§user_model_name: Option<String>

Documentation-only: the human-readable name of the active user model. Consumed by admin / OpenAPI when surfacing the user table. The actual dispatch is entirely through the type parameter U.

§default_routes_prefix: Option<String>

When Some, mount the four built-in routes (register / login / logout / me) under this prefix. None skips them — the user either doesn’t want them or is rolling their own surface. Only settable on AuthPlugin<AuthUser> (the handlers FK into AuthTokenAuthUser); custom user models bring their own.

§form_routes_prefix: Option<String>

When Some, mount the 7 POST form-action routes (login, logout, signup, verify-email, resend, password-forgot, password-reset) under this prefix. Default None — opt in via AuthPlugin::with_form_routes / AuthPlugin::with_form_routes_at. Only settable on AuthPlugin<AuthUser>.

§user_in_templates: bool

When true, wrap the app router with user_context_layer so every template render has user in its global context: { is_authenticated, is_staff, username, ... }. Opt-in because it costs one DB read per request (cookie → session → user); a REST-only service has nothing to gain from it. Set via AuthPlugin::with_user_in_templates.

Implementations§

Source§

impl<U: UserModel> AuthPlugin<U>

Source

pub fn user_model_name(self, name: impl Into<String>) -> Self

Override the informational user-model name shown in admin / OpenAPI. Fluent builder method; the return type is Self so it chains.

Source

pub fn with_user_in_templates(self) -> Self

Mount the user_context_layer middleware globally so every HTML template gets user in its render context — anonymous requests see { is_authenticated: false }, authenticated requests see the full serialized AuthUser merged with is_authenticated: true. Lets templates write {% if user.is_staff %} without the consumer having to thread a user value into every handler’s context manually.

One DB read per request (cookie → session → user row). Off by default because REST-only services have no templates and the cost would be pure overhead. Turn it on for HTML-heavy apps:

AuthPlugin::<AuthUser>::default()
    .with_default_routes()
    .with_user_in_templates()   // ← here

Implemented via Plugin::wrap_router; the wrapper wraps the merged app router (including every other plugin’s routes), so admin / REST / playground / your own handlers all see the populated context with one builder call.

Source

pub fn password_validators(self, policy: PasswordPolicy) -> Self

Replace the default password-strength policy with a custom one. The full PasswordPolicy you pass becomes the active set at boot; the default validators are NOT merged in. Build the policy you want from scratch:

use umbral_auth::{AuthPlugin, PasswordPolicy, MinLengthValidator, CommonPasswordValidator};
AuthPlugin::<AuthUser>::default().password_validators(
    PasswordPolicy::empty()
        .with(Box::new(MinLengthValidator(12)))
        .with(Box::new(CommonPasswordValidator)),
)
Source

pub fn min_password_length(self, n: usize) -> Self

Convenience: keep the four default validators but change the minimum password length. Equivalent to building a PasswordPolicy with a MinLengthValidator of n plus the other three defaults.

Source

pub fn disable_password_validation(self) -> Self

Explicit opt-OUT: install an empty policy so NO password validation runs. Secure-by-default means an app that genuinely wants to accept any password — a throwaway demo, a migration importing legacy hashes with externally-validated plaintext — has to ask for it by name. Don’t reach for this to silence a failing test; fix the fixture’s password instead.

Source

pub fn login_throttle(self, max: usize, window: Duration) -> Self

Tune the login rate limit: max failed-or-not attempts per trailing window, keyed per IP + username. The default is 5 / 5 min — a budget that stops credential-stuffing dead while leaving room for a human who fat-fingers their password a couple of times (a successful login also clears the counter). Lower it for a high-security surface; raise it for a shared-NAT office where many users hit login from one IP.

AuthPlugin::<AuthUser>::default().login_throttle(10, Duration::from_secs(300))
Source

pub fn register_throttle(self, max: usize, window: Duration) -> Self

Tune the register rate limit: max account-creation attempts per trailing window, keyed per IP. The default is 10 / hour, which brakes mass automated signups without blocking a legitimate burst from one office.

Source

pub fn email_action_throttle(self, max: usize, window: Duration) -> Self

Tune the email-action rate limit: max attempts per trailing window, keyed per IP + email. Covers verify-email, resend-verification, and password-forgot. The default is 5 / hour — enough for a user who needs a couple of resends, but low enough to stop email-bombing / online code-guessing scripts dead.

Source

pub fn disable_throttle(self) -> Self

Explicit opt-OUT: turn login, register, and email-action throttling OFF entirely. Secure-by-default means an app that genuinely wants no rate limit — a load test, an internal tool behind its own gateway limiter — has to ask for it by name. Don’t reach for this to silence a throttled test; use a distinct IP/username per attempt or generous budget methods instead.

Source

pub fn mailer(self, m: impl AuthMailer + 'static) -> Self

Wire the mailer used by the verification + password-reset flows. Pass a type implementing AuthMailer or an async closure |mail| async { ... }. Unset → ConsoleMailer (stderr in dev).

AuthPlugin::<AuthUser>::default().mailer(|m: OutgoingMail| async move {
    umbral_email::send(&umbral_email::EmailMessage::new(m.subject, vec![m.to])
        .html_body(m.html).text_body(m.text)).await
        .map(|_| ()).map_err(|e| AuthMailError::Send(e.to_string()))
})
Source§

impl AuthPlugin<AuthUser>

Source

pub fn with_default_routes(self) -> Self

Mount the built-in /api/auth/{register,login,logout,me,…} surface. Same handlers that lived in the derive-demo example app, promoted to the framework so every app gets them with one line. JSON-only; UNIQUE-violation → 409; login returns both a Set-Cookie and a bearer token in one response so browsers and CLI clients share an endpoint.

The prefix resolves at build time: {api_base()}/auth, so it follows whatever base the REST plugin set (default /api/auth). Use Self::with_default_routes_at to fix a literal prefix.

Source

pub fn with_default_routes_at(self, prefix: impl Into<String>) -> Self

Same as Self::with_default_routes but the prefix is yours to pick. Useful when /api/auth collides with an existing surface or you want versioning (/v1/auth).

Source

pub fn require_verified_email(self) -> Self

Block login until the user’s email_verified_at column is stamped, and auto-send a verification code immediately on register. Off by default — the email_verified_at column is always tracked and the /verify-email + /resend-verification endpoints are always mounted; this flag only controls enforcement:

  • register: after a successful create_user, fires start_email_verification best-effort (a mail failure does NOT fail registration; it is logged at warn level). The 201 response is unchanged.
  • login: after authenticate succeeds and before minting the bearer token / session, checks email_verified_at IS NULL; returns 403 {error: "email_not_verified"} if so.

Available only on AuthPlugin<AuthUser> because enforcement is implemented inside the built-in handlers (which are AuthUser-only). Custom user models bring their own routes and their own enforcement.

Requires a working mailer in production — wire AuthPlugin::mailer alongside this builder, or users won’t receive the verification code and will be permanently locked out:

AuthPlugin::<AuthUser>::default()
    .with_default_routes()
    .mailer(my_smtp_mailer)
    .require_verified_email()
Source

pub fn with_form_routes(self) -> Self

Mount the 7 POST form-action auth routes (login, logout, signup, verify-email, resend, password-forgot, password-reset) under the default /auth prefix.

These are the form-action endpoints that developer-written HTML forms POST to: <form method="POST" action="/auth/login">. The framework never ships the pages themselves — the developer writes those with their own brand and design.

Each handler receives a form-encoded body, runs the same auth logic as the JSON surface (including throttle and enumeration-safe guards), sets a flash message via the session, then returns a 303 redirect.

Use Self::with_form_routes_at to mount under a custom prefix.

Source

pub fn with_form_routes_at(self, prefix: impl Into<String>) -> Self

Same as Self::with_form_routes but you choose the prefix.

AuthPlugin::<AuthUser>::default().with_form_routes_at("/accounts")

Trait Implementations§

Source§

impl<U: Debug + UserModel> Debug for AuthPlugin<U>

Source§

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

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

impl<U: UserModel> Default for AuthPlugin<U>

Source§

fn default() -> Self

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

impl<U: UserModel> Plugin for AuthPlugin<U>

Source§

fn wrap_router(&self, router: Router) -> Router

Mount user_context_layer on the full merged router when the user_in_templates flag is on (see AuthPlugin::with_user_in_templates). The layer reads the session cookie, hydrates the AuthUser, and pushes a serde_json representation into umbral::templates::CURRENT_USER for the duration of the request — every template render downstream gets user in its global context with no per-handler plumbing.

Off by default — see the builder method’s docstring for the “why” (one DB read per request, pointless for REST-only apps).

Source§

fn on_ready(&self, _ctx: &AppContext) -> Result<(), PluginError>

Seal the password-strength policy into the ambient OnceLock so the free-function helpers (create_user, set_password) can read it without a handle to Self. Mirrors the sessions plugin’s SLIDING_EXPIRY_ENABLED install.

A None configured policy means “use the secure default” — NOT “off” — so we install PasswordPolicy::default in that case. disable_password_validation is the only path that installs an empty policy. The install is idempotent (first boot wins), matching the ambient-pool contract.

Source§

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

A stable identifier. Used as the key in the migration tracking table, in dependency lists, and as the directory name under migrations/. Plugin names live in the same namespace as migrate::APP_PLUGIN_NAME ("app"), so user crates must not pick the name "app".
Source§

fn models(&self) -> Vec<ModelMeta>

The plugin’s models, in declaration order. The M7 migration engine collects these across every registered plugin and uses them as the diff target for makemigrations. Read more
Source§

fn templates_dirs(&self) -> Vec<PathBuf>

Template directories this plugin contributes. Read more
Source§

fn commands(&self) -> Vec<Box<dyn PluginCommand>>

CLI subcommands the plugin contributes. Read more
Source§

fn routes(&self) -> Router

The plugin’s HTTP routes. Merged into the app router after the hand-written one passed to AppBuilder::routes(). Plugins choose their own path prefixes (spec 02 §“What a plugin can contribute”: routes are flat, not auto-prefixed).
Source§

fn route_paths(&self) -> Vec<RouteSpec>

Declared URL routes this plugin contributes — a companion to routes used for surfacing route lists outside the request flow (currently: the dev-mode default 404 page). axum doesn’t expose its internal route table, so plugins report what they declare here; the framework treats this as informational only — not a source of truth for routing. Read more
Source§

fn openapi_paths(&self) -> Vec<(String, Value)>

OpenAPI path items the plugin contributes. Returned as a Vec<(path, value)> where path is the URL template (/api/auth/login, /api/foo/{id}) and value is the matching OpenAPI 3.0 Path Item Object serialised as a serde_json::Value. Read more
Source§

fn dependencies(&self) -> &'static [&'static str]

Names of plugins that must load before this one. The App::builder() topological sort uses this; cycles surface as BuildError::PluginCycle. The default is no dependencies.
Source§

fn system_checks(&self) -> Vec<SystemCheck>

Boot-time checks the plugin needs to pass. Run in phase 4 of App::build() alongside the framework’s built-in checks. Severity::Error blocks boot; Severity::Warning logs and continues.
Source§

fn provides_storage(&self) -> bool

true if this plugin registers a Storage backend (e.g. StoragePlugin, which calls crate::storage::set_storage in Plugin::on_ready). Read more
Source§

fn database(&self) -> Option<&'static str>

The database alias every model this plugin contributes should be read from and written to. Returns None to use the "default" pool (the same one umbral::db::pool() returns). Read more
Source§

fn template_registrars( &self, ) -> Vec<Box<dyn Fn(&mut Environment<'static>) + Sync + Send>>

Custom template tags / filters this plugin contributes (feature #67 - a loadable template tag/filter library). Read more
Source§

fn middleware(&self) -> Vec<Arc<dyn Middleware>>

Framework-level request/response middleware this plugin contributes (feature #68). Read more
Source§

fn static_files(&self) -> Vec<StaticFile>

Static files the plugin ships baked into its binary. Read more
Source§

fn static_dirs(&self) -> Vec<StaticDir>

On-disk source directories this plugin contributes to the unified static pipeline. Read more
Source§

fn static_root_dirs(&self) -> Vec<PathBuf>

On-disk directories served at the root of static_url — with no namespace segment. Read more
Source§

fn api_endpoints(&self) -> Vec<ApiEndpoint>

Callable HTTP endpoints this plugin wants advertised in a machine-readable index (e.g. a REST API root, or a client’s service-discovery fetch). Read more

Auto Trait Implementations§

§

impl<U = AuthUser> !Freeze for AuthPlugin<U>

§

impl<U> RefUnwindSafe for AuthPlugin<U>
where U: RefUnwindSafe,

§

impl<U> Send for AuthPlugin<U>

§

impl<U> Sync for AuthPlugin<U>

§

impl<U> Unpin for AuthPlugin<U>

§

impl<U> UnsafeUnpin for AuthPlugin<U>

§

impl<U> UnwindSafe for AuthPlugin<U>
where U: 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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,

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> 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> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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