use std::fmt::Debug;
use js_int::UInt;
use ruma_common::MilliSecondsSinceUnixEpoch;
use serde::{Deserialize, Serialize};
#[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, 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>,
}
impl Relations {
#[cfg(feature = "unstable-msc2677")]
pub fn new(annotation: Option<AnnotationChunk>) -> Self {
Self { annotation }
}
#[cfg(not(feature = "unstable-msc2677"))]
pub fn new() -> Self {
Self {}
}
}