use crate::dialog_id::{DialogBuild, DialogFields, DialogFraming, DialogId};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub struct SipJoin(DialogId);
dialog_id_type!(SipJoin, to_tag, with_to_tag => "to-tag", from_tag, with_from_tag => "from-tag", early_only: false);
#[cfg(feature = "serde")]
serde_parts!(SipJoin, SipJoinParts);
#[cfg(feature = "serde")]
#[derive(serde::Serialize, serde::Deserialize)]
#[serde(deny_unknown_fields)]
struct SipJoinParts {
#[serde(deserialize_with = "crate::serde_parts::field::call_id")]
call_id: String,
#[serde(deserialize_with = "crate::serde_parts::field::to_tag")]
to_tag: String,
#[serde(deserialize_with = "crate::serde_parts::field::from_tag")]
from_tag: String,
#[serde(default, deserialize_with = "crate::params::deserialize_unchecked")]
params: crate::HeaderParams,
#[serde(default, deserialize_with = "crate::serde_parts::field::framing")]
framing: DialogFraming,
}
#[cfg(feature = "serde")]
impl SipJoinParts {
fn into_value(p: Self) -> Result<SipJoin, crate::ParseError> {
let fields = DialogFields {
call_id: p.call_id,
first_tag: p.to_tag,
second_tag: p.from_tag,
early_only: false,
params: p.params,
};
crate::dialog_id::reads_back(SipJoin::build(fields, p.framing))
}
fn from_value(j: SipJoin) -> Self {
SipJoinParts {
call_id: j
.call_id()
.to_string(),
to_tag: j
.to_tag()
.to_string(),
from_tag: j
.from_tag()
.to_string(),
params: j
.params()
.clone(),
framing: j.framing(),
}
}
}
impl DialogBuild for SipJoin {
fn build(fields: DialogFields, framing: DialogFraming) -> Self {
Self(DialogId::from_fields(fields, framing))
}
#[cfg(feature = "serde")]
fn dialog(&self) -> &DialogId {
&self.0
}
}
dialog_id_parse!(SipJoin);