pub struct SessionBuilder<P, V, Target, State = NotReady, M = SubscriptionManager>where
P: TokenProvider + Send + Sync + Clone + 'static,
V: Verifier + Send + Sync + Clone + 'static,
M: SubscriptionOps,{ /* private fields */ }Expand description
Unified generic builder for constructing session-related types.
This builder eliminates the need for multiple constructors with many parameters by providing a fluent, type-safe API for building session components.
§Type Safety
The builder uses compile-time type states to ensure:
- All required fields are set before building (enforced by
ready()) - The correct build method is available for each target type
- No runtime panics due to missing fields
§Supported Types
-
SessionController- High-level controller that wraps participant/moderator- Use
SessionBuilder::for_controller()orSessionController::builder() - Automatically creates moderator or participant based on config
- Use
-
SessionParticipant- Direct participant construction (advanced)- Use
SessionBuilder::for_participant()orSessionParticipant::builder()
- Use
-
SessionModerator- Direct moderator construction (advanced)- Use
SessionBuilder::for_moderator()orSessionModerator::builder()
- Use
§Examples
§Building a SessionController (Recommended)
use agntcy_slim_session::{SessionBuilder, SessionController};
let controller = SessionController::builder()
.with_id(1)
.with_source(source_name)
.with_destination(dest_name)
.with_config(session_config)
.with_identity_provider(provider)
.with_identity_verifier(verifier)
.with_storage_path(storage_path)
.with_tx(transmitter)
.with_tx_to_session_layer(tx_channel)
.ready()? // Validates all fields are set
.build() // Constructs the SessionController
.await?;§Building a SessionParticipant (Advanced)
let participant = SessionBuilder::for_participant()
.with_id(1)
.with_source(name)
.with_destination(dest)
.with_config(config)
.with_identity_provider(provider)
.with_identity_verifier(verifier)
.with_storage_path(path)
.with_tx(tx)
.with_tx_to_session_layer(tx_channel)
.ready()?
.build()
.await;§Building a SessionModerator (Advanced)
let moderator = SessionModerator::builder()
.with_id(session_id)
.with_source(moderator_name)
.with_destination(group_name)
.with_config(moderator_config)
.with_identity_provider(provider)
.with_identity_verifier(verifier)
.with_storage_path(storage_path)
.with_tx(tx)
.with_tx_to_session_layer(tx_channel)
.ready()?
.build()
.await;Implementations§
Source§impl<P, V, Target, M> SessionBuilder<P, V, Target, NotReady, M>where
P: TokenProvider + Send + Sync + Clone + 'static,
V: Verifier + Send + Sync + Clone + 'static,
M: SubscriptionOps,
impl<P, V, Target, M> SessionBuilder<P, V, Target, NotReady, M>where
P: TokenProvider + Send + Sync + Clone + 'static,
V: Verifier + Send + Sync + Clone + 'static,
M: SubscriptionOps,
pub fn with_id(self, id: u32) -> Self
pub fn with_source(self, source: ProtoName) -> Self
pub fn with_destination(self, destination: ProtoName) -> Self
pub fn with_config(self, config: SessionConfig) -> Self
pub fn with_identity_provider(self, identity_provider: P) -> Self
pub fn with_identity_verifier(self, identity_verifier: V) -> Self
pub fn with_slim_tx(self, slim_tx: SlimChannelSender) -> Self
pub fn with_app_tx( self, app_tx: UnboundedSender<Result<ProtoMessage, SessionError>>, ) -> Self
pub fn with_tx_to_session_layer( self, tx_to_session_layer: Sender<Result<SessionMessage, SessionError>>, ) -> Self
pub fn with_graceful_shutdown_timeout(self, timeout: Duration) -> Self
pub fn with_direction(self, direction: Direction) -> Self
Sourcepub fn with_subscription_manager<N: SubscriptionOps>(
self,
manager: N,
) -> SessionBuilder<P, V, Target, NotReady, N>
pub fn with_subscription_manager<N: SubscriptionOps>( self, manager: N, ) -> SessionBuilder<P, V, Target, NotReady, N>
Set a custom subscription manager. This method changes the manager
type M, so it returns a new builder type SessionBuilder<P, V, Target, NotReady, N>. Call this before ready().
pub fn with_service_id(self, service_id: String) -> Self
pub fn ready( self, ) -> Result<SessionBuilder<P, V, Target, Ready, M>, SessionError>
Source§impl<P, V, M> SessionBuilder<P, V, ForController, NotReady, M>where
P: TokenProvider + Send + Sync + Clone + 'static,
V: Verifier + Send + Sync + Clone + 'static,
M: SubscriptionOps,
impl<P, V, M> SessionBuilder<P, V, ForController, NotReady, M>where
P: TokenProvider + Send + Sync + Clone + 'static,
V: Verifier + Send + Sync + Clone + 'static,
M: SubscriptionOps,
Sourcepub fn for_controller() -> Self
pub fn for_controller() -> Self
Create a new builder for constructing a SessionController
Source§impl<P, V, M> SessionBuilder<P, V, ForParticipant, NotReady, M>where
P: TokenProvider + Send + Sync + Clone + 'static,
V: Verifier + Send + Sync + Clone + 'static,
M: SubscriptionOps,
impl<P, V, M> SessionBuilder<P, V, ForParticipant, NotReady, M>where
P: TokenProvider + Send + Sync + Clone + 'static,
V: Verifier + Send + Sync + Clone + 'static,
M: SubscriptionOps,
Sourcepub fn for_participant() -> Self
pub fn for_participant() -> Self
Create a new builder for constructing a SessionParticipant
Source§impl<P, V, M> SessionBuilder<P, V, ForModerator, NotReady, M>where
P: TokenProvider + Send + Sync + Clone + 'static,
V: Verifier + Send + Sync + Clone + 'static,
M: SubscriptionOps,
impl<P, V, M> SessionBuilder<P, V, ForModerator, NotReady, M>where
P: TokenProvider + Send + Sync + Clone + 'static,
V: Verifier + Send + Sync + Clone + 'static,
M: SubscriptionOps,
Sourcepub fn for_moderator() -> Self
pub fn for_moderator() -> Self
Create a new builder for constructing a SessionModerator
Source§impl<P, V, M> SessionBuilder<P, V, ForController, Ready, M>where
P: TokenProvider + Send + Sync + Clone + 'static,
V: Verifier + Send + Sync + Clone + 'static,
M: SubscriptionOps,
impl<P, V, M> SessionBuilder<P, V, ForController, Ready, M>where
P: TokenProvider + Send + Sync + Clone + 'static,
V: Verifier + Send + Sync + Clone + 'static,
M: SubscriptionOps,
Sourcepub fn build(self) -> Result<SessionController, SessionError>
pub fn build(self) -> Result<SessionController, SessionError>
Build a SessionController
Automatically determines whether to create a moderator or participant
internally based on the session configuration’s initiator flag.
Auto Trait Implementations§
impl<P, V, Target, State, M> Freeze for SessionBuilder<P, V, Target, State, M>
impl<P, V, Target, State, M> RefUnwindSafe for SessionBuilder<P, V, Target, State, M>where
P: RefUnwindSafe,
V: RefUnwindSafe,
M: RefUnwindSafe,
Target: RefUnwindSafe,
State: RefUnwindSafe,
impl<P, V, Target, State, M> Send for SessionBuilder<P, V, Target, State, M>
impl<P, V, Target, State, M> Sync for SessionBuilder<P, V, Target, State, M>
impl<P, V, Target, State, M> Unpin for SessionBuilder<P, V, Target, State, M>
impl<P, V, Target, State, M> UnsafeUnpin for SessionBuilder<P, V, Target, State, M>
impl<P, V, Target, State, M> UnwindSafe for SessionBuilder<P, V, Target, State, M>
Blanket Implementations§
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
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 moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request