Make remaining filter types lifetime-generic

This commit is contained in:
Jonas Platte 2020-08-17 22:48:53 +02:00
parent 30a0a39d2b
commit d6beef3d07
No known key found for this signature in database
GPG Key ID: 7D261D771D915378
4 changed files with 52 additions and 48 deletions

View File

@ -6,7 +6,7 @@ use ruma_common::Raw;
use ruma_events::{AnyRoomEvent, AnyStateEvent}; use ruma_events::{AnyRoomEvent, AnyStateEvent};
use ruma_identifiers::{EventId, RoomId}; use ruma_identifiers::{EventId, RoomId};
use crate::r0::filter::RoomEventFilter; use crate::r0::filter::{IncomingRoomEventFilter, RoomEventFilter};
ruma_api! { ruma_api! {
metadata: { metadata: {
@ -42,7 +42,7 @@ ruma_api! {
default, default,
skip_serializing_if = "Option::is_none" skip_serializing_if = "Option::is_none"
)] )]
pub filter: Option<RoomEventFilter>, pub filter: Option<RoomEventFilter<'a>>,
} }
#[non_exhaustive] #[non_exhaustive]

View File

@ -26,22 +26,23 @@ pub enum EventFormat {
} }
/// Filters to be applied to room events /// Filters to be applied to room events
#[derive(Clone, Debug, Default, Deserialize, Serialize)] #[derive(Clone, Copy, Debug, Default, Outgoing, Serialize)]
pub struct RoomEventFilter { #[incoming_derive(Clone, Serialize)]
pub struct RoomEventFilter<'a> {
/// A list of event types to exclude. /// A list of event types to exclude.
/// ///
/// If this list is absent then no event types are excluded. A matching type will be excluded /// If this list is absent then no event types are excluded. A matching type will be excluded
/// even if it is listed in the 'types' filter. A '*' can be used as a wildcard to match any /// even if it is listed in the 'types' filter. A '*' can be used as a wildcard to match any
/// sequence of characters. /// sequence of characters.
#[serde(default, skip_serializing_if = "Vec::is_empty")] #[serde(default, skip_serializing_if = "<[_]>::is_empty")]
pub not_types: Vec<String>, pub not_types: &'a [String],
/// A list of room IDs to exclude. /// A list of room IDs to exclude.
/// ///
/// If this list is absent then no rooms are excluded. A matching room will be excluded even if /// If this list is absent then no rooms are excluded. A matching room will be excluded even if
/// it is listed in the 'rooms' filter. /// it is listed in the 'rooms' filter.
#[serde(default, skip_serializing_if = "Vec::is_empty")] #[serde(default, skip_serializing_if = "<[_]>::is_empty")]
pub not_rooms: Vec<String>, pub not_rooms: &'a [String],
/// The maximum number of events to return. /// The maximum number of events to return.
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
@ -51,27 +52,27 @@ pub struct RoomEventFilter {
/// ///
/// If this list is absent then all rooms are included. /// If this list is absent then all rooms are included.
#[serde(default, skip_serializing_if = "Option::is_none")] #[serde(default, skip_serializing_if = "Option::is_none")]
pub rooms: Option<Vec<RoomId>>, pub rooms: Option<&'a [RoomId]>,
/// A list of sender IDs to exclude. /// A list of sender IDs to exclude.
/// ///
/// If this list is absent then no senders are excluded. A matching sender will be excluded even /// If this list is absent then no senders are excluded. A matching sender will be excluded even
/// if it is listed in the 'senders' filter. /// if it is listed in the 'senders' filter.
#[serde(default, skip_serializing_if = "Vec::is_empty")] #[serde(default, skip_serializing_if = "<[_]>::is_empty")]
pub not_senders: Vec<UserId>, pub not_senders: &'a [UserId],
/// A list of senders IDs to include. /// A list of senders IDs to include.
/// ///
/// If this list is absent then all senders are included. /// If this list is absent then all senders are included.
#[serde(default, skip_serializing_if = "Option::is_none")] #[serde(default, skip_serializing_if = "Option::is_none")]
pub senders: Option<Vec<UserId>>, pub senders: Option<&'a [UserId]>,
/// A list of event types to include. /// A list of event types to include.
/// ///
/// If this list is absent then all event types are included. A '*' can be used as a wildcard to /// If this list is absent then all event types are included. A '*' can be used as a wildcard to
/// match any sequence of characters. /// match any sequence of characters.
#[serde(default, skip_serializing_if = "Option::is_none")] #[serde(default, skip_serializing_if = "Option::is_none")]
pub types: Option<Vec<String>>, pub types: Option<&'a [String]>,
/// If `true` include only events with a URL key in their content. /// If `true` include only events with a URL key in their content.
/// If `false`, exclude such events. /// If `false`, exclude such events.
@ -85,16 +86,17 @@ pub struct RoomEventFilter {
pub lazy_load_options: LazyLoadOptions, pub lazy_load_options: LazyLoadOptions,
} }
impl RoomEventFilter { impl<'a> RoomEventFilter<'a> {
/// A filter that can be used to ignore all room events /// A filter that can be used to ignore all room events
pub fn ignore_all() -> Self { pub fn ignore_all() -> Self {
Self { types: Some(vec![]), ..Default::default() } Self { types: Some(&[]), ..Default::default() }
} }
} }
/// Filters to be applied to room data /// Filters to be applied to room data
#[derive(Clone, Debug, Default, Deserialize, Serialize)] #[derive(Clone, Copy, Debug, Default, Outgoing, Serialize)]
pub struct RoomFilter { #[incoming_derive(Clone, Serialize)]
pub struct RoomFilter<'a> {
/// Include rooms that the user has left in the sync. /// Include rooms that the user has left in the sync.
/// ///
/// Defaults to false if not included. /// Defaults to false if not included.
@ -103,54 +105,55 @@ pub struct RoomFilter {
/// The per user account data to include for rooms. /// The per user account data to include for rooms.
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub account_data: Option<RoomEventFilter>, pub account_data: Option<RoomEventFilter<'a>>,
/// The message and state update events to include for rooms. /// The message and state update events to include for rooms.
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub timeline: Option<RoomEventFilter>, pub timeline: Option<RoomEventFilter<'a>>,
/// The events that aren't recorded in the room history, e.g. typing and receipts, to include /// The events that aren't recorded in the room history, e.g. typing and receipts, to include
/// for rooms. /// for rooms.
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub ephemeral: Option<RoomEventFilter>, pub ephemeral: Option<RoomEventFilter<'a>>,
/// The state events to include for rooms. /// The state events to include for rooms.
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub state: Option<RoomEventFilter>, pub state: Option<RoomEventFilter<'a>>,
/// A list of room IDs to exclude. /// A list of room IDs to exclude.
/// ///
/// If this list is absent then no rooms are excluded. A matching room will be excluded even if /// If this list is absent then no rooms are excluded. A matching room will be excluded even if
/// it is listed in the 'rooms' filter. This filter is applied before the filters in /// it is listed in the 'rooms' filter. This filter is applied before the filters in
/// `ephemeral`, `state`, `timeline` or `account_data`. /// `ephemeral`, `state`, `timeline` or `account_data`.
#[serde(default, skip_serializing_if = "Vec::is_empty")] #[serde(default, skip_serializing_if = "<[_]>::is_empty")]
pub not_rooms: Vec<RoomId>, pub not_rooms: &'a [RoomId],
/// A list of room IDs to include. /// A list of room IDs to include.
/// ///
/// If this list is absent then all rooms are included. This filter is applied before the /// If this list is absent then all rooms are included. This filter is applied before the
/// filters in `ephemeral`, `state`, `timeline` or `account_data`. /// filters in `ephemeral`, `state`, `timeline` or `account_data`.
#[serde(default, skip_serializing_if = "Option::is_none")] #[serde(default, skip_serializing_if = "Option::is_none")]
pub rooms: Option<Vec<RoomId>>, pub rooms: Option<&'a [RoomId]>,
} }
impl RoomFilter { impl<'a> RoomFilter<'a> {
/// A filter that can be used to ignore all room events (of any type) /// A filter that can be used to ignore all room events (of any type)
pub fn ignore_all() -> Self { pub fn ignore_all() -> Self {
Self { rooms: Some(vec![]), ..Default::default() } Self { rooms: Some(&[]), ..Default::default() }
} }
} }
/// Filter for not-room data /// Filter for not-room data
#[derive(Clone, Debug, Default, Deserialize, Serialize)] #[derive(Clone, Copy, Debug, Default, Outgoing, Serialize)]
pub struct Filter { #[incoming_derive(Clone, Serialize)]
pub struct Filter<'a> {
/// A list of event types to exclude. /// A list of event types to exclude.
/// ///
/// If this list is absent then no event types are excluded. A matching type will be excluded /// If this list is absent then no event types are excluded. A matching type will be excluded
/// even if it is listed in the 'types' filter. A '*' can be used as a wildcard to match any /// even if it is listed in the 'types' filter. A '*' can be used as a wildcard to match any
/// sequence of characters. /// sequence of characters.
#[serde(default, skip_serializing_if = "Vec::is_empty")] #[serde(default, skip_serializing_if = "<[_]>::is_empty")]
pub not_types: Vec<String>, pub not_types: &'a [String],
/// The maximum number of events to return. /// The maximum number of events to return.
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
@ -160,32 +163,32 @@ pub struct Filter {
/// ///
/// If this list is absent then all senders are included. /// If this list is absent then all senders are included.
#[serde(default, skip_serializing_if = "Option::is_none")] #[serde(default, skip_serializing_if = "Option::is_none")]
pub senders: Option<Vec<UserId>>, pub senders: Option<&'a [UserId]>,
/// A list of event types to include. /// A list of event types to include.
/// ///
/// If this list is absent then all event types are included. A '*' can be used as a wildcard to /// If this list is absent then all event types are included. A '*' can be used as a wildcard to
/// match any sequence of characters. /// match any sequence of characters.
#[serde(default, skip_serializing_if = "Option::is_none")] #[serde(default, skip_serializing_if = "Option::is_none")]
pub types: Option<Vec<String>>, pub types: Option<&'a [String]>,
/// A list of sender IDs to exclude. /// A list of sender IDs to exclude.
/// ///
/// If this list is absent then no senders are excluded. A matching sender will be excluded even /// If this list is absent then no senders are excluded. A matching sender will be excluded even
/// if it is listed in the 'senders' filter. /// if it is listed in the 'senders' filter.
#[serde(default, skip_serializing_if = "Vec::is_empty")] #[serde(default, skip_serializing_if = "<[_]>::is_empty")]
pub not_senders: Vec<UserId>, pub not_senders: &'a [UserId],
} }
impl Filter { impl<'a> Filter<'a> {
/// A filter that can be used to ignore all events /// A filter that can be used to ignore all events
pub fn ignore_all() -> Self { pub fn ignore_all() -> Self {
Self { types: Some(vec![]), ..Default::default() } Self { types: Some(&[]), ..Default::default() }
} }
} }
/// A filter definition /// A filter definition
#[derive(Clone, Debug, Default, Outgoing, Serialize)] #[derive(Clone, Copy, Debug, Default, Outgoing, Serialize)]
#[incoming_derive(Clone, Serialize)] #[incoming_derive(Clone, Serialize)]
pub struct FilterDefinition<'a> { pub struct FilterDefinition<'a> {
/// List of event fields to include. /// List of event fields to include.
@ -206,15 +209,15 @@ pub struct FilterDefinition<'a> {
/// The presence updates to include. /// The presence updates to include.
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub presence: Option<Filter>, pub presence: Option<Filter<'a>>,
/// The user account data that isn't associated with rooms to include. /// The user account data that isn't associated with rooms to include.
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub account_data: Option<Filter>, pub account_data: Option<Filter<'a>>,
/// Filters to be applied to room data. /// Filters to be applied to room data.
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub room: Option<RoomFilter>, pub room: Option<RoomFilter<'a>>,
} }
impl<'a> FilterDefinition<'a> { impl<'a> FilterDefinition<'a> {

View File

@ -7,7 +7,7 @@ use ruma_events::{AnyRoomEvent, AnyStateEvent};
use ruma_identifiers::RoomId; use ruma_identifiers::RoomId;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::r0::filter::RoomEventFilter; use crate::r0::filter::{IncomingRoomEventFilter, RoomEventFilter};
ruma_api! { ruma_api! {
metadata: { metadata: {
@ -60,7 +60,7 @@ ruma_api! {
default, default,
skip_serializing_if = "Option::is_none" skip_serializing_if = "Option::is_none"
)] )]
pub filter: Option<RoomEventFilter>, pub filter: Option<RoomEventFilter<'a>>,
} }
#[non_exhaustive] #[non_exhaustive]
@ -135,11 +135,12 @@ mod tests {
#[test] #[test]
fn test_serialize_some_room_event_filter() { fn test_serialize_some_room_event_filter() {
let room_id = room_id!("!roomid:example.org"); let room_id = room_id!("!roomid:example.org");
let rooms = &[room_id.clone()];
let filter = RoomEventFilter { let filter = RoomEventFilter {
lazy_load_options: LazyLoadOptions::Enabled { include_redundant_members: true }, lazy_load_options: LazyLoadOptions::Enabled { include_redundant_members: true },
rooms: Some(vec![room_id.clone()]), rooms: Some(rooms),
not_rooms: vec!["room".into(), "room2".into(), "room3".into()], not_rooms: &["room".into(), "room2".into(), "room3".into()],
not_types: vec!["type".into()], not_types: &["type".into()],
..Default::default() ..Default::default()
}; };
let req = Request { let req = Request {

View File

@ -9,7 +9,7 @@ use ruma_events::{AnyEvent, AnyStateEvent};
use ruma_identifiers::{EventId, RoomId, UserId}; use ruma_identifiers::{EventId, RoomId, UserId};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::r0::filter::RoomEventFilter; use crate::r0::filter::{IncomingRoomEventFilter, RoomEventFilter};
ruma_api! { ruma_api! {
metadata: { metadata: {
@ -73,7 +73,7 @@ impl<'a> Categories<'a> {
} }
/// Criteria for searching a category of events. /// Criteria for searching a category of events.
#[derive(Clone, Debug, Outgoing, Serialize)] #[derive(Clone, Copy, Debug, Outgoing, Serialize)]
pub struct Criteria<'a> { pub struct Criteria<'a> {
/// The string to search events for. /// The string to search events for.
pub search_term: &'a str, pub search_term: &'a str,
@ -84,7 +84,7 @@ pub struct Criteria<'a> {
/// A `Filter` to apply to the search. /// A `Filter` to apply to the search.
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
pub filter: Option<RoomEventFilter>, pub filter: Option<RoomEventFilter<'a>>,
/// The order in which to search for results. /// The order in which to search for results.
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]