use super::common::State;
use super::media::MediaStatus;
#[derive(Debug, Clone, PartialEq, Eq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub struct ConferenceDescription {
#[cfg_attr(
feature = "serde",
serde(
rename = "display-text",
default,
skip_serializing_if = "Option::is_none"
)
)]
pub display_text: Option<String>,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
pub subject: Option<String>,
#[cfg_attr(
feature = "serde",
serde(rename = "free-text", default, skip_serializing_if = "Option::is_none")
)]
pub free_text: Option<String>,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
pub keywords: Option<String>,
#[cfg_attr(
feature = "serde",
serde(rename = "conf-uris", default, skip_serializing_if = "Option::is_none")
)]
pub conf_uris: Option<Uris>,
#[cfg_attr(
feature = "serde",
serde(
rename = "service-uris",
default,
skip_serializing_if = "Option::is_none"
)
)]
pub service_uris: Option<Uris>,
#[cfg_attr(
feature = "serde",
serde(
rename = "maximum-user-count",
default,
skip_serializing_if = "Option::is_none"
)
)]
pub maximum_user_count: Option<u32>,
#[cfg_attr(
feature = "serde",
serde(
rename = "available-media",
default,
skip_serializing_if = "Option::is_none"
)
)]
pub available_media: Option<AvailableMedia>,
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub struct AvailableMedia {
#[cfg_attr(
feature = "serde",
serde(rename = "entry", default, skip_serializing_if = "Vec::is_empty")
)]
pub entries: Vec<MediaDescription>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub struct MediaDescription {
#[cfg_attr(feature = "serde", serde(rename = "@label", default))]
pub label: String,
#[cfg_attr(
feature = "serde",
serde(
rename = "display-text",
default,
skip_serializing_if = "Option::is_none"
)
)]
pub display_text: Option<String>,
#[cfg_attr(
feature = "serde",
serde(rename = "type", default, skip_serializing_if = "Option::is_none")
)]
pub media_type: Option<String>,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
pub status: Option<MediaStatus>,
}
impl MediaDescription {
pub fn new(label: impl Into<String>) -> Self {
Self {
label: label.into(),
display_text: None,
media_type: None,
status: None,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub struct HostInfo {
#[cfg_attr(
feature = "serde",
serde(
rename = "display-text",
default,
skip_serializing_if = "Option::is_none"
)
)]
pub display_text: Option<String>,
#[cfg_attr(
feature = "serde",
serde(rename = "web-page", default, skip_serializing_if = "Option::is_none")
)]
pub web_page: Option<String>,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
pub uris: Option<Uris>,
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub struct ConferenceState {
#[cfg_attr(
feature = "serde",
serde(
rename = "user-count",
default,
skip_serializing_if = "Option::is_none"
)
)]
pub user_count: Option<u32>,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
pub active: Option<bool>,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
pub locked: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub struct Uris {
#[cfg_attr(
feature = "serde",
serde(rename = "@state", default, skip_serializing_if = "Option::is_none")
)]
pub state: Option<State>,
#[cfg_attr(
feature = "serde",
serde(rename = "entry", default, skip_serializing_if = "Vec::is_empty")
)]
pub entries: Vec<UriEntry>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub struct UriEntry {
#[cfg_attr(feature = "serde", serde(default))]
pub uri: String,
#[cfg_attr(
feature = "serde",
serde(
rename = "display-text",
default,
skip_serializing_if = "Option::is_none"
)
)]
pub display_text: Option<String>,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
pub purpose: Option<String>,
#[cfg_attr(
feature = "serde",
serde(default, skip_serializing_if = "Option::is_none")
)]
pub modified: Option<String>,
}
impl UriEntry {
pub fn new(uri: impl Into<String>) -> Self {
Self {
uri: uri.into(),
display_text: None,
purpose: None,
modified: None,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub struct SidebarsByVal {
#[cfg_attr(
feature = "serde",
serde(rename = "@state", default, skip_serializing_if = "Option::is_none")
)]
pub state: Option<State>,
#[cfg_attr(
feature = "serde",
serde(rename = "entry", default, skip_serializing_if = "Vec::is_empty")
)]
pub entries: Vec<super::ConferenceInfo>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn uri_entry_new() {
let entry = UriEntry::new("sip:conf@example.com");
assert_eq!(entry.uri, "sip:conf@example.com");
assert!(entry
.display_text
.is_none());
}
#[test]
fn conference_state_default() {
let state = ConferenceState::default();
assert!(state
.user_count
.is_none());
assert!(state
.active
.is_none());
assert!(state
.locked
.is_none());
}
}