pub struct AuthState { /* private fields */ }Expand description
Represents the authentication state of a client session
This type encapsulates the authentication status and username in a thread-safe manner using atomic operations and write-once semantics.
§Design
- Status:
AtomicBoolfor lock-free concurrent access - Username:
OnceLock<Arc<str>>for write-once, cheap-clone reads - Both fields are private and accessed through controlled methods
§Examples
use nntp_proxy::session::AuthState;
let auth_state = AuthState::new();
assert!(!auth_state.is_authenticated());
// After authentication
auth_state.mark_authenticated("user@example.com");
assert!(auth_state.is_authenticated());
assert_eq!(auth_state.username().unwrap(), "user@example.com");Implementations§
Source§impl AuthState
impl AuthState
Sourcepub const fn new() -> Self
pub const fn new() -> Self
Create a new unauthenticated state
§Examples
use nntp_proxy::session::AuthState;
let auth_state = AuthState::new();
assert!(!auth_state.is_authenticated());
assert!(auth_state.username().is_none());Sourcepub fn is_authenticated(&self) -> bool
pub fn is_authenticated(&self) -> bool
Check if the client has authenticated
This is a cheap operation (single atomic load) that can be called frequently without performance concerns.
§Examples
use nntp_proxy::session::AuthState;
let auth_state = AuthState::new();
assert!(!auth_state.is_authenticated());
auth_state.mark_authenticated("alice");
assert!(auth_state.is_authenticated());Sourcepub fn mark_authenticated(&self, username: impl Into<Arc<str>>)
pub fn mark_authenticated(&self, username: impl Into<Arc<str>>)
Mark the client as authenticated with the given username
This is a one-way operation - once authenticated, the state cannot be reverted. The username is stored in a write-once field.
§Arguments
username- The authenticated username
§Panics
Panics if called multiple times with different usernames (implementation
detail of OnceLock::set).
§Examples
use nntp_proxy::session::AuthState;
let auth_state = AuthState::new();
auth_state.mark_authenticated("bob");
assert!(auth_state.is_authenticated());
assert_eq!(auth_state.username().unwrap(), "bob");Sourcepub fn username(&self) -> Option<&str>
pub fn username(&self) -> Option<&str>
Get the authenticated username if available
Returns a cheap-to-clone Arc<str> reference to the username.
Returns None if the client has not authenticated yet.
§Examples
use nntp_proxy::session::AuthState;
let auth_state = AuthState::new();
assert!(auth_state.username().is_none());
auth_state.mark_authenticated("charlie");
let username = auth_state.username().unwrap();
assert_eq!(username, "charlie");
// Cloning is cheap (Arc reference count bump)
let username2 = username.clone();
assert_eq!(username2, "charlie");Sourcepub fn is_authenticated_or_skipped(&self, skip_check: bool) -> bool
pub fn is_authenticated_or_skipped(&self, skip_check: bool) -> bool
Check if authenticated, optionally bypassing the check
This method is useful when authentication checks can be skipped (e.g., when the backend doesn’t require authentication).
§Arguments
skip_check- Iftrue, always returnstrue. Otherwise, returns actual auth state.
§Examples
use nntp_proxy::session::AuthState;
let auth_state = AuthState::new();
assert!(!auth_state.is_authenticated_or_skipped(false));
assert!(auth_state.is_authenticated_or_skipped(true)); // Skips check
auth_state.mark_authenticated("dave");
assert!(auth_state.is_authenticated_or_skipped(false));
assert!(auth_state.is_authenticated_or_skipped(true));Trait Implementations§
Auto Trait Implementations§
impl !Freeze for AuthState
impl RefUnwindSafe for AuthState
impl Send for AuthState
impl Sync for AuthState
impl Unpin for AuthState
impl UnsafeUnpin for AuthState
impl UnwindSafe for AuthState
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
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