Struct tower_sessions::Session

source ยท
pub struct Session { /* private fields */ }
Expand description

A session which allows HTTP applications to associate key-value pairs with visitors.

Implementationsยง

sourceยง

impl Session

source

pub fn new( session_id: Option<Id>, store: Arc<impl SessionStore>, expiry: Option<Expiry> ) -> Session

Creates a new session with the session ID, store, and expiry.

This method is lazy and does not invoke the overhead of talking to the backing store.

Examples
use std::sync::Arc;

use tower_sessions::{MemoryStore, Session};

let store = Arc::new(MemoryStore::default());
Session::new(None, store, None);
source

pub async fn insert( &self, key: &str, value: impl Serialize ) -> Result<(), Error>

Inserts a impl Serialize value into the session.

Examples
use std::sync::Arc;

use tower_sessions::{MemoryStore, Session};

let store = Arc::new(MemoryStore::default());
let session = Session::new(None, store, None);

session.insert("foo", 42).await.unwrap();

let value = session.get::<usize>("foo").await.unwrap();
assert_eq!(value, Some(42));
Errors
source

pub async fn insert_value( &self, key: &str, value: Value ) -> Result<Option<Value>, Error>

Inserts a serde_json::Value into the session.

If the key was not present in the underlying map, None is returned and modified is set to true.

If the underlying map did have the key and its value is the same as the provided value, None is returned and modified is not set.

Examples
use std::sync::Arc;

use tower_sessions::{MemoryStore, Session};

let store = Arc::new(MemoryStore::default());
let session = Session::new(None, store, None);

let value = session
    .insert_value("foo", serde_json::json!(42))
    .await
    .unwrap();
assert!(value.is_none());

let value = session
    .insert_value("foo", serde_json::json!(42))
    .await
    .unwrap();
assert!(value.is_none());

let value = session
    .insert_value("foo", serde_json::json!("bar"))
    .await
    .unwrap();
assert_eq!(value, Some(serde_json::json!(42)));
Errors
  • If the session has not been hydrated and loading from the store fails, we fail with Error::Store.
source

pub async fn get<T>(&self, key: &str) -> Result<Option<T>, Error>

Gets a value from the store.

Examples
use std::sync::Arc;

use tower_sessions::{MemoryStore, Session};

let store = Arc::new(MemoryStore::default());
let session = Session::new(None, store, None);

session.insert("foo", 42).await.unwrap();

let value = session.get::<usize>("foo").await.unwrap();
assert_eq!(value, Some(42));
Errors
source

pub async fn get_value(&self, key: &str) -> Result<Option<Value>, Error>

Gets a serde_json::Value from the store.

Examples
use std::sync::Arc;

use tower_sessions::{MemoryStore, Session};

let store = Arc::new(MemoryStore::default());
let session = Session::new(None, store, None);

session.insert("foo", 42).await.unwrap();

let value = session.get_value("foo").await.unwrap().unwrap();
assert_eq!(value, serde_json::json!(42));
Errors
  • If the session has not been hydrated and loading from the store fails, we fail with Error::Store.
source

pub async fn remove<T>(&self, key: &str) -> Result<Option<T>, Error>

Removes a value from the store, retuning the value of the key if it was present in the underlying map.

Examples
use std::sync::Arc;

use tower_sessions::{MemoryStore, Session};

let store = Arc::new(MemoryStore::default());
let session = Session::new(None, store, None);

session.insert("foo", 42).await.unwrap();

let value: Option<usize> = session.remove("foo").await.unwrap();
assert_eq!(value, Some(42));

let value: Option<usize> = session.get("foo").await.unwrap();
assert!(value.is_none());
Errors
source

pub async fn remove_value(&self, key: &str) -> Result<Option<Value>, Error>

Removes a serde_json::Value from the session.

Examples
use std::sync::Arc;

use tower_sessions::{MemoryStore, Session};

let store = Arc::new(MemoryStore::default());
let session = Session::new(None, store, None);

session.insert("foo", 42).await.unwrap();
let value = session.remove_value("foo").await.unwrap().unwrap();
assert_eq!(value, serde_json::json!(42));

let value: Option<usize> = session.get("foo").await.unwrap();
assert!(value.is_none());
Errors
  • If the session has not been hydrated and loading from the store fails, we fail with Error::Store.
source

pub async fn clear(&self)

Clears the session of all data but does not delete it from the store.

Examples
use std::sync::Arc;

use tower_sessions::{MemoryStore, Session};

let store = Arc::new(MemoryStore::default());

let session = Session::new(None, store.clone(), None);
session.insert("foo", 42).await.unwrap();
assert!(!session.is_empty().await);

session.save().await.unwrap();

session.clear().await;

// Not empty! (We have an ID still.)
assert!(!session.is_empty().await);
// Data is cleared...
assert!(session.get::<usize>("foo").await.unwrap().is_none());

let session = Session::new(session.id(), store, None);
// ...but not deleted from the store.
assert_eq!(session.get::<usize>("foo").await.unwrap(), Some(42));
source

pub async fn is_empty(&self) -> bool

Returns true if there is no session ID and the session is empty.

Examples
use std::sync::Arc;

use tower_sessions::{session::Id, MemoryStore, Session};

let store = Arc::new(MemoryStore::default());

let session = Session::new(None, store.clone(), None);
// Empty if we have no ID and record is not loaded.
assert!(session.is_empty().await);

let session = Session::new(Some(Id::default()), store.clone(), None);
// Not empty if we have an ID but no record. (Record is not loaded here.)
assert!(!session.is_empty().await);

let session = Session::new(Some(Id::default()), store.clone(), None);
session.insert("foo", 42).await.unwrap();
// Not empty after inserting.
assert!(!session.is_empty().await);
session.save().await.unwrap();
// Not empty after saving.
assert!(!session.is_empty().await);

let session = Session::new(session.id(), store.clone(), None);
session.load().await.unwrap();
// Not empty after loading from store...
assert!(!session.is_empty().await);
// ...and not empty after accessing the session.
session.get::<usize>("foo").await.unwrap();
assert!(!session.is_empty().await);

let session = Session::new(session.id(), store.clone(), None);
session.delete().await.unwrap();
// Not empty after deleting from store...
assert!(!session.is_empty().await);
session.get::<usize>("foo").await.unwrap();
// ...but empty after trying to access the deleted session.
assert!(session.is_empty().await);

let session = Session::new(None, store, None);
session.insert("foo", 42).await.unwrap();
session.flush().await.unwrap();
// Empty after flushing.
assert!(session.is_empty().await);
source

pub fn id(&self) -> Option<Id>

Get the session ID.

Examples
use std::sync::Arc;

use tower_sessions::{session::Id, MemoryStore, Session};

let store = Arc::new(MemoryStore::default());

let session = Session::new(None, store.clone(), None);
assert!(session.id().is_none());

let id = Some(Id::default());
let session = Session::new(id, store, None);
assert_eq!(id, session.id());
source

pub fn expiry(&self) -> Option<Expiry>

Get the session expiry.

Examples
use std::sync::Arc;

use tower_sessions::{session::Expiry, MemoryStore, Session};

let store = Arc::new(MemoryStore::default());
let session = Session::new(None, store, None);

assert_eq!(session.expiry(), None);
source

pub fn set_expiry(&self, expiry: Option<Expiry>)

Set expiry give the given value.

This may be used within applications directly to alter the sessionโ€™s time to live.

Examples
use std::sync::Arc;

use time::OffsetDateTime;
use tower_sessions::{session::Expiry, MemoryStore, Session};

let store = Arc::new(MemoryStore::default());
let session = Session::new(None, store, None);

let expiry = Expiry::AtDateTime(OffsetDateTime::now_utc());
session.set_expiry(Some(expiry));

assert_eq!(session.expiry(), Some(expiry));
source

pub fn expiry_date(&self) -> OffsetDateTime

Get session expiry as OffsetDateTime.

Examples
use std::sync::Arc;

use time::{Duration, OffsetDateTime};
use tower_sessions::{MemoryStore, Session};

let store = Arc::new(MemoryStore::default());
let session = Session::new(None, store, None);

// Our default duration is two weeks.
let expected_expiry = OffsetDateTime::now_utc().saturating_add(Duration::weeks(2));

assert!(session.expiry_date() > expected_expiry.saturating_sub(Duration::seconds(1)));
assert!(session.expiry_date() < expected_expiry.saturating_add(Duration::seconds(1)));
source

pub fn expiry_age(&self) -> Duration

Get session expiry as Duration.

Examples
use std::sync::Arc;

use time::Duration;
use tower_sessions::{MemoryStore, Session};

let store = Arc::new(MemoryStore::default());
let session = Session::new(None, store, None);

let expected_duration = Duration::weeks(2);

assert!(session.expiry_age() > expected_duration.saturating_sub(Duration::seconds(1)));
assert!(session.expiry_age() < expected_duration.saturating_add(Duration::seconds(1)));
source

pub fn is_modified(&self) -> bool

Returns true if the session has been modified during the request.

Examples
use std::sync::Arc;

use tower_sessions::{MemoryStore, Session};

let store = Arc::new(MemoryStore::default());
let session = Session::new(None, store, None);

// Not modified initially.
assert!(!session.is_modified());

// Getting doesn't count as a modification.
session.get::<usize>("foo").await.unwrap();
assert!(!session.is_modified());

// Insertions and removals do though.
session.insert("foo", 42).await.unwrap();
assert!(session.is_modified());
source

pub async fn save(&self) -> Result<(), Error>

Saves the session record to the store.

Note that this method is generally not needed and is reserved for situations where the session store must be updated during the request.

Examples
use std::sync::Arc;

use tower_sessions::{MemoryStore, Session};

let store = Arc::new(MemoryStore::default());
let session = Session::new(None, store.clone(), None);

session.insert("foo", 42).await.unwrap();
session.save().await.unwrap();

let session = Session::new(session.id(), store, None);
assert_eq!(session.get::<usize>("foo").await.unwrap().unwrap(), 42);
Errors
source

pub async fn load(&self) -> Result<(), Error>

Loads the session record from the store.

Note that this method is generally not needed and is reserved for situations where the session must be updated during the request.

Examples
use std::sync::Arc;

use tower_sessions::{session::Id, MemoryStore, Session};

let store = Arc::new(MemoryStore::default());
let id = Some(Id::default());
let session = Session::new(id, store.clone(), None);

session.insert("foo", 42).await.unwrap();
session.save().await.unwrap();

let session = Session::new(session.id(), store, None);
session.load().await.unwrap();

assert_eq!(session.get::<usize>("foo").await.unwrap().unwrap(), 42);
Errors
  • If loading from the store fails, we fail with Error::Store.
source

pub async fn delete(&self) -> Result<(), Error>

Deletes the session from the store.

Examples
use std::sync::Arc;

use tower_sessions::{session::Id, MemoryStore, Session, SessionStore};

let store = Arc::new(MemoryStore::default());
let session = Session::new(Some(Id::default()), store.clone(), None);

// Save before deleting.
session.save().await.unwrap();

// Delete from the store.
session.delete().await.unwrap();

assert!(store.load(&session.id().unwrap()).await.unwrap().is_none());
Errors
  • If deleting from the store fails, we fail with Error::Store.
source

pub async fn flush(&self) -> Result<(), Error>

Flushes the session by removing all data contained in the session and then deleting it from the store.

Examples
use std::sync::Arc;

use tower_sessions::{MemoryStore, Session, SessionStore};

let store = Arc::new(MemoryStore::default());
let session = Session::new(None, store.clone(), None);

session.insert("foo", "bar").await.unwrap();
session.save().await.unwrap();

let id = session.id().unwrap();

session.flush().await.unwrap();

assert!(session.id().is_none());
assert!(session.is_empty().await);
assert!(store.load(&id).await.unwrap().is_none());
Errors
  • If deleting from the store fails, we fail with Error::Store.
source

pub async fn cycle_id(&self) -> Result<(), Error>

Cycles the session ID while retaining any data that was associated with it.

Using this method helps prevent session fixation attacks by ensuring a new ID is assigned to the session.

Examples
use std::sync::Arc;

use tower_sessions::{session::Id, MemoryStore, Session};

let store = Arc::new(MemoryStore::default());
let session = Session::new(None, store.clone(), None);

session.insert("foo", 42).await.unwrap();
session.save().await.unwrap();
let id = session.id();

let session = Session::new(session.id(), store.clone(), None);
session.cycle_id().await.unwrap();

assert!(!session.is_empty().await);
assert!(session.is_modified());

session.save().await.unwrap();

let session = Session::new(session.id(), store, None);

assert_ne!(id, session.id());
assert_eq!(session.get::<usize>("foo").await.unwrap().unwrap(), 42);
Errors
  • If deleting from the store fails or saving to the store fails, we fail with Error::Store.

Trait Implementationsยง

sourceยง

impl Clone for Session

sourceยง

fn clone(&self) -> Session

Returns a copy of the value. Read more
1.0.0 ยท sourceยง

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

Performs copy-assignment from source. Read more
sourceยง

impl Debug for Session

sourceยง

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

Formats the value using the given formatter. Read more
sourceยง

impl<S> FromRequestParts<S> for Session
where S: Sync + Send,

ยง

type Rejection = (StatusCode, &'static str)

If the extractor fails itโ€™ll use this โ€œrejectionโ€ type. A rejection is a kind of error that can be converted into a response.
sourceยง

fn from_request_parts<'life0, 'life1, 'async_trait>( parts: &'life0 mut Parts, _state: &'life1 S ) -> Pin<Box<dyn Future<Output = Result<Session, <Session as FromRequestParts<S>>::Rejection>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, Session: 'async_trait,

Perform the extraction.

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

ยง

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

Converts self into T using Into<T>. Read more
ยง

impl<T> FmtForward for T

ยง

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Formats each item in a sequence. Read more
sourceยง

impl<T> From<T> for T

sourceยง

fn from(t: T) -> T

Returns the argument unchanged.

ยง

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

ยง

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
ยง

impl<S, T> FromRequest<S, ViaParts> for T
where S: Send + Sync, T: FromRequestParts<S>,

ยง

type Rejection = <T as FromRequestParts<S>>::Rejection

If the extractor fails itโ€™ll use this โ€œrejectionโ€ type. A rejection is a kind of error that can be converted into a response.
ยง

fn from_request<'life0, 'async_trait>( req: Request<Body>, state: &'life0 S ) -> Pin<Box<dyn Future<Output = Result<T, <T as FromRequest<S, ViaParts>>::Rejection>> + Send + 'async_trait>>
where 'life0: 'async_trait, T: 'async_trait,

Perform the extraction.
ยง

impl<T> Instrument for T

ยง

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

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

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
sourceยง

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

sourceยง

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

ยง

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

ยง

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

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

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

Borrows self and passes that borrow into the pipe function. Read more
ยง

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

Mutably borrows self and passes that borrow into the pipe function. Read more
ยง

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

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

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

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

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

Borrows self, then passes self.as_ref() into the pipe function.
ยง

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

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

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

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

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

Mutably borrows self, then passes self.deref_mut() into the pipe function.
ยง

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
sourceยง

impl<T> Same for T

ยง

type Output = T

Should always be Self
ยง

impl<T> Tap for T

ยง

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

Immutable access to a value. Read more
ยง

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

Mutable access to a value. Read more
ยง

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
sourceยง

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

ยง

type Owned = T

The resulting type after obtaining ownership.
sourceยง

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
sourceยง

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

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

impl<T> TryConv for T

ยง

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

Attempts to convert self into T using TryInto<T>. Read more
sourceยง

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

ยง

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

ยง

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<V, T> VZip<V> for T
where V: MultiLane<T>,

ยง

fn vzip(self) -> V

ยง

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