2021-06-18 20:53:06 +02:00

79 lines
2.5 KiB
Rust

//! Types describing event relations after MSC 2674, 2675, 2676, 2677.
use std::fmt::Debug;
use js_int::UInt;
use ruma_common::MilliSecondsSinceUnixEpoch;
use serde::{Deserialize, Serialize};
/// Summary of all reactions with the given key to an event.
#[derive(Clone, Debug, Default, Deserialize, PartialEq, Eq, Serialize)]
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
pub struct BundledReaction {
/// The key (emoji) used for reaction.
pub key: String,
/// Time of the bundled reaction being compiled on the server.
#[serde(skip_serializing_if = "Option::is_none")]
pub origin_server_ts: Option<MilliSecondsSinceUnixEpoch>,
/// Number of reactions.
pub count: UInt,
}
impl BundledReaction {
/// Creates a new `BundledReaction`.
pub fn new(
key: String,
origin_server_ts: Option<MilliSecondsSinceUnixEpoch>,
count: UInt,
) -> Self {
Self { key, origin_server_ts, count }
}
}
/// Type of bundled annotation.
#[derive(Clone, Debug, Deserialize, Serialize)]
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
#[serde(tag = "type")]
pub enum BundledAnnotation {
/// An emoji reaction and its count.
#[serde(rename = "m.reaction")]
Reaction(BundledReaction),
}
/// The first chunk of annotations with a token for loading more.
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
pub struct AnnotationChunk {
/// The first batch of bundled annotations.
pub chunk: Vec<BundledAnnotation>,
/// Token to receive the next annotation batch.
#[serde(skip_serializing_if = "Option::is_none")]
pub next_batch: Option<String>,
}
impl AnnotationChunk {
/// Creates a new `AnnotationChunk` with the given chunk and next batch token.
pub fn new(chunk: Vec<BundledAnnotation>, next_batch: Option<String>) -> Self {
Self { chunk, next_batch }
}
}
/// Precompiled list of relations to this event grouped by relation type.
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)]
pub struct Relations {
/// Annotation relations.
#[serde(rename = "m.annotation")]
pub annotation: Option<AnnotationChunk>,
}
impl Relations {
/// Creates a new `Relations` with the given annotation.
pub fn new(annotation: Option<AnnotationChunk>) -> Self {
Self { annotation }
}
}