#![doc(html_favicon_url = "https://www.ruma.io/favicon.ico")] #![doc(html_logo_url = "https://www.ruma.io/images/logo.png")] //! (De)serializable types for the [Matrix Application Service API][appservice-api]. //! These types can be shared by application service and server code. //! //! [appservice-api]: https://spec.matrix.org/v1.4/application-service-api/ #![warn(missing_docs)] use serde::{Deserialize, Serialize}; pub mod event; pub mod query; pub mod thirdparty; /// A namespace defined by an application service. /// /// Used for [appservice registration](https://spec.matrix.org/v1.4/application-service-api/#registration). #[derive(Clone, Debug, Serialize, Deserialize)] #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] pub struct Namespace { /// Whether this application service has exclusive access to events within this namespace. pub exclusive: bool, /// A regular expression defining which values this namespace includes. pub regex: String, } impl Namespace { /// Creates a new `Namespace` with the given exclusivity and regex pattern. pub fn new(exclusive: bool, regex: String) -> Self { Namespace { exclusive, regex } } } /// Namespaces defined by an application service. /// /// Used for [appservice registration](https://spec.matrix.org/v1.4/application-service-api/#registration). #[derive(Clone, Debug, Default, Serialize, Deserialize)] #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] pub struct Namespaces { /// Events which are sent from certain users. #[serde(default, skip_serializing_if = "Vec::is_empty")] pub users: Vec, /// Events which are sent in rooms with certain room aliases. #[serde(default, skip_serializing_if = "Vec::is_empty")] pub aliases: Vec, /// Events which are sent in rooms with certain room IDs. #[serde(default, skip_serializing_if = "Vec::is_empty")] pub rooms: Vec, } impl Namespaces { /// Creates a new `Namespaces` instance with empty namespaces for `users`, `aliases` and /// `rooms` (none of them are explicitly required) pub fn new() -> Self { Self::default() } } /// Information required in the registration yaml file that a homeserver needs. /// /// To create an instance of this type, first create a `RegistrationInit` and convert it via /// `Registration::from` / `.into()`. /// /// Used for [appservice registration](https://spec.matrix.org/v1.4/application-service-api/#registration). #[derive(Clone, Debug, Serialize, Deserialize)] #[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] pub struct Registration { /// A unique, user - defined ID of the application service which will never change. pub id: String, /// The URL for the application service. pub url: String, /// A unique token for application services to use to authenticate requests to Homeservers. pub as_token: String, /// A unique token for Homeservers to use to authenticate requests to application services. pub hs_token: String, /// The localpart of the user associated with the application service. pub sender_localpart: String, /// A list of users, aliases and rooms namespaces that the application service controls. pub namespaces: Namespaces, /// Whether requests from masqueraded users are rate-limited. /// /// The sender is excluded. #[serde(skip_serializing_if = "Option::is_none")] pub rate_limited: Option, /// The external protocols which the application service provides (e.g. IRC). #[serde(skip_serializing_if = "Option::is_none")] pub protocols: Option>, } /// Initial set of fields of `Registration`. /// /// This struct will not be updated even if additional fields are added to `Registration` in a new /// (non-breaking) release of the Matrix specification. /// /// Used for [appservice registration](https://spec.matrix.org/v1.4/application-service-api/#registration). #[derive(Debug)] #[allow(clippy::exhaustive_structs)] pub struct RegistrationInit { /// A unique, user - defined ID of the application service which will never change. pub id: String, /// The URL for the application service. pub url: String, /// A unique token for application services to use to authenticate requests to Homeservers. pub as_token: String, /// A unique token for Homeservers to use to authenticate requests to application services. pub hs_token: String, /// The localpart of the user associated with the application service. pub sender_localpart: String, /// A list of users, aliases and rooms namespaces that the application service controls. pub namespaces: Namespaces, /// Whether requests from masqueraded users are rate-limited. /// /// The sender is excluded. pub rate_limited: Option, /// The external protocols which the application service provides (e.g. IRC). pub protocols: Option>, } impl From for Registration { fn from(init: RegistrationInit) -> Self { let RegistrationInit { id, url, as_token, hs_token, sender_localpart, namespaces, rate_limited, protocols, } = init; Self { id, url, as_token, hs_token, sender_localpart, namespaces, rate_limited, protocols } } }