Replace HashMap with BTreeMap
This commit is contained in:
parent
013decf401
commit
2480bb292a
@ -153,7 +153,7 @@ impl ToTokens for RumaEvent {
|
||||
}
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
fn unsigned(&self) -> &serde_json::Map<String, serde_json::Value> {
|
||||
fn unsigned(&self) -> &std::collections::BTreeMap<String, serde_json::Value> {
|
||||
&self.unsigned
|
||||
}
|
||||
}
|
||||
@ -295,8 +295,8 @@ fn populate_room_event_fields(content_name: Ident, fields: Vec<Field>) -> Vec<Fi
|
||||
pub sender: ruma_identifiers::UserId,
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
#[serde(default, skip_serializing_if = "serde_json::Map::is_empty")]
|
||||
pub unsigned: serde_json::Map<String, serde_json::Value>,
|
||||
#[serde(default, skip_serializing_if = "std::collections::BTreeMap::is_empty")]
|
||||
pub unsigned: std::collections::BTreeMap<String, serde_json::Value>,
|
||||
};
|
||||
|
||||
fields.extend(punctuated_fields.into_iter().map(|p| p.field));
|
||||
|
@ -112,7 +112,7 @@ mod parse;
|
||||
/// ///
|
||||
/// /// A mapping of `UserId`'s to a collection of `RoomId`'s which are considered
|
||||
/// /// *direct* for that particular user.
|
||||
/// std::collections::HashMap<ruma_identifiers::UserId, Vec<ruma_identifiers::RoomId>>
|
||||
/// std::collections::BTreeMap<ruma_identifiers::UserId, Vec<ruma_identifiers::RoomId>>
|
||||
/// }
|
||||
/// }
|
||||
/// }
|
||||
|
@ -1,6 +1,6 @@
|
||||
//! Types for the *m.direct* event.
|
||||
|
||||
use std::collections::HashMap;
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
use ruma_events_macros::ruma_event;
|
||||
use ruma_identifiers::{RoomId, UserId};
|
||||
@ -15,14 +15,14 @@ ruma_event! {
|
||||
///
|
||||
/// A mapping of `UserId`s to a list of `RoomId`s which are considered *direct* for that
|
||||
/// particular user.
|
||||
HashMap<UserId, Vec<RoomId>>
|
||||
BTreeMap<UserId, Vec<RoomId>>
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use std::collections::HashMap;
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
use ruma_identifiers::{RoomId, UserId};
|
||||
use serde_json::{from_value as from_json_value, json, to_value as to_json_value};
|
||||
@ -32,7 +32,7 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn serialization() {
|
||||
let mut content: DirectEventContent = HashMap::new();
|
||||
let mut content: DirectEventContent = BTreeMap::new();
|
||||
let alice = UserId::new("ruma.io").unwrap();
|
||||
let room = vec![RoomId::new("ruma.io").unwrap()];
|
||||
|
||||
|
@ -6,7 +6,7 @@ use std::{
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
/// The type of an event.
|
||||
#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
|
||||
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
|
||||
// Cow<str> because deserialization sometimes needs to copy to unescape things
|
||||
#[serde(from = "Cow<'_, str>", into = "String")]
|
||||
pub enum EventType {
|
||||
|
@ -1,4 +1,4 @@
|
||||
use std::{collections::HashMap, convert::Infallible, fmt::Display};
|
||||
use std::{collections::BTreeMap, convert::Infallible, fmt::Display};
|
||||
|
||||
use serde::de::DeserializeOwned;
|
||||
|
||||
@ -35,7 +35,7 @@ impl FromRaw for serde_json::Value {
|
||||
}
|
||||
}
|
||||
|
||||
impl<K, V, S> FromRaw for HashMap<K, V, S>
|
||||
impl<K, V> FromRaw for BTreeMap<K, V>
|
||||
where
|
||||
Self: DeserializeOwned,
|
||||
{
|
||||
|
@ -1,6 +1,6 @@
|
||||
//! Types for the *m.key.verification.mac* event.
|
||||
|
||||
use std::collections::HashMap;
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
use ruma_events_macros::ruma_event;
|
||||
|
||||
@ -20,7 +20,7 @@ ruma_event! {
|
||||
/// A map of the key ID to the MAC of the key, using the algorithm in the verification process.
|
||||
///
|
||||
/// The MAC is encoded as unpadded Base64.
|
||||
pub mac: HashMap<String, String>,
|
||||
pub mac: BTreeMap<String, String>,
|
||||
|
||||
/// The MAC of the comma-separated, sorted, list of key IDs given in the `mac` property, encoded
|
||||
/// as unpadded Base64.
|
||||
|
33
src/lib.rs
33
src/lib.rs
@ -44,7 +44,7 @@
|
||||
//! They have at least the following additional keys:
|
||||
//! * `state_key`, a string which serves as a sort of "sub-type."
|
||||
//! The state key allows a room to persist multiple state events of the same type.
|
||||
//! You can think of a room's state events as being a `HashMap` where the keys are the tuple
|
||||
//! You can think of a room's state events as being a `BTreeMap` where the keys are the tuple
|
||||
//! `(event_type, state_key)`.
|
||||
//! * Optionally, `prev_content`, a JSON object containing the `content` object from the
|
||||
//! previous event of the given `(event_type, state_key)` tuple in the given room.
|
||||
@ -116,6 +116,7 @@
|
||||
#![allow(clippy::use_self)]
|
||||
|
||||
use std::{
|
||||
collections::BTreeMap,
|
||||
error::Error,
|
||||
fmt::{Debug, Display, Formatter, Result as FmtResult},
|
||||
time::SystemTime,
|
||||
@ -127,7 +128,7 @@ use serde::{
|
||||
ser::SerializeMap,
|
||||
Deserialize, Deserializer, Serialize, Serializer,
|
||||
};
|
||||
use serde_json::{Map, Value};
|
||||
use serde_json::Value;
|
||||
|
||||
pub use self::{custom::CustomEvent, custom_room::CustomRoomEvent, custom_state::CustomStateEvent};
|
||||
|
||||
@ -317,7 +318,7 @@ impl Error for FromStrError {}
|
||||
/// A meaningless value that serializes to an empty JSON object.
|
||||
///
|
||||
/// This type is used in a few places where the Matrix specification requires an empty JSON object,
|
||||
/// but it's wasteful to represent it as a `HashMap` in Rust code.
|
||||
/// but it's wasteful to represent it as a `BTreeMap` in Rust code.
|
||||
#[derive(Clone, Debug, PartialEq)]
|
||||
pub struct Empty;
|
||||
|
||||
@ -394,7 +395,7 @@ pub trait RoomEvent: Event {
|
||||
fn sender(&self) -> &UserId;
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
fn unsigned(&self) -> &Map<String, Value>;
|
||||
fn unsigned(&self) -> &BTreeMap<String, Value>;
|
||||
}
|
||||
|
||||
/// An event that describes persistent state about a room.
|
||||
@ -459,13 +460,13 @@ mod custom {
|
||||
}
|
||||
|
||||
mod custom_room {
|
||||
use std::time::SystemTime;
|
||||
use std::{collections::BTreeMap, time::SystemTime};
|
||||
|
||||
use super::{Event, EventType, RoomEvent};
|
||||
|
||||
use ruma_events_macros::FromRaw;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serde_json::{Map, Value};
|
||||
use serde_json::Value;
|
||||
|
||||
/// A custom room event not covered by the Matrix specification.
|
||||
#[derive(Clone, Debug, FromRaw, PartialEq, Serialize)]
|
||||
@ -485,8 +486,8 @@ mod custom_room {
|
||||
/// The unique identifier for the user who sent this event.
|
||||
pub sender: ruma_identifiers::UserId,
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
#[serde(skip_serializing_if = "serde_json::Map::is_empty")]
|
||||
pub unsigned: Map<String, Value>,
|
||||
#[serde(skip_serializing_if = "std::collections::BTreeMap::is_empty")]
|
||||
pub unsigned: BTreeMap<String, Value>,
|
||||
}
|
||||
|
||||
/// The payload for `CustomRoomEvent`.
|
||||
@ -532,7 +533,7 @@ mod custom_room {
|
||||
}
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
fn unsigned(&self) -> &Map<String, Value> {
|
||||
fn unsigned(&self) -> &BTreeMap<String, Value> {
|
||||
&self.unsigned
|
||||
}
|
||||
}
|
||||
@ -559,19 +560,19 @@ mod custom_room {
|
||||
pub sender: ruma_identifiers::UserId,
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
#[serde(default)]
|
||||
pub unsigned: Map<String, Value>,
|
||||
pub unsigned: BTreeMap<String, Value>,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mod custom_state {
|
||||
use std::time::SystemTime;
|
||||
use std::{collections::BTreeMap, time::SystemTime};
|
||||
|
||||
use super::{Event, EventType, RoomEvent, StateEvent};
|
||||
|
||||
use ruma_events_macros::FromRaw;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serde_json::{Map, Value};
|
||||
use serde_json::Value;
|
||||
|
||||
/// A custom state event not covered by the Matrix specification.
|
||||
#[derive(Clone, Debug, FromRaw, PartialEq, Serialize)]
|
||||
@ -595,8 +596,8 @@ mod custom_state {
|
||||
/// A key that determines which piece of room state the event represents.
|
||||
pub state_key: String,
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
#[serde(skip_serializing_if = "serde_json::Map::is_empty")]
|
||||
pub unsigned: Map<String, Value>,
|
||||
#[serde(skip_serializing_if = "std::collections::BTreeMap::is_empty")]
|
||||
pub unsigned: BTreeMap<String, Value>,
|
||||
}
|
||||
|
||||
/// The payload for `CustomStateEvent`.
|
||||
@ -642,7 +643,7 @@ mod custom_state {
|
||||
}
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
fn unsigned(&self) -> &Map<String, Value> {
|
||||
fn unsigned(&self) -> &BTreeMap<String, Value> {
|
||||
&self.unsigned
|
||||
}
|
||||
}
|
||||
@ -685,7 +686,7 @@ mod custom_state {
|
||||
pub state_key: String,
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
#[serde(default)]
|
||||
pub unsigned: Map<String, Value>,
|
||||
pub unsigned: BTreeMap<String, Value>,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -72,7 +72,7 @@ macro_rules! impl_room_event {
|
||||
}
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
fn unsigned(&self) -> &::serde_json::Map<String, ::serde_json::Value> {
|
||||
fn unsigned(&self) -> &::std::collections::BTreeMap<String, ::serde_json::Value> {
|
||||
&self.unsigned
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,6 @@
|
||||
//! Types for the *m.receipt* event.
|
||||
|
||||
use std::{collections::HashMap, time::SystemTime};
|
||||
use std::{collections::BTreeMap, time::SystemTime};
|
||||
|
||||
use ruma_events_macros::ruma_event;
|
||||
use ruma_identifiers::{EventId, RoomId, UserId};
|
||||
@ -23,7 +23,7 @@ ruma_event! {
|
||||
///
|
||||
/// A mapping of event ID to a collection of receipts for this event ID. The event ID is the ID of
|
||||
/// the event being acknowledged and *not* an ID for the receipt itself.
|
||||
HashMap<EventId, Receipts>
|
||||
BTreeMap<EventId, Receipts>
|
||||
},
|
||||
}
|
||||
}
|
||||
@ -40,7 +40,7 @@ pub struct Receipts {
|
||||
/// A mapping of user ID to receipt.
|
||||
///
|
||||
/// The user ID is the entity who sent this receipt.
|
||||
pub type UserReceipts = HashMap<UserId, Receipt>;
|
||||
pub type UserReceipts = BTreeMap<UserId, Receipt>;
|
||||
|
||||
/// An acknowledgement of an event.
|
||||
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
|
||||
|
@ -2,7 +2,7 @@
|
||||
//!
|
||||
//! This module also contains types shared by events in its child namespaces.
|
||||
|
||||
use std::collections::HashMap;
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
use js_int::UInt;
|
||||
use serde::{Deserialize, Serialize};
|
||||
@ -97,7 +97,7 @@ pub struct EncryptedFile {
|
||||
|
||||
/// A map from an algorithm name to a hash of the ciphertext, encoded as unpadded base64.
|
||||
/// Clients should support the SHA-256 hash, which uses the key sha256.
|
||||
pub hashes: HashMap<String, String>,
|
||||
pub hashes: BTreeMap<String, String>,
|
||||
|
||||
/// Version of the encrypted attachments protocol. Must be `v2`.
|
||||
pub v: String,
|
||||
|
@ -1,6 +1,7 @@
|
||||
//! Types for the *m.room.canonical_alias* event.
|
||||
|
||||
use std::{
|
||||
collections::BTreeMap,
|
||||
convert::TryFrom,
|
||||
time::{SystemTime, UNIX_EPOCH},
|
||||
};
|
||||
@ -10,7 +11,7 @@ use serde::{
|
||||
ser::{Error, SerializeStruct},
|
||||
Deserialize, Serialize, Serializer,
|
||||
};
|
||||
use serde_json::{Map, Value};
|
||||
use serde_json::Value;
|
||||
|
||||
use crate::{util::empty_string_as_none, Event, EventType, FromRaw};
|
||||
|
||||
@ -39,7 +40,7 @@ pub struct CanonicalAliasEvent {
|
||||
pub state_key: String,
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
pub unsigned: Map<String, Value>,
|
||||
pub unsigned: BTreeMap<String, Value>,
|
||||
}
|
||||
|
||||
/// The payload for `CanonicalAliasEvent`.
|
||||
@ -165,7 +166,7 @@ pub(crate) mod raw {
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
#[serde(default)]
|
||||
pub unsigned: Map<String, Value>,
|
||||
pub unsigned: BTreeMap<String, Value>,
|
||||
}
|
||||
|
||||
/// The payload of a `CanonicalAliasEvent`.
|
||||
@ -185,12 +186,13 @@ pub(crate) mod raw {
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use std::{
|
||||
collections::BTreeMap,
|
||||
convert::TryFrom,
|
||||
time::{Duration, UNIX_EPOCH},
|
||||
};
|
||||
|
||||
use ruma_identifiers::{EventId, RoomAliasId, UserId};
|
||||
use serde_json::{from_value as from_json_value, json, to_value as to_json_value, Map};
|
||||
use serde_json::{from_value as from_json_value, json, to_value as to_json_value};
|
||||
|
||||
use super::{CanonicalAliasEvent, CanonicalAliasEventContent};
|
||||
use crate::EventResult;
|
||||
@ -207,7 +209,7 @@ mod tests {
|
||||
room_id: None,
|
||||
sender: UserId::try_from("@carl:example.com").unwrap(),
|
||||
state_key: "".to_string(),
|
||||
unsigned: Map::new(),
|
||||
unsigned: BTreeMap::new(),
|
||||
};
|
||||
|
||||
let actual = to_json_value(&canonical_alias_event).unwrap();
|
||||
|
@ -1,11 +1,11 @@
|
||||
//! Types for the *m.room.encrypted* event.
|
||||
|
||||
use std::{collections::HashMap, time::SystemTime};
|
||||
use std::{collections::BTreeMap, time::SystemTime};
|
||||
|
||||
use js_int::UInt;
|
||||
use ruma_identifiers::{DeviceId, EventId, RoomId, UserId};
|
||||
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
||||
use serde_json::{from_value, Map, Value};
|
||||
use serde_json::{from_value, Value};
|
||||
|
||||
use crate::{Algorithm, EventType, FromRaw};
|
||||
|
||||
@ -34,8 +34,8 @@ pub struct EncryptedEvent {
|
||||
pub sender: UserId,
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
#[serde(skip_serializing_if = "Map::is_empty")]
|
||||
pub unsigned: Map<String, Value>,
|
||||
#[serde(skip_serializing_if = "BTreeMap::is_empty")]
|
||||
pub unsigned: BTreeMap<String, Value>,
|
||||
}
|
||||
|
||||
/// The payload for `EncryptedEvent`.
|
||||
@ -134,7 +134,7 @@ pub(crate) mod raw {
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
#[serde(default)]
|
||||
pub unsigned: Map<String, Value>,
|
||||
pub unsigned: BTreeMap<String, Value>,
|
||||
}
|
||||
|
||||
/// The payload for `EncryptedEvent`.
|
||||
@ -206,7 +206,7 @@ pub struct OlmV1Curve25519AesSha2Content {
|
||||
pub algorithm: Algorithm,
|
||||
|
||||
/// A map from the recipient Curve25519 identity key to ciphertext information.
|
||||
pub ciphertext: HashMap<String, CiphertextInfo>,
|
||||
pub ciphertext: BTreeMap<String, CiphertextInfo>,
|
||||
|
||||
/// The Curve25519 key of the sender.
|
||||
pub sender_key: String,
|
||||
|
@ -1,6 +1,6 @@
|
||||
//! Types for the *m.room.member* event.
|
||||
|
||||
use std::collections::HashMap;
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
use ruma_events_macros::ruma_event;
|
||||
use ruma_identifiers::UserId;
|
||||
@ -123,7 +123,7 @@ pub struct SignedContent {
|
||||
|
||||
/// A single signature from the verifying server, in the format specified by the Signing Events
|
||||
/// section of the server-server API.
|
||||
pub signatures: HashMap<String, HashMap<String, String>>,
|
||||
pub signatures: BTreeMap<String, BTreeMap<String, String>>,
|
||||
|
||||
/// The token property of the containing third_party_invite object.
|
||||
pub token: String,
|
||||
@ -227,7 +227,7 @@ mod tests {
|
||||
};
|
||||
|
||||
use ruma_identifiers::{EventId, RoomId, UserId};
|
||||
use serde_json::{json, Map};
|
||||
use serde_json::json;
|
||||
|
||||
use super::*;
|
||||
use crate::util::serde_json_eq_try_from_raw;
|
||||
@ -247,7 +247,7 @@ mod tests {
|
||||
room_id: Some(RoomId::try_from("!n8f893n9:example.com").unwrap()),
|
||||
sender: UserId::try_from("@carl:example.com").unwrap(),
|
||||
state_key: "example.com".to_string(),
|
||||
unsigned: Map::new(),
|
||||
unsigned: BTreeMap::new(),
|
||||
prev_content: None,
|
||||
};
|
||||
let json = json!({
|
||||
@ -279,7 +279,7 @@ mod tests {
|
||||
room_id: Some(RoomId::try_from("!n8f893n9:example.com").unwrap()),
|
||||
sender: UserId::try_from("@carl:example.com").unwrap(),
|
||||
state_key: "example.com".to_string(),
|
||||
unsigned: Map::new(),
|
||||
unsigned: BTreeMap::new(),
|
||||
prev_content: Some(MemberEventContent {
|
||||
avatar_url: None,
|
||||
displayname: None,
|
||||
@ -335,7 +335,7 @@ mod tests {
|
||||
room_id: Some(RoomId::try_from("!jEsUZKDJdhlrceRyVU:example.org").unwrap()),
|
||||
sender: UserId::try_from("@alice:example.org").unwrap(),
|
||||
state_key: "@alice:example.org".to_string(),
|
||||
unsigned: Map::new(),
|
||||
unsigned: BTreeMap::new(),
|
||||
prev_content: None,
|
||||
};
|
||||
let json = json!({
|
||||
@ -390,7 +390,7 @@ mod tests {
|
||||
room_id: Some(RoomId::try_from("!jEsUZKDJdhlrceRyVU:example.org").unwrap()),
|
||||
sender: UserId::try_from("@alice:example.org").unwrap(),
|
||||
state_key: "@alice:example.org".to_string(),
|
||||
unsigned: Map::new(),
|
||||
unsigned: BTreeMap::new(),
|
||||
prev_content: Some(MemberEventContent {
|
||||
avatar_url: Some("mxc://example.org/SEsfnsuifSDFSSEF".to_owned()),
|
||||
displayname: Some("Alice Margatroid".to_owned()),
|
||||
|
@ -1,11 +1,11 @@
|
||||
//! Types for the *m.room.message* event.
|
||||
|
||||
use std::time::SystemTime;
|
||||
use std::{collections::BTreeMap, time::SystemTime};
|
||||
|
||||
use js_int::UInt;
|
||||
use ruma_identifiers::{EventId, RoomId, UserId};
|
||||
use serde::{ser::SerializeStruct, Deserialize, Deserializer, Serialize, Serializer};
|
||||
use serde_json::{from_value, Map, Value};
|
||||
use serde_json::{from_value, Value};
|
||||
|
||||
use super::{EncryptedFile, ImageInfo, ThumbnailInfo};
|
||||
use crate::{EventType, FromRaw};
|
||||
@ -34,8 +34,8 @@ pub struct MessageEvent {
|
||||
pub sender: UserId,
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
#[serde(skip_serializing_if = "Map::is_empty")]
|
||||
pub unsigned: Map<String, Value>,
|
||||
#[serde(skip_serializing_if = "BTreeMap::is_empty")]
|
||||
pub unsigned: BTreeMap<String, Value>,
|
||||
}
|
||||
|
||||
/// The payload for `MessageEvent`.
|
||||
@ -163,7 +163,7 @@ pub(crate) mod raw {
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
#[serde(default)]
|
||||
pub unsigned: Map<String, Value>,
|
||||
pub unsigned: BTreeMap<String, Value>,
|
||||
}
|
||||
|
||||
/// The payload for `MessageEvent`.
|
||||
|
@ -1,10 +1,10 @@
|
||||
//! Types for the *m.room.name* event.
|
||||
|
||||
use std::time::SystemTime;
|
||||
use std::{collections::BTreeMap, time::SystemTime};
|
||||
|
||||
use ruma_identifiers::{EventId, RoomId, UserId};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serde_json::{Map, Value};
|
||||
use serde_json::Value;
|
||||
|
||||
use crate::{util::empty_string_as_none, EventType, InvalidInput, TryFromRaw};
|
||||
|
||||
@ -37,8 +37,8 @@ pub struct NameEvent {
|
||||
pub state_key: String,
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
#[serde(skip_serializing_if = "Map::is_empty")]
|
||||
pub unsigned: Map<String, Value>,
|
||||
#[serde(skip_serializing_if = "BTreeMap::is_empty")]
|
||||
pub unsigned: BTreeMap<String, Value>,
|
||||
}
|
||||
|
||||
/// The payload for `NameEvent`.
|
||||
@ -136,7 +136,7 @@ pub(crate) mod raw {
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
#[serde(default)]
|
||||
pub unsigned: Map<String, Value>,
|
||||
pub unsigned: BTreeMap<String, Value>,
|
||||
}
|
||||
|
||||
/// The payload of a `NameEvent`.
|
||||
@ -154,13 +154,14 @@ pub(crate) mod raw {
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use std::{
|
||||
collections::BTreeMap,
|
||||
convert::TryFrom,
|
||||
iter::FromIterator,
|
||||
time::{Duration, UNIX_EPOCH},
|
||||
};
|
||||
|
||||
use ruma_identifiers::{EventId, RoomId, UserId};
|
||||
use serde_json::{from_value as from_json_value, json, to_value as to_json_value, Map};
|
||||
use serde_json::{from_value as from_json_value, json, to_value as to_json_value};
|
||||
|
||||
use crate::EventResult;
|
||||
|
||||
@ -178,7 +179,7 @@ mod tests {
|
||||
room_id: None,
|
||||
sender: UserId::try_from("@carl:example.com").unwrap(),
|
||||
state_key: "".to_string(),
|
||||
unsigned: Map::new(),
|
||||
unsigned: BTreeMap::new(),
|
||||
};
|
||||
|
||||
let actual = to_json_value(&name_event).unwrap();
|
||||
|
@ -17,10 +17,13 @@ ruma_event! {
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use std::time::{Duration, UNIX_EPOCH};
|
||||
use std::{
|
||||
collections::BTreeMap,
|
||||
time::{Duration, UNIX_EPOCH},
|
||||
};
|
||||
|
||||
use ruma_identifiers::{EventId, RoomId, UserId};
|
||||
use serde_json::{to_string, Map};
|
||||
use serde_json::to_string;
|
||||
|
||||
use crate::{
|
||||
room::pinned_events::{PinnedEventsEvent, PinnedEventsEventContent},
|
||||
@ -42,7 +45,7 @@ mod tests {
|
||||
room_id: Some(RoomId::new("example.com").unwrap()),
|
||||
sender: UserId::new("example.com").unwrap(),
|
||||
state_key: "".to_string(),
|
||||
unsigned: Map::new(),
|
||||
unsigned: BTreeMap::new(),
|
||||
};
|
||||
|
||||
let serialized_event = to_string(&event).unwrap();
|
||||
|
@ -1,11 +1,11 @@
|
||||
//! Types for the *m.room.power_levels* event.
|
||||
|
||||
use std::{collections::HashMap, time::SystemTime};
|
||||
use std::{collections::BTreeMap, time::SystemTime};
|
||||
|
||||
use js_int::Int;
|
||||
use ruma_identifiers::{EventId, RoomId, UserId};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serde_json::{Map, Value};
|
||||
use serde_json::Value;
|
||||
|
||||
use crate::{EventType, FromRaw};
|
||||
|
||||
@ -32,8 +32,8 @@ pub struct PowerLevelsEvent {
|
||||
pub room_id: Option<RoomId>,
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
#[serde(skip_serializing_if = "Map::is_empty")]
|
||||
pub unsigned: Map<String, Value>,
|
||||
#[serde(skip_serializing_if = "BTreeMap::is_empty")]
|
||||
pub unsigned: BTreeMap<String, Value>,
|
||||
|
||||
/// The unique identifier for the user who sent this event.
|
||||
pub sender: UserId,
|
||||
@ -52,8 +52,8 @@ pub struct PowerLevelsEventContent {
|
||||
/// The level required to send specific event types.
|
||||
///
|
||||
/// This is a mapping from event type to power level required.
|
||||
#[serde(skip_serializing_if = "HashMap::is_empty")]
|
||||
pub events: HashMap<EventType, Int>,
|
||||
#[serde(skip_serializing_if = "BTreeMap::is_empty")]
|
||||
pub events: BTreeMap<EventType, Int>,
|
||||
|
||||
/// The default level required to send message events.
|
||||
#[serde(skip_serializing_if = "is_power_level_zero")]
|
||||
@ -78,8 +78,8 @@ pub struct PowerLevelsEventContent {
|
||||
/// The power levels for specific users.
|
||||
///
|
||||
/// This is a mapping from `user_id` to power level for that user.
|
||||
#[serde(skip_serializing_if = "HashMap::is_empty")]
|
||||
pub users: HashMap<UserId, Int>,
|
||||
#[serde(skip_serializing_if = "BTreeMap::is_empty")]
|
||||
pub users: BTreeMap<UserId, Int>,
|
||||
|
||||
/// The default power level for every user in the room.
|
||||
#[serde(skip_serializing_if = "is_power_level_zero")]
|
||||
@ -158,7 +158,7 @@ pub(crate) mod raw {
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
#[serde(default)]
|
||||
pub unsigned: Map<String, Value>,
|
||||
pub unsigned: BTreeMap<String, Value>,
|
||||
|
||||
/// The unique identifier for the user who sent this event.
|
||||
pub sender: UserId,
|
||||
@ -178,7 +178,7 @@ pub(crate) mod raw {
|
||||
///
|
||||
/// This is a mapping from event type to power level required.
|
||||
#[serde(default)]
|
||||
pub events: HashMap<EventType, Int>,
|
||||
pub events: BTreeMap<EventType, Int>,
|
||||
|
||||
/// The default level required to send message events.
|
||||
#[serde(default)]
|
||||
@ -204,7 +204,7 @@ pub(crate) mod raw {
|
||||
///
|
||||
/// This is a mapping from `user_id` to power level for that user.
|
||||
#[serde(default)]
|
||||
pub users: HashMap<UserId, Int>,
|
||||
pub users: BTreeMap<UserId, Int>,
|
||||
|
||||
/// The default power level for every user in the room.
|
||||
#[serde(default)]
|
||||
@ -263,15 +263,15 @@ fn is_power_level_zero(l: &Int) -> bool {
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use std::{
|
||||
collections::HashMap,
|
||||
collections::BTreeMap,
|
||||
convert::TryFrom,
|
||||
time::{Duration, UNIX_EPOCH},
|
||||
};
|
||||
|
||||
use js_int::Int;
|
||||
use maplit::hashmap;
|
||||
use maplit::btreemap;
|
||||
use ruma_identifiers::{EventId, RoomId, UserId};
|
||||
use serde_json::{json, to_value as to_json_value, Map};
|
||||
use serde_json::{json, to_value as to_json_value};
|
||||
|
||||
use super::{
|
||||
default_power_level, NotificationPowerLevels, PowerLevelsEvent, PowerLevelsEventContent,
|
||||
@ -285,13 +285,13 @@ mod tests {
|
||||
let power_levels_event = PowerLevelsEvent {
|
||||
content: PowerLevelsEventContent {
|
||||
ban: default,
|
||||
events: HashMap::new(),
|
||||
events: BTreeMap::new(),
|
||||
events_default: Int::from(0),
|
||||
invite: default,
|
||||
kick: default,
|
||||
redact: default,
|
||||
state_default: default,
|
||||
users: HashMap::new(),
|
||||
users: BTreeMap::new(),
|
||||
users_default: Int::from(0),
|
||||
notifications: NotificationPowerLevels::default(),
|
||||
},
|
||||
@ -299,7 +299,7 @@ mod tests {
|
||||
origin_server_ts: UNIX_EPOCH + Duration::from_millis(1),
|
||||
prev_content: None,
|
||||
room_id: None,
|
||||
unsigned: Map::new(),
|
||||
unsigned: BTreeMap::new(),
|
||||
sender: UserId::try_from("@carl:example.com").unwrap(),
|
||||
state_key: "".to_string(),
|
||||
};
|
||||
@ -323,7 +323,7 @@ mod tests {
|
||||
let power_levels_event = PowerLevelsEvent {
|
||||
content: PowerLevelsEventContent {
|
||||
ban: Int::from(23),
|
||||
events: hashmap! {
|
||||
events: btreemap! {
|
||||
EventType::Dummy => Int::from(23)
|
||||
},
|
||||
events_default: Int::from(23),
|
||||
@ -331,7 +331,7 @@ mod tests {
|
||||
kick: Int::from(23),
|
||||
redact: Int::from(23),
|
||||
state_default: Int::from(23),
|
||||
users: hashmap! {
|
||||
users: btreemap! {
|
||||
user.clone() => Int::from(23)
|
||||
},
|
||||
users_default: Int::from(23),
|
||||
@ -344,7 +344,7 @@ mod tests {
|
||||
prev_content: Some(PowerLevelsEventContent {
|
||||
// Make just one field different so we at least know they're two different objects.
|
||||
ban: Int::from(42),
|
||||
events: hashmap! {
|
||||
events: btreemap! {
|
||||
EventType::Dummy => Int::from(42)
|
||||
},
|
||||
events_default: Int::from(42),
|
||||
@ -352,7 +352,7 @@ mod tests {
|
||||
kick: Int::from(42),
|
||||
redact: Int::from(42),
|
||||
state_default: Int::from(42),
|
||||
users: hashmap! {
|
||||
users: btreemap! {
|
||||
user.clone() => Int::from(42)
|
||||
},
|
||||
users_default: Int::from(42),
|
||||
|
@ -1,10 +1,10 @@
|
||||
//! Types for the *m.room.server_acl* event.
|
||||
|
||||
use std::time::SystemTime;
|
||||
use std::{collections::BTreeMap, time::SystemTime};
|
||||
|
||||
use ruma_identifiers::{EventId, RoomId, UserId};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serde_json::{Map, Value};
|
||||
use serde_json::Value;
|
||||
|
||||
use crate::{util::default_true, EventType, FromRaw};
|
||||
|
||||
@ -37,8 +37,8 @@ pub struct ServerAclEvent {
|
||||
pub state_key: String,
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
#[serde(skip_serializing_if = "Map::is_empty")]
|
||||
pub unsigned: Map<String, Value>,
|
||||
#[serde(skip_serializing_if = "BTreeMap::is_empty")]
|
||||
pub unsigned: BTreeMap<String, Value>,
|
||||
}
|
||||
|
||||
/// The payload for `ServerAclEvent`.
|
||||
@ -129,7 +129,7 @@ pub(crate) mod raw {
|
||||
|
||||
/// Additional key-value pairs not signed by the homeserver.
|
||||
#[serde(default)]
|
||||
pub unsigned: Map<String, Value>,
|
||||
pub unsigned: BTreeMap<String, Value>,
|
||||
|
||||
/// The unique identifier for the user who sent this event.
|
||||
pub sender: UserId,
|
||||
|
@ -1,6 +1,6 @@
|
||||
//! Types for the *m.tag* event.
|
||||
|
||||
use std::collections::HashMap;
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
use ruma_events_macros::ruma_event;
|
||||
use serde::{Deserialize, Serialize};
|
||||
@ -12,7 +12,7 @@ ruma_event! {
|
||||
event_type: "m.tag",
|
||||
content: {
|
||||
/// A map of tag names to tag info.
|
||||
pub tags: HashMap<String, TagInfo>,
|
||||
pub tags: BTreeMap<String, TagInfo>,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
16
src/util.rs
16
src/util.rs
@ -72,7 +72,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
/// Serde serialization and deserialization functions that map a `Vec<T>` to a `HashMap<T, Empty>`.
|
||||
/// Serde serialization and deserialization functions that map a `Vec<T>` to a `BTreeMap<T, Empty>`.
|
||||
///
|
||||
/// The Matrix spec sometimes specifies lists as hash maps so the list entries can be expanded with
|
||||
/// attributes without breaking compatibility. As that would be a breaking change for ruma's event
|
||||
@ -80,28 +80,30 @@ where
|
||||
///
|
||||
/// To be used as `#[serde(with = "vec_as_map_of_empty")]`.
|
||||
pub mod vec_as_map_of_empty {
|
||||
use crate::Empty;
|
||||
use std::collections::BTreeMap;
|
||||
|
||||
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
||||
use std::{collections::HashMap, hash::Hash};
|
||||
|
||||
use crate::Empty;
|
||||
|
||||
#[allow(clippy::ptr_arg)]
|
||||
pub fn serialize<S, T>(vec: &Vec<T>, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
T: Serialize + Hash + Eq,
|
||||
T: Serialize + Eq + Ord,
|
||||
{
|
||||
vec.iter()
|
||||
.map(|v| (v, Empty))
|
||||
.collect::<HashMap<_, _>>()
|
||||
.collect::<BTreeMap<_, _>>()
|
||||
.serialize(serializer)
|
||||
}
|
||||
|
||||
pub fn deserialize<'de, D, T>(deserializer: D) -> Result<Vec<T>, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
T: Deserialize<'de> + Hash + Eq,
|
||||
T: Deserialize<'de> + Eq + Ord,
|
||||
{
|
||||
HashMap::<T, Empty>::deserialize(deserializer)
|
||||
BTreeMap::<T, Empty>::deserialize(deserializer)
|
||||
.map(|hashmap| hashmap.into_iter().map(|(k, _)| k).collect())
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
use std::{
|
||||
collections::HashMap,
|
||||
collections::BTreeMap,
|
||||
convert::TryFrom,
|
||||
time::{Duration, UNIX_EPOCH},
|
||||
};
|
||||
@ -37,7 +37,7 @@ mod common_case {
|
||||
room_id: None,
|
||||
sender: UserId::try_from("@carl:example.com").unwrap(),
|
||||
state_key: "example.com".to_string(),
|
||||
unsigned: serde_json::Map::new(),
|
||||
unsigned: std::collections::BTreeMap::new(),
|
||||
};
|
||||
let json = json!({
|
||||
"content": {
|
||||
@ -66,7 +66,7 @@ mod common_case {
|
||||
room_id: Some(RoomId::try_from("!n8f893n9:example.com").unwrap()),
|
||||
sender: UserId::try_from("@carl:example.com").unwrap(),
|
||||
state_key: "example.com".to_string(),
|
||||
unsigned: serde_json::Map::new(),
|
||||
unsigned: std::collections::BTreeMap::new(),
|
||||
};
|
||||
let json = json!({
|
||||
"content": {
|
||||
@ -183,7 +183,7 @@ mod type_alias {
|
||||
///
|
||||
/// A mapping of `UserId`'s to a collection of `RoomId`'s which are considered
|
||||
/// *direct* for that particular user.
|
||||
HashMap<ruma_identifiers::UserId, Vec<ruma_identifiers::RoomId>>
|
||||
BTreeMap<ruma_identifiers::UserId, Vec<ruma_identifiers::RoomId>>
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user