diff --git a/ruma-client-api/src/r0/capabilities/get_capabilities.rs b/ruma-client-api/src/r0/capabilities/get_capabilities.rs index 0b04d48d..4efcaa1c 100644 --- a/ruma-client-api/src/r0/capabilities/get_capabilities.rs +++ b/ruma-client-api/src/r0/capabilities/get_capabilities.rs @@ -1,12 +1,15 @@ //! [GET /_matrix/client/r0/capabilities](https://matrix.org/docs/spec/client_server/r0.6.1#get-matrix-client-r0-capabilities) +use std::{borrow::Cow, collections::BTreeMap}; + use maplit::btreemap; use ruma_api::ruma_api; use ruma_identifiers::RoomVersionId; use ruma_serde::StringEnum; use serde::{Deserialize, Serialize}; -use serde_json::Value as JsonValue; -use std::collections::BTreeMap; +use serde_json::{ + from_value as from_json_value, to_value as to_json_value, Error, Value as JsonValue, +}; ruma_api! { metadata: { @@ -72,7 +75,7 @@ pub struct Capabilities { /// Any other custom capabilities that the server supports outside of the specification, /// labeled using the Java package naming convention and stored as arbitrary JSON values. #[serde(flatten)] - pub custom_capabilities: BTreeMap, + custom_capabilities: BTreeMap, } impl Capabilities { @@ -80,6 +83,31 @@ impl Capabilities { pub fn new() -> Self { Default::default() } + + /// Returns value of the given capability. + pub fn get(&self, capability: &str) -> Result>, Error> { + let value = match capability { + "m.change_password" => Some(Cow::Owned(to_json_value(&self.change_password)?)), + "m.room_versions" => Some(Cow::Owned(to_json_value(&self.room_versions)?)), + _ => match self.custom_capabilities.get(capability) { + Some(value) => Some(Cow::Borrowed(value)), + None => None, + }, + }; + Ok(value) + } + + /// Sets the given value to a capability. + pub fn set(&mut self, capability_label: &str, capability: JsonValue) -> Result<(), Error> { + match capability_label { + "m.change_password" => self.change_password = from_json_value(capability)?, + "m.room_versions" => self.room_versions = from_json_value(capability)?, + _ => { + self.custom_capabilities.insert(capability_label.to_owned(), capability); + } + } + Ok(()) + } } /// Information about the m.change_password capability