diff options
| author | Zeyla Hellyer <[email protected]> | 2018-01-01 15:55:46 -0800 |
|---|---|---|
| committer | Zeyla Hellyer <[email protected]> | 2018-01-01 15:55:46 -0800 |
| commit | 25dddb6695109eeead9e19593cb85a22096c2c7a (patch) | |
| tree | d68d78d210a2804d10027035163871bf806c7e23 /src/model/utils.rs | |
| parent | Give hyper Response in HTTP errors (diff) | |
| download | serenity-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.rs | 48 |
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(); |