synapse_admin_api/experimental_features/enable_features/
v1.rs1use ruma::{
4 OwnedUserId,
5 api::{auth_scheme::AccessToken, request, response},
6 metadata,
7};
8use serde::{Deserialize, Serialize};
9
10metadata! {
11 method: PUT,
12 rate_limited: false,
13 authentication: AccessToken,
14 path: "/_synapse/admin/v1/experimental_features/{user_id}",
15}
16
17#[request]
18#[derive(Serialize, Deserialize, PartialEq)]
19pub struct Request {
20 #[ruma_api(path)]
22 pub user_id: OwnedUserId,
23 pub features: ExperimentalFeatures,
25}
26
27#[derive(Serialize, Deserialize, Clone, PartialEq, Debug, Default)]
28#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
29pub struct ExperimentalFeatures {
30 #[serde(skip_serializing_if = "Option::is_none")]
32 pub msc3026: Option<bool>,
33 #[serde(skip_serializing_if = "Option::is_none")]
35 pub msc3881: Option<bool>,
36 #[serde(skip_serializing_if = "Option::is_none")]
38 pub msc3967: Option<bool>,
39}
40
41impl ExperimentalFeatures {
42 pub fn new() -> Self {
44 Self::default()
45 }
46}
47
48#[response]
49#[derive(Default)]
50pub struct Response {}
51
52impl Request {
53 pub fn new(user_id: OwnedUserId, features: ExperimentalFeatures) -> Self {
56 Self { user_id, features }
57 }
58}
59
60impl Response {
61 pub fn new() -> Self {
63 Self {}
64 }
65}
66
67#[test]
68fn test_enable_features() {
69 use std::convert::TryFrom;
70
71 use ruma::UserId;
72
73 let features =
74 ExperimentalFeatures { msc3026: Option::from(true), msc3881: None, msc3967: None };
75
76 let user_id: &UserId =
77 <&UserId>::try_from("@carl:example.com").expect("Failed to create UserId.");
78
79 let request = Request::new(user_id.to_owned(), features);
81
82 let serialized = serde_json::to_string(&request).expect("Failed to serialize");
84 assert_eq!(serialized, "{\"user_id\":\"@carl:example.com\",\"features\":{\"msc3026\":true}}");
85
86 let deserialized: Request = serde_json::from_str(&serialized).expect("Failed to deserialize");
88 assert_eq!(deserialized, request);
89}