Fix deserialization for some Filter types

This was a regression in some recent changes on `FilterDefinition` and
`RoomFilter` which removed some `Option`s.

The current structure skips some fields when the structure is
serialized, but it wrongly required those fields on deserialization
(due to the lack of serde's default attribute).
This commit is contained in:
gnieto 2020-10-26 23:54:35 +01:00 committed by GitHub
parent c0eee62431
commit 3f7c6f6bea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -149,20 +149,20 @@ pub struct RoomFilter<'a> {
pub include_leave: bool, pub include_leave: bool,
/// The per user account data to include for rooms. /// The per user account data to include for rooms.
#[serde(skip_serializing_if = "ruma_serde::is_empty")] #[serde(default, skip_serializing_if = "ruma_serde::is_empty")]
pub account_data: RoomEventFilter<'a>, pub account_data: 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 = "ruma_serde::is_empty")] #[serde(default, skip_serializing_if = "ruma_serde::is_empty")]
pub timeline: RoomEventFilter<'a>, pub timeline: 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 = "ruma_serde::is_empty")] #[serde(default, skip_serializing_if = "ruma_serde::is_empty")]
pub ephemeral: RoomEventFilter<'a>, pub ephemeral: RoomEventFilter<'a>,
/// The state events to include for rooms. /// The state events to include for rooms.
#[serde(skip_serializing_if = "ruma_serde::is_empty")] #[serde(default, skip_serializing_if = "ruma_serde::is_empty")]
pub state: RoomEventFilter<'a>, pub state: RoomEventFilter<'a>,
/// A list of room IDs to exclude. /// A list of room IDs to exclude.
@ -313,15 +313,15 @@ pub struct FilterDefinition<'a> {
pub event_format: EventFormat, pub event_format: EventFormat,
/// The presence updates to include. /// The presence updates to include.
#[serde(skip_serializing_if = "ruma_serde::is_empty")] #[serde(default, skip_serializing_if = "ruma_serde::is_empty")]
pub presence: Filter<'a>, pub presence: 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 = "ruma_serde::is_empty")] #[serde(default, skip_serializing_if = "ruma_serde::is_empty")]
pub account_data: Filter<'a>, pub account_data: Filter<'a>,
/// Filters to be applied to room data. /// Filters to be applied to room data.
#[serde(skip_serializing_if = "ruma_serde::is_empty")] #[serde(default, skip_serializing_if = "ruma_serde::is_empty")]
pub room: RoomFilter<'a>, pub room: RoomFilter<'a>,
} }
@ -388,7 +388,10 @@ can_be_empty!(IncomingRoomFilter);
mod tests { mod tests {
use serde_json::{json, to_value as to_json_value}; use serde_json::{json, to_value as to_json_value};
use super::{Filter, FilterDefinition, RoomEventFilter, RoomFilter}; use super::{
Filter, FilterDefinition, IncomingFilterDefinition, IncomingRoomFilter, RoomEventFilter,
RoomFilter,
};
#[test] #[test]
fn default_filters_are_empty() -> Result<(), serde_json::Error> { fn default_filters_are_empty() -> Result<(), serde_json::Error> {
@ -399,4 +402,26 @@ mod tests {
Ok(()) Ok(())
} }
#[test]
fn filter_definition_roundtrip() -> Result<(), serde_json::Error> {
let filter = FilterDefinition::default();
let filter_str = serde_json::to_value(&filter)?;
let incoming_filter = serde_json::from_value::<IncomingFilterDefinition>(filter_str)?;
assert!(incoming_filter.is_empty());
Ok(())
}
#[test]
fn room_filter_definition_roundtrip() -> Result<(), serde_json::Error> {
let filter = RoomFilter::default();
let room_filter = serde_json::to_value(&filter)?;
let incoming_room_filter = serde_json::from_value::<IncomingRoomFilter>(room_filter)?;
assert!(incoming_room_filter.is_empty());
Ok(())
}
} }