aboutsummaryrefslogtreecommitdiff
path: root/src/model/utils.rs
diff options
context:
space:
mode:
authorZeyla Hellyer <[email protected]>2018-01-01 15:55:46 -0800
committerZeyla Hellyer <[email protected]>2018-01-01 15:55:46 -0800
commit25dddb6695109eeead9e19593cb85a22096c2c7a (patch)
treed68d78d210a2804d10027035163871bf806c7e23 /src/model/utils.rs
parentGive hyper Response in HTTP errors (diff)
downloadserenity-25dddb6695109eeead9e19593cb85a22096c2c7a.tar.xz
serenity-25dddb6695109eeead9e19593cb85a22096c2c7a.zip
Implement or derive Serialize on all models
Diffstat (limited to 'src/model/utils.rs')
-rw-r--r--src/model/utils.rs48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/model/utils.rs b/src/model/utils.rs
index 9d4ca88..981b61b 100644
--- a/src/model/utils.rs
+++ b/src/model/utils.rs
@@ -1,6 +1,8 @@
use parking_lot::RwLock;
use serde::de::Error as DeError;
+use serde::ser::{SerializeSeq, Serialize, Serializer};
use std::collections::HashMap;
+use std::hash::Hash;
use std::sync::Arc;
use super::prelude::*;
@@ -121,6 +123,13 @@ pub fn deserialize_sync_user<'de, D>(deserializer: D)
Ok(Arc::new(RwLock::new(User::deserialize(deserializer)?)))
}
+pub fn serialize_sync_user<S: Serializer>(
+ user: &Arc<RwLock<User>>,
+ serializer: S,
+) -> StdResult<S::Ok, S::Error> {
+ User::serialize(&*user.read(), serializer)
+}
+
pub fn deserialize_users<'de, D: Deserializer<'de>>(
deserializer: D)
-> StdResult<HashMap<UserId, Arc<RwLock<User>>>, D::Error> {
@@ -134,6 +143,19 @@ pub fn deserialize_users<'de, D: Deserializer<'de>>(
Ok(users)
}
+pub fn serialize_users<S: Serializer>(
+ users: &HashMap<UserId, Arc<RwLock<User>>>,
+ serializer: S
+) -> StdResult<S::Ok, S::Error> {
+ let mut seq = serializer.serialize_seq(Some(users.len()))?;
+
+ for user in users.values() {
+ seq.serialize_element(&*user.read())?;
+ }
+
+ seq.end()
+}
+
pub fn deserialize_u16<'de, D: Deserializer<'de>>(deserializer: D) -> StdResult<u16, D::Error> {
deserializer.deserialize_any(U16Visitor)
}
@@ -155,6 +177,32 @@ pub fn deserialize_voice_states<'de, D: Deserializer<'de>>(
Ok(voice_states)
}
+pub fn serialize_gen_map<K: Eq + Hash, S: Serializer, V: Serialize>(
+ map: &HashMap<K, V>,
+ serializer: S,
+) -> StdResult<S::Ok, S::Error> {
+ let mut seq = serializer.serialize_seq(Some(map.len()))?;
+
+ for value in map.values() {
+ seq.serialize_element(&value)?;
+ }
+
+ seq.end()
+}
+
+pub fn serialize_gen_locked_map<K: Eq + Hash, S: Serializer, V: Serialize>(
+ map: &HashMap<K, Arc<RwLock<V>>>,
+ serializer: S,
+) -> StdResult<S::Ok, S::Error> {
+ let mut seq = serializer.serialize_seq(Some(map.len()))?;
+
+ for value in map.values() {
+ seq.serialize_element(&*value.read())?;
+ }
+
+ seq.end()
+}
+
#[cfg(all(feature = "cache", feature = "model"))]
pub fn user_has_perms(channel_id: ChannelId, mut permissions: Permissions) -> Result<bool> {
let cache = CACHE.read();