use time::{serde::rfc3339, OffsetDateTime};
#[serde_with::serde_as]
#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "camelCase")]
#[cfg_attr(feature = "api_client", doc = "")]
#[cfg_attr(
feature = "api_client",
doc = "Can be gotten with
[`Neos::get_sessions`](crate::api_client::Neos::get_sessions) &
[`Neos::get_session`](crate::api_client::Neos::get_session)."
)]
pub struct SessionInfo {
pub name: String,
#[serde_as(deserialize_as = "serde_with::DefaultOnNull")]
#[serde(default)]
pub description: String,
#[serde(rename = "correspondingWorldId")]
pub world: Option<crate::RecordId>,
pub tags: Vec<String>,
#[serde(rename = "sessionId")]
pub id: crate::id::Session,
#[serde(rename = "normalizedSessionId")]
pub normalized_id: String,
#[serde(rename = "hostUserId")]
pub host_id: Option<crate::id::User>,
pub host_machine_id: String,
pub host_username: String,
pub compatibility_hash: String,
pub neos_version: String,
#[serde(rename = "headlessHost")]
pub is_headless_host: bool,
#[serde(rename = "sessionURLs")]
pub urls: Vec<String>,
#[serde(rename = "sessionUsers")]
pub users: Vec<crate::SessionUser>,
pub thumbnail: Option<crate::AssetUrl>,
pub joined_users: u8,
pub active_users: u8,
pub total_joined_users: u8,
pub total_active_users: u8,
pub max_users: u8,
#[serde(rename = "mobileFriendly")]
pub is_mobile_friendly: bool,
#[serde(with = "rfc3339")]
pub session_begin_time: OffsetDateTime,
#[serde(rename = "lastUpdate")]
#[serde(with = "rfc3339")]
pub last_update_time: OffsetDateTime,
#[serde(default)]
#[serde(with = "crate::util::opt_rfc3339")]
pub away_since: Option<OffsetDateTime>,
pub access_level: crate::SessionAccessLevel,
#[serde_as(deserialize_as = "serde_with::DefaultOnNull")]
#[serde(default = "has_ended_default")]
pub has_ended: bool,
#[serde_as(deserialize_as = "serde_with::DefaultOnNull")]
#[serde(default)]
pub is_valid: bool,
#[serde_as(deserialize_as = "serde_with::DefaultOnNull")]
#[serde(default)]
pub parent_session_ids: Vec<crate::id::Session>,
#[serde_as(deserialize_as = "serde_with::DefaultOnNull")]
#[serde(default)]
pub nested_session_ids: Vec<crate::id::Session>,
}
const fn has_ended_default() -> bool {
true
}
#[must_use]
fn bad_xml_strip(str: &str) -> String {
let start_indexes = str.match_indices('<');
let end_indexes = str.match_indices('>');
let mut stripped_name = str.to_owned();
start_indexes.rev().zip(end_indexes.rev()).for_each(|((start, _), (end, _))| {
if start < end {
stripped_name.replace_range(start..=end, "");
}
});
stripped_name
}
impl SessionInfo {
#[must_use]
pub fn stripped_name(&self) -> String {
bad_xml_strip(&self.name)
}
}