use ruma_common::serde::StringEnum;
use crate::PrivOwnedStr;
#[derive(Clone, StringEnum)]
#[ruma_enum(rename_all = "lowercase")]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
pub enum UpdateAction {
Restart,
Send,
Cancel,
#[doc(hidden)]
_Custom(PrivOwnedStr),
}
pub mod unstable_v1;
pub mod unstable_v2 {
use ruma_common::{
api::{auth_scheme::NoAccessToken, request, response},
metadata,
};
use super::UpdateAction;
metadata! {
method: POST,
rate_limited: true,
authentication: NoAccessToken,
history: {
unstable("org.matrix.msc4140") => "/_matrix/client/unstable/org.matrix.msc4140/delayed_events/{delay_id}/{action}",
}
}
#[request]
pub struct Request {
#[ruma_api(path)]
pub delay_id: String,
#[ruma_api(path)]
pub action: UpdateAction,
}
impl Request {
pub fn new(delay_id: String, action: UpdateAction) -> Self {
Self { delay_id, action }
}
}
#[response]
pub struct Response {}
impl Response {
pub fn new() -> Self {
Self {}
}
}
#[cfg(all(test, feature = "client"))]
mod client_tests {
use std::borrow::Cow;
use ruma_common::api::{
MatrixVersion, OutgoingRequestExt as _, SupportedVersions, auth_scheme::SendAccessToken,
};
use serde_json::{Value as JsonValue, json};
use super::{Request, UpdateAction};
#[test]
fn serialize_update_delayed_event_request() {
let supported = SupportedVersions {
versions: [MatrixVersion::V1_1].into(),
features: Default::default(),
};
let request: http::Request<Vec<u8>> =
Request::new("1234".to_owned(), UpdateAction::Cancel)
.try_into_http_request(
"https://homeserver.tld",
SendAccessToken::None,
Cow::Owned(supported),
)
.unwrap();
let (parts, body) = request.into_parts();
assert_eq!(
"https://homeserver.tld/_matrix/client/unstable/org.matrix.msc4140/delayed_events/1234/cancel",
parts.uri.to_string()
);
assert_eq!("POST", parts.method.to_string());
assert_eq!(
json!({}),
serde_json::from_str::<JsonValue>(std::str::from_utf8(&body).unwrap()).unwrap()
);
}
}
#[cfg(all(test, feature = "server"))]
mod server_tests {
use ruma_common::api::IncomingRequestExt as _;
use super::{Request, UpdateAction};
#[test]
fn deserialize_update_delayed_events_request() {
let uri = http::Uri::builder()
.scheme("https")
.authority("matrix.org")
.path_and_query(
"/_matrix/client/unstable/org.matrix.msc4140/delayed_events/a_delay_id/send",
)
.build()
.unwrap();
let req = Request::try_from_http_request(
http::Request::builder().method("POST").uri(uri).body(&[] as &[u8]).unwrap(),
&["a_delay_id", "send"],
)
.unwrap();
assert_eq!(req.delay_id, "a_delay_id".to_owned());
assert_eq!(req.action, UpdateAction::Send);
}
}
}