#![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.2/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.2/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.2/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.2/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.2/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 }
}
}