use crate::binary::struct_trait::session::Session;
use crate::name::Name;
use crate::role::Role;
pub mod impl_a;
pub mod impl_b;
pub mod impl_c;
#[must_use]
#[derive(Debug)]
pub struct MeshedChannels<S1, S2, R, N>
where
S1: Session,
S2: Session,
R: Role,
N: Name,
{
#[doc(hidden)]
pub session1: S1,
#[doc(hidden)]
pub session2: S2,
#[doc(hidden)]
pub stack: R,
#[doc(hidden)]
pub name: N,
}
impl<S1: Session, S2: Session, R: Role, N: Name> Session for MeshedChannels<S1, S2, R, N> {
type Dual = MeshedChannels<<S1 as Session>::Dual, <S2 as Session>::Dual, <R as Role>::Dual, N>;
fn new() -> (Self, Self::Dual) {
let (sender_one, receiver_one) = S1::new();
let (sender_two, receiver_two) = S2::new();
let (role_one, role_two) = R::new();
let (name_one, _) = N::new();
let (name_two, _) = N::new();
(
MeshedChannels {
session1: sender_one,
session2: sender_two,
stack: role_one,
name: name_one,
},
MeshedChannels {
session1: receiver_one,
session2: receiver_two,
stack: role_two,
name: name_two,
},
)
}
fn head_str() -> String {
format!(
"{}\n{}\n{}\n{}",
<S1 as Session>::head_str(),
<S2 as Session>::head_str(),
<R as Role>::head_str(),
<N as Name>::head_str()
)
}
fn tail_str() -> String {
format!(
"{}<{}>\n{}<{}>\n{}<{}>\n{}<{}>",
<S1 as Session>::head_str(),
<S1 as Session>::tail_str(),
<S2 as Session>::head_str(),
<S2 as Session>::tail_str(),
<R as Role>::head_str(),
<R as Role>::tail_str(),
<N as Name>::head_str(),
<N as Name>::tail_str(),
)
}
fn self_head_str(&self) -> String {
format!(
"{}\n{}\n{}\n{}",
<S1 as Session>::head_str(),
<S2 as Session>::head_str(),
<R as Role>::head_str(),
<N as Name>::head_str()
)
}
fn self_tail_str(&self) -> String {
format!(
"{}<{}>\n{}<{}>\n{}<{}>\n{}<{}>",
<S1 as Session>::head_str(),
<S1 as Session>::tail_str(),
<S2 as Session>::head_str(),
<S2 as Session>::tail_str(),
<R as Role>::head_str(),
<R as Role>::tail_str(),
<N as Name>::head_str(),
<N as Name>::tail_str(),
)
}
}
impl<S1: Session, S2: Session, R: Role, N: Name> MeshedChannels<S1, S2, R, N> {
pub fn cancel(self) {
drop(self);
}
}