use std::fmt::Debug;
#[cfg(any(feature = "unstable-msc2677", feature = "unstable-msc3440"))]
use js_int::UInt;
use serde::{Deserialize, Serialize};
#[cfg(feature = "unstable-msc3440")]
use super::AnySyncMessageLikeEvent;
#[cfg(feature = "unstable-msc3440")]
use crate::serde::Raw;
#[cfg(any(feature = "unstable-msc2676", feature = "unstable-msc2677"))]
use crate::MilliSecondsSinceUnixEpoch;
use crate::{serde::StringEnum, PrivOwnedStr};
#[cfg(feature = "unstable-msc2676")]
use crate::{OwnedEventId, OwnedUserId};
#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize)]
#[cfg(feature = "unstable-msc2677")]
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
pub struct BundledAnnotation {
#[serde(rename = "type")]
pub annotation_type: AnnotationType,
pub key: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub origin_server_ts: Option<MilliSecondsSinceUnixEpoch>,
pub count: UInt,
}
#[cfg(feature = "unstable-msc2677")]
impl BundledAnnotation {
pub fn new(annotation_type: AnnotationType, key: String, count: UInt) -> Self {
Self { annotation_type, key, count, origin_server_ts: None }
}
pub fn reaction(key: String, count: UInt) -> Self {
Self::new(AnnotationType::Reaction, key, count)
}
}
#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/string_enum.md"))]
#[derive(Clone, Debug, PartialEq, Eq, StringEnum)]
#[cfg(feature = "unstable-msc2677")]
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
pub enum AnnotationType {
#[ruma_enum(rename = "m.reaction")]
Reaction,
#[doc(hidden)]
_Custom(PrivOwnedStr),
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
#[cfg(feature = "unstable-msc2677")]
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
pub struct AnnotationChunk {
pub chunk: Vec<BundledAnnotation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub next_batch: Option<String>,
}
#[cfg(feature = "unstable-msc2677")]
impl AnnotationChunk {
pub fn new(chunk: Vec<BundledAnnotation>, next_batch: Option<String>) -> Self {
Self { chunk, next_batch }
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[cfg(feature = "unstable-msc2676")]
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
pub struct BundledReplacement {
pub event_id: OwnedEventId,
pub sender: OwnedUserId,
#[serde(skip_serializing_if = "Option::is_none")]
pub origin_server_ts: Option<MilliSecondsSinceUnixEpoch>,
}
#[cfg(feature = "unstable-msc2676")]
impl BundledReplacement {
pub fn new(event_id: OwnedEventId, sender: OwnedUserId) -> Self {
Self { event_id, sender, origin_server_ts: None }
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[cfg(feature = "unstable-msc3440")]
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
pub struct BundledThread {
pub latest_event: Box<Raw<AnySyncMessageLikeEvent>>,
pub count: UInt,
pub current_user_participated: bool,
}
#[cfg(feature = "unstable-msc3440")]
impl BundledThread {
pub fn new(
latest_event: Box<Raw<AnySyncMessageLikeEvent>>,
count: UInt,
current_user_participated: bool,
) -> Self {
Self { latest_event, count, current_user_participated }
}
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
pub struct Relations {
#[cfg(feature = "unstable-msc2677")]
#[serde(rename = "m.annotation")]
pub annotation: Option<AnnotationChunk>,
#[cfg(feature = "unstable-msc2676")]
#[serde(rename = "m.replace")]
pub replace: Option<BundledReplacement>,
#[cfg(feature = "unstable-msc3440")]
#[serde(rename = "io.element.thread", alias = "m.thread")]
pub thread: Option<BundledThread>,
}
impl Relations {
pub fn new() -> Self {
Self::default()
}
}
#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/string_enum.md"))]
#[derive(Clone, Debug, PartialEq, Eq, StringEnum)]
#[non_exhaustive]
pub enum RelationType {
#[cfg(feature = "unstable-msc2677")]
#[ruma_enum(rename = "m.annotation")]
Annotation,
#[cfg(feature = "unstable-msc2676")]
#[ruma_enum(rename = "m.replace")]
Replacement,
#[cfg(feature = "unstable-msc3440")]
#[ruma_enum(rename = "io.element.thread", alias = "m.thread")]
Thread,
#[doc(hidden)]
_Custom(PrivOwnedStr),
}