use std::fmt::Debug;
use js_int::UInt;
use serde::{Deserialize, Serialize};
use super::AnySyncMessageLikeEvent;
use crate::{serde::Raw, MilliSecondsSinceUnixEpoch, OwnedEventId, OwnedUserId};
#[derive(Clone, Debug, Default, Deserialize, PartialEq, Eq, Serialize)]
#[cfg(feature = "unstable-msc2677")]
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
pub struct BundledReaction {
pub key: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub origin_server_ts: Option<MilliSecondsSinceUnixEpoch>,
pub count: UInt,
}
#[cfg(feature = "unstable-msc2677")]
impl BundledReaction {
pub fn new(
key: String,
origin_server_ts: Option<MilliSecondsSinceUnixEpoch>,
count: UInt,
) -> Self {
Self { key, origin_server_ts, count }
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[cfg(feature = "unstable-msc2677")]
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
#[serde(tag = "type")]
pub enum BundledAnnotation {
#[serde(rename = "m.reaction")]
Reaction(BundledReaction),
}
#[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()
}
}