events: Use CanBeEmpty trait for skipping unsigned serialization
This commit is contained in:
		
							parent
							
								
									24d0b2e2bb
								
							
						
					
					
						commit
						674137c41d
					
				| @ -460,8 +460,8 @@ mod tests { | |||||||
| 
 | 
 | ||||||
|     use super::{MembershipState, RoomMemberEventContent}; |     use super::{MembershipState, RoomMemberEventContent}; | ||||||
|     use crate::{ |     use crate::{ | ||||||
|         events::OriginalStateEvent, mxc_uri, server_name, server_signing_key_id, user_id, |         events::OriginalStateEvent, mxc_uri, serde::CanBeEmpty, server_name, server_signing_key_id, | ||||||
|         MilliSecondsSinceUnixEpoch, |         user_id, MilliSecondsSinceUnixEpoch, | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     #[test] |     #[test] | ||||||
|  | |||||||
| @ -3,7 +3,10 @@ use serde::{Deserialize, Serialize}; | |||||||
| use serde_json::{from_str as from_json_str, value::RawValue as RawJsonValue}; | use serde_json::{from_str as from_json_str, value::RawValue as RawJsonValue}; | ||||||
| 
 | 
 | ||||||
| use super::{relation::Relations, room::redaction::SyncRoomRedactionEvent, StateEventContent}; | use super::{relation::Relations, room::redaction::SyncRoomRedactionEvent, StateEventContent}; | ||||||
| use crate::{serde::Raw, OwnedTransactionId}; | use crate::{ | ||||||
|  |     serde::{CanBeEmpty, Raw}, | ||||||
|  |     OwnedTransactionId, | ||||||
|  | }; | ||||||
| 
 | 
 | ||||||
| /// Extra information about a message event that is not incorporated into the event's hash.
 | /// Extra information about a message event that is not incorporated into the event's hash.
 | ||||||
| #[derive(Clone, Debug, Default, Deserialize, Serialize)] | #[derive(Clone, Debug, Default, Deserialize, Serialize)] | ||||||
| @ -34,13 +37,15 @@ impl MessageLikeUnsigned { | |||||||
|     pub fn new() -> Self { |     pub fn new() -> Self { | ||||||
|         Self::default() |         Self::default() | ||||||
|     } |     } | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
|  | impl CanBeEmpty for MessageLikeUnsigned { | ||||||
|     /// Whether this unsigned data is empty (all fields are `None`).
 |     /// Whether this unsigned data is empty (all fields are `None`).
 | ||||||
|     ///
 |     ///
 | ||||||
|     /// This method is used to determine whether to skip serializing the `unsigned` field in room
 |     /// This method is used to determine whether to skip serializing the `unsigned` field in room
 | ||||||
|     /// events. Do not use it to determine whether an incoming `unsigned` field was present - it
 |     /// events. Do not use it to determine whether an incoming `unsigned` field was present - it
 | ||||||
|     /// could still have been present but contained none of the known fields.
 |     /// could still have been present but contained none of the known fields.
 | ||||||
|     pub fn is_empty(&self) -> bool { |     fn is_empty(&self) -> bool { | ||||||
|         self.age.is_none() && self.transaction_id.is_none() && self.relations.is_none() |         self.age.is_none() && self.transaction_id.is_none() && self.relations.is_none() | ||||||
|     } |     } | ||||||
| } | } | ||||||
| @ -78,13 +83,15 @@ impl<C: StateEventContent> StateUnsigned<C> { | |||||||
|     pub fn new() -> Self { |     pub fn new() -> Self { | ||||||
|         Self { age: None, transaction_id: None, prev_content: None, relations: None } |         Self { age: None, transaction_id: None, prev_content: None, relations: None } | ||||||
|     } |     } | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
|  | impl<C: StateEventContent> CanBeEmpty for StateUnsigned<C> { | ||||||
|     /// Whether this unsigned data is empty (all fields are `None`).
 |     /// Whether this unsigned data is empty (all fields are `None`).
 | ||||||
|     ///
 |     ///
 | ||||||
|     /// This method is used to determine whether to skip serializing the `unsigned` field in room
 |     /// This method is used to determine whether to skip serializing the `unsigned` field in room
 | ||||||
|     /// events. Do not use it to determine whether an incoming `unsigned` field was present - it
 |     /// events. Do not use it to determine whether an incoming `unsigned` field was present - it
 | ||||||
|     /// could still have been present but contained none of the known fields.
 |     /// could still have been present but contained none of the known fields.
 | ||||||
|     pub fn is_empty(&self) -> bool { |     fn is_empty(&self) -> bool { | ||||||
|         self.age.is_none() |         self.age.is_none() | ||||||
|             && self.transaction_id.is_none() |             && self.transaction_id.is_none() | ||||||
|             && self.prev_content.is_none() |             && self.prev_content.is_none() | ||||||
| @ -160,13 +167,15 @@ impl RedactedUnsigned { | |||||||
|     pub fn new_because(redacted_because: Box<SyncRoomRedactionEvent>) -> Self { |     pub fn new_because(redacted_because: Box<SyncRoomRedactionEvent>) -> Self { | ||||||
|         Self { redacted_because: Some(redacted_because) } |         Self { redacted_because: Some(redacted_because) } | ||||||
|     } |     } | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
|  | impl CanBeEmpty for RedactedUnsigned { | ||||||
|     /// Whether this unsigned data is empty (`redacted_because` is `None`).
 |     /// Whether this unsigned data is empty (`redacted_because` is `None`).
 | ||||||
|     ///
 |     ///
 | ||||||
|     /// This method is used to determine whether to skip serializing the `unsigned` field in
 |     /// This method is used to determine whether to skip serializing the `unsigned` field in
 | ||||||
|     /// redacted room events. Do not use it to determine whether an incoming `unsigned` field
 |     /// redacted room events. Do not use it to determine whether an incoming `unsigned` field
 | ||||||
|     /// was present - it could still have been present but contained none of the known fields.
 |     /// was present - it could still have been present but contained none of the known fields.
 | ||||||
|     pub fn is_empty(&self) -> bool { |     fn is_empty(&self) -> bool { | ||||||
|         self.redacted_because.is_none() |         self.redacted_because.is_none() | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -20,7 +20,7 @@ use ruma_common::{ | |||||||
|         AnyMessageLikeEvent, MessageLikeEvent, MessageLikeUnsigned, OriginalMessageLikeEvent, |         AnyMessageLikeEvent, MessageLikeEvent, MessageLikeUnsigned, OriginalMessageLikeEvent, | ||||||
|     }, |     }, | ||||||
|     mxc_uri, room_id, |     mxc_uri, room_id, | ||||||
|     serde::Base64, |     serde::{Base64, CanBeEmpty}, | ||||||
|     user_id, MilliSecondsSinceUnixEpoch, |     user_id, MilliSecondsSinceUnixEpoch, | ||||||
| }; | }; | ||||||
| use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ use assert_matches::assert_matches; | |||||||
| use js_int::uint; | use js_int::uint; | ||||||
| use ruma_common::{ | use ruma_common::{ | ||||||
|     events::{AnyMessageLikeEvent, MessageLikeEvent}, |     events::{AnyMessageLikeEvent, MessageLikeEvent}, | ||||||
|  |     serde::CanBeEmpty, | ||||||
|     MilliSecondsSinceUnixEpoch, VoipVersionId, |     MilliSecondsSinceUnixEpoch, VoipVersionId, | ||||||
| }; | }; | ||||||
| use serde_json::{from_value as from_json_value, json}; | use serde_json::{from_value as from_json_value, json}; | ||||||
|  | |||||||
| @ -17,7 +17,7 @@ use ruma_common::{ | |||||||
|         AnyMessageLikeEvent, MessageLikeEvent, MessageLikeUnsigned, OriginalMessageLikeEvent, |         AnyMessageLikeEvent, MessageLikeEvent, MessageLikeUnsigned, OriginalMessageLikeEvent, | ||||||
|     }, |     }, | ||||||
|     mxc_uri, room_id, |     mxc_uri, room_id, | ||||||
|     serde::Base64, |     serde::{Base64, CanBeEmpty}, | ||||||
|     user_id, MilliSecondsSinceUnixEpoch, |     user_id, MilliSecondsSinceUnixEpoch, | ||||||
| }; | }; | ||||||
| use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | ||||||
|  | |||||||
| @ -21,7 +21,7 @@ use ruma_common::{ | |||||||
|         AnyMessageLikeEvent, MessageLikeEvent, MessageLikeUnsigned, OriginalMessageLikeEvent, |         AnyMessageLikeEvent, MessageLikeEvent, MessageLikeUnsigned, OriginalMessageLikeEvent, | ||||||
|     }, |     }, | ||||||
|     mxc_uri, room_id, |     mxc_uri, room_id, | ||||||
|     serde::Base64, |     serde::{Base64, CanBeEmpty}, | ||||||
|     user_id, MilliSecondsSinceUnixEpoch, |     user_id, MilliSecondsSinceUnixEpoch, | ||||||
| }; | }; | ||||||
| use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | ||||||
|  | |||||||
| @ -13,7 +13,9 @@ use ruma_common::{ | |||||||
|         }, |         }, | ||||||
|         AnyMessageLikeEvent, MessageLikeEvent, MessageLikeUnsigned, OriginalMessageLikeEvent, |         AnyMessageLikeEvent, MessageLikeEvent, MessageLikeUnsigned, OriginalMessageLikeEvent, | ||||||
|     }, |     }, | ||||||
|     room_id, user_id, MilliSecondsSinceUnixEpoch, |     room_id, | ||||||
|  |     serde::CanBeEmpty, | ||||||
|  |     user_id, MilliSecondsSinceUnixEpoch, | ||||||
| }; | }; | ||||||
| use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -14,7 +14,9 @@ use ruma_common::{ | |||||||
|         }, |         }, | ||||||
|         AnyMessageLikeEvent, MessageLikeEvent, MessageLikeUnsigned, OriginalMessageLikeEvent, |         AnyMessageLikeEvent, MessageLikeEvent, MessageLikeUnsigned, OriginalMessageLikeEvent, | ||||||
|     }, |     }, | ||||||
|     room_id, user_id, MilliSecondsSinceUnixEpoch, |     room_id, | ||||||
|  |     serde::CanBeEmpty, | ||||||
|  |     user_id, MilliSecondsSinceUnixEpoch, | ||||||
| }; | }; | ||||||
| use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -10,7 +10,7 @@ use ruma_common::{ | |||||||
|         MessageLikeEventType, MessageLikeUnsigned, OriginalMessageLikeEvent, |         MessageLikeEventType, MessageLikeUnsigned, OriginalMessageLikeEvent, | ||||||
|     }, |     }, | ||||||
|     mxc_uri, room_id, |     mxc_uri, room_id, | ||||||
|     serde::Raw, |     serde::{CanBeEmpty, Raw}, | ||||||
|     user_id, MilliSecondsSinceUnixEpoch, VoipVersionId, |     user_id, MilliSecondsSinceUnixEpoch, VoipVersionId, | ||||||
| }; | }; | ||||||
| use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | ||||||
|  | |||||||
| @ -8,7 +8,9 @@ use ruma_common::{ | |||||||
|         }, |         }, | ||||||
|         AnyMessageLikeEvent, MessageLikeUnsigned, |         AnyMessageLikeEvent, MessageLikeUnsigned, | ||||||
|     }, |     }, | ||||||
|     room_id, user_id, MilliSecondsSinceUnixEpoch, |     room_id, | ||||||
|  |     serde::CanBeEmpty, | ||||||
|  |     user_id, MilliSecondsSinceUnixEpoch, | ||||||
| }; | }; | ||||||
| use serde_json::{ | use serde_json::{ | ||||||
|     from_value as from_json_value, json, to_value as to_json_value, Value as JsonValue, |     from_value as from_json_value, json, to_value as to_json_value, Value as JsonValue, | ||||||
|  | |||||||
| @ -9,7 +9,7 @@ use ruma_common::{ | |||||||
|         StateUnsigned, SyncStateEvent, |         StateUnsigned, SyncStateEvent, | ||||||
|     }, |     }, | ||||||
|     mxc_uri, room_alias_id, room_id, |     mxc_uri, room_alias_id, room_id, | ||||||
|     serde::Raw, |     serde::{CanBeEmpty, Raw}, | ||||||
|     server_name, user_id, MilliSecondsSinceUnixEpoch, |     server_name, user_id, MilliSecondsSinceUnixEpoch, | ||||||
| }; | }; | ||||||
| use serde_json::{ | use serde_json::{ | ||||||
|  | |||||||
| @ -21,7 +21,7 @@ use ruma_common::{ | |||||||
|         AnyMessageLikeEvent, MessageLikeEvent, MessageLikeUnsigned, OriginalMessageLikeEvent, |         AnyMessageLikeEvent, MessageLikeEvent, MessageLikeUnsigned, OriginalMessageLikeEvent, | ||||||
|     }, |     }, | ||||||
|     mxc_uri, room_id, |     mxc_uri, room_id, | ||||||
|     serde::Base64, |     serde::{Base64, CanBeEmpty}, | ||||||
|     user_id, MilliSecondsSinceUnixEpoch, |     user_id, MilliSecondsSinceUnixEpoch, | ||||||
| }; | }; | ||||||
| use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | ||||||
|  | |||||||
| @ -19,7 +19,9 @@ use ruma_common::{ | |||||||
|         voice::{VoiceContent, VoiceEventContent}, |         voice::{VoiceContent, VoiceEventContent}, | ||||||
|         AnyMessageLikeEvent, MessageLikeEvent, MessageLikeUnsigned, OriginalMessageLikeEvent, |         AnyMessageLikeEvent, MessageLikeEvent, MessageLikeUnsigned, OriginalMessageLikeEvent, | ||||||
|     }, |     }, | ||||||
|     mxc_uri, room_id, user_id, MilliSecondsSinceUnixEpoch, |     mxc_uri, room_id, | ||||||
|  |     serde::CanBeEmpty, | ||||||
|  |     user_id, MilliSecondsSinceUnixEpoch, | ||||||
| }; | }; | ||||||
| use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | use serde_json::{from_value as from_json_value, json, to_value as to_json_value}; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -86,7 +86,7 @@ fn expand_serialize_event( | |||||||
|                 } |                 } | ||||||
|             } else if name == "unsigned" { |             } else if name == "unsigned" { | ||||||
|                 quote! { |                 quote! { | ||||||
|                     if !self.unsigned.is_empty() { |                     if !#ruma_common::serde::is_empty(&self.unsigned) { | ||||||
|                         state.serialize_field("unsigned", &self.unsigned)?; |                         state.serialize_field("unsigned", &self.unsigned)?; | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user