use salvo::prelude::*;
use serde::{Deserialize, Serialize};
use crate::events::AnyTimelineEvent;
use crate::{
OwnedRoomId, PrivOwnedStr,
serde::{RawJson, StringEnum},
};
#[derive(ToParameters, Deserialize, Debug)]
pub struct ThreadsReqArgs {
#[salvo(parameter(parameter_in = Path))]
pub room_id: OwnedRoomId,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[salvo(parameter(parameter_in = Query))]
pub from: Option<String>,
#[serde(default, skip_serializing_if = "crate::serde::is_default")]
#[salvo(parameter(parameter_in = Query))]
pub include: IncludeThreads,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[salvo(parameter(parameter_in = Query))]
pub limit: Option<usize>,
}
#[derive(ToSchema, Serialize, Debug)]
pub struct ThreadsResBody {
pub chunk: Vec<RawJson<AnyTimelineEvent>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub next_batch: Option<String>,
}
impl ThreadsResBody {
pub fn new(chunk: Vec<RawJson<AnyTimelineEvent>>) -> Self {
Self {
chunk,
next_batch: None,
}
}
}
#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/string_enum.md"))]
#[derive(ToSchema, Clone, Default, PartialEq, Eq, PartialOrd, Ord, StringEnum)]
#[palpo_enum(rename_all = "lowercase")]
#[non_exhaustive]
pub enum IncludeThreads {
#[default]
All,
Participated,
#[doc(hidden)]
#[salvo(schema(skip))]
_Custom(PrivOwnedStr),
}