Update r0::context::get_context::Request and r0::filter::RoomEventFilter
* Add lazy-loading options to RoomEventFilter * Use UInt instead of u8 for get_context limit * Add filter option to get_context endpoint * Add more tests Co-authored-by: Jonas Platte <jplatte+git@posteo.de>
This commit is contained in:
parent
8fb01a193e
commit
21f9922b9e
@ -10,6 +10,7 @@ Improvements:
|
|||||||
* Add `unstable_features` to `unversioned::get_supported_versions` (introduced in r0.5.0)
|
* Add `unstable_features` to `unversioned::get_supported_versions` (introduced in r0.5.0)
|
||||||
* Add request and response parameters for `r0::account::deactivate`
|
* Add request and response parameters for `r0::account::deactivate`
|
||||||
* Add `r0::session::sso_login` (introduced in r0.5.0)
|
* Add `r0::session::sso_login` (introduced in r0.5.0)
|
||||||
|
* Add `filter` type for `r0::context::get_context`
|
||||||
|
|
||||||
Breaking changes:
|
Breaking changes:
|
||||||
|
|
||||||
@ -21,6 +22,8 @@ Breaking changes:
|
|||||||
* Replaced `user_id` parameter of `r0::membership::invite_user` with `recipient`
|
* Replaced `user_id` parameter of `r0::membership::invite_user` with `recipient`
|
||||||
to allow invitation of users by either Matrix or third party identifiers.
|
to allow invitation of users by either Matrix or third party identifiers.
|
||||||
* Remove deprecated endpoint `r0::contact::create_contact` (deprecated in r0.6.0)
|
* Remove deprecated endpoint `r0::contact::create_contact` (deprecated in r0.6.0)
|
||||||
|
* Add lazy-loading options to `r0::filter::RoomEventFilter` (introduced in r0.5.0)
|
||||||
|
* Change type for `limit` request parameter of `r0::context::get_context` from `u8` to `Option<js_int::UInt>`
|
||||||
|
|
||||||
# 0.6.0
|
# 0.6.0
|
||||||
|
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
//! [GET /_matrix/client/r0/rooms/{roomId}/context/{eventId}](https://matrix.org/docs/spec/client_server/r0.4.0.html#get-matrix-client-r0-rooms-roomid-context-eventid)
|
//! [GET /_matrix/client/r0/rooms/{roomId}/context/{eventId}](https://matrix.org/docs/spec/client_server/r0.4.0.html#get-matrix-client-r0-rooms-roomid-context-eventid)
|
||||||
|
|
||||||
|
use js_int::UInt;
|
||||||
use ruma_api::ruma_api;
|
use ruma_api::ruma_api;
|
||||||
use ruma_events::{collections::only, EventResult};
|
use ruma_events::{collections::only, EventResult};
|
||||||
use ruma_identifiers::{EventId, RoomId};
|
use ruma_identifiers::{EventId, RoomId};
|
||||||
|
|
||||||
|
use crate::r0::filter::RoomEventFilter;
|
||||||
|
|
||||||
ruma_api! {
|
ruma_api! {
|
||||||
metadata {
|
metadata {
|
||||||
description: "Get the events immediately preceding and following a given event.",
|
description: "Get the events immediately preceding and following a given event.",
|
||||||
@ -22,10 +25,15 @@ ruma_api! {
|
|||||||
///
|
///
|
||||||
/// Defaults to 10 if not supplied.
|
/// Defaults to 10 if not supplied.
|
||||||
#[ruma_api(query)]
|
#[ruma_api(query)]
|
||||||
pub limit: u8,
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
pub limit: Option<UInt>,
|
||||||
/// The room to get events from.
|
/// The room to get events from.
|
||||||
#[ruma_api(path)]
|
#[ruma_api(path)]
|
||||||
pub room_id: RoomId,
|
pub room_id: RoomId,
|
||||||
|
/// A RoomEventFilter to filter returned events with.
|
||||||
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
|
#[ruma_api(query)]
|
||||||
|
pub filter: Option<RoomEventFilter>,
|
||||||
}
|
}
|
||||||
|
|
||||||
response {
|
response {
|
||||||
|
154
src/r0/filter.rs
154
src/r0/filter.rs
@ -3,9 +3,15 @@
|
|||||||
pub mod create_filter;
|
pub mod create_filter;
|
||||||
pub mod get_filter;
|
pub mod get_filter;
|
||||||
|
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
use js_int::UInt;
|
use js_int::UInt;
|
||||||
use ruma_identifiers::{RoomId, UserId};
|
use ruma_identifiers::{RoomId, UserId};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{
|
||||||
|
de::{MapAccess, Visitor},
|
||||||
|
ser::SerializeStruct,
|
||||||
|
Deserialize, Deserializer, Serialize, Serializer,
|
||||||
|
};
|
||||||
|
|
||||||
/// Format to use for returned events
|
/// Format to use for returned events
|
||||||
#[derive(Copy, Clone, Debug, Deserialize, Serialize)]
|
#[derive(Copy, Clone, Debug, Deserialize, Serialize)]
|
||||||
@ -64,6 +70,9 @@ pub struct RoomEventFilter {
|
|||||||
/// If this item is absent then all event types are included.
|
/// If this item is absent then all event types are included.
|
||||||
#[serde(skip_serializing_if = "Option::is_none")]
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||||||
pub contains_url: Option<bool>,
|
pub contains_url: Option<bool>,
|
||||||
|
/// Options to control lazy-loading of membership events.
|
||||||
|
#[serde(flatten)]
|
||||||
|
pub lazy_load_options: LazyLoadOptions,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RoomEventFilter {
|
impl RoomEventFilter {
|
||||||
@ -203,3 +212,146 @@ impl FilterDefinition {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Specifies options for [lazy-loading membership events][lazy-loading] on
|
||||||
|
/// supported endpoints
|
||||||
|
///
|
||||||
|
/// [lazy-loading]: https://matrix.org/docs/spec/client_server/r0.6.0#lazy-loading-room-members
|
||||||
|
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||||
|
pub enum LazyLoadOptions {
|
||||||
|
/// Disables lazy-loading of membership events.
|
||||||
|
Disabled,
|
||||||
|
/// Enables lazy-loading of events.
|
||||||
|
Enabled {
|
||||||
|
/// If `true`, sends all membership events for all events, even if they have
|
||||||
|
/// already been sent to the client. Defaults to `false`.
|
||||||
|
include_redundant_members: bool,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Serialize for LazyLoadOptions {
|
||||||
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: Serializer,
|
||||||
|
{
|
||||||
|
let mut state;
|
||||||
|
match *self {
|
||||||
|
Self::Enabled {
|
||||||
|
include_redundant_members: true,
|
||||||
|
} => {
|
||||||
|
state = serializer.serialize_struct("LazyLoad", 2)?;
|
||||||
|
state.serialize_field("lazy_load_members", &true)?;
|
||||||
|
state.serialize_field("include_redundant_members", &true)?;
|
||||||
|
}
|
||||||
|
Self::Enabled { .. } => {
|
||||||
|
state = serializer.serialize_struct("LazyLoad", 1)?;
|
||||||
|
state.serialize_field("lazy_load_members", &true)?;
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
state = serializer.serialize_struct("LazyLoad", 0)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
state.end()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for LazyLoadOptions {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::Disabled
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct LazyLoadOptionsVisitor;
|
||||||
|
|
||||||
|
impl<'de> Visitor<'de> for LazyLoadOptionsVisitor {
|
||||||
|
type Value = LazyLoadOptions;
|
||||||
|
|
||||||
|
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
formatter.write_str("Lazy load options")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_map<M>(self, mut access: M) -> Result<Self::Value, M::Error>
|
||||||
|
where
|
||||||
|
M: MapAccess<'de>,
|
||||||
|
{
|
||||||
|
let mut lazy_load_members = false;
|
||||||
|
let mut include_redundant_members = false;
|
||||||
|
while let Some((key, value)) = access.next_entry::<String, bool>()? {
|
||||||
|
match &*key {
|
||||||
|
"lazy_load_members" => lazy_load_members = value,
|
||||||
|
"include_redundant_members" => include_redundant_members = value,
|
||||||
|
_ => {}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(if lazy_load_members {
|
||||||
|
LazyLoadOptions::Enabled {
|
||||||
|
include_redundant_members,
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
LazyLoadOptions::Disabled
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'de> Deserialize<'de> for LazyLoadOptions {
|
||||||
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
deserializer.deserialize_map(LazyLoadOptionsVisitor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use serde_json::json;
|
||||||
|
|
||||||
|
use super::LazyLoadOptions;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_serializing_disabled_lazy_load() {
|
||||||
|
let lazy_load_options = LazyLoadOptions::Disabled;
|
||||||
|
assert_eq!(serde_json::to_value(lazy_load_options).unwrap(), json!({}));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_serializing_lazy_load_no_redundant() {
|
||||||
|
let lazy_load_options = LazyLoadOptions::Enabled {
|
||||||
|
include_redundant_members: false,
|
||||||
|
};
|
||||||
|
assert_eq!(
|
||||||
|
serde_json::to_value(lazy_load_options).unwrap(),
|
||||||
|
json!({ "lazy_load_members": true })
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_serializing_lazy_load_with_redundant() {
|
||||||
|
let lazy_load_options = LazyLoadOptions::Enabled {
|
||||||
|
include_redundant_members: true,
|
||||||
|
};
|
||||||
|
assert_eq!(
|
||||||
|
serde_json::to_value(lazy_load_options).unwrap(),
|
||||||
|
json!({ "lazy_load_members": true, "include_redundant_members": true })
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_deserializing_no_lazy_load() {
|
||||||
|
let json = json!({});
|
||||||
|
assert_eq!(
|
||||||
|
serde_json::from_value::<LazyLoadOptions>(json).unwrap(),
|
||||||
|
LazyLoadOptions::Disabled,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_deserializing_ignore_redundant_members_when_no_lazy_load() {
|
||||||
|
let json = json!({ "include_redundant_members": true });
|
||||||
|
assert_eq!(
|
||||||
|
serde_json::from_value::<LazyLoadOptions>(json).unwrap(),
|
||||||
|
LazyLoadOptions::Disabled,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user