[fractal] API: Merge serializers and deserializers



commit 9882dd9cd4a071020fed0ccae16b993b2ab7f2fb
Author: Alejandro Domínguez <adomu net-c com>
Date:   Wed Oct 2 11:24:45 2019 +0200

    API: Merge serializers and deserializers
    
    This allows the use of #[serde(with = "")] macro
    attribute for both the serializer and deserializer
    instead of specifying each one separately.

 fractal-matrix-api/src/lib.rs                      |  3 +-
 fractal-matrix-api/src/meson.build                 |  2 +-
 fractal-matrix-api/src/r0/account.rs               |  4 +-
 .../r0/contact/request_verification_token_email.rs |  4 +-
 .../contact/request_verification_token_msisdn.rs   |  4 +-
 .../src/r0/directory/post_public_rooms.rs          |  7 ++--
 fractal-matrix-api/src/r0/media/create.rs          |  4 +-
 fractal-matrix-api/src/r0/profile/get_profile.rs   |  4 +-
 .../src/r0/profile/set_avatar_url.rs               |  4 +-
 fractal-matrix-api/src/r0/search/user.rs           |  4 +-
 fractal-matrix-api/src/r0/server/domain_info.rs    |  6 +--
 fractal-matrix-api/src/r0/sync/sync_events.rs      |  4 +-
 .../src/r0/thirdparty/get_supported_protocols.rs   |  6 +--
 fractal-matrix-api/src/ser.rs                      | 39 ------------------
 fractal-matrix-api/src/{de.rs => serde.rs}         | 47 ++++++++++++++++++++++
 15 files changed, 74 insertions(+), 68 deletions(-)
---
diff --git a/fractal-matrix-api/src/lib.rs b/fractal-matrix-api/src/lib.rs
index 5b633847..8ea0976d 100644
--- a/fractal-matrix-api/src/lib.rs
+++ b/fractal-matrix-api/src/lib.rs
@@ -6,11 +6,10 @@ pub mod globals;
 pub mod backend;
 pub mod cache;
 mod client;
-mod de;
 pub mod identity;
 mod model;
 pub mod r0;
-mod ser;
+mod serde;
 pub mod types;
 
 #[cfg(test)]
diff --git a/fractal-matrix-api/src/meson.build b/fractal-matrix-api/src/meson.build
index 937aff55..e867baff 100644
--- a/fractal-matrix-api/src/meson.build
+++ b/fractal-matrix-api/src/meson.build
@@ -56,7 +56,7 @@ api_sources = files(
   'identity.rs',
   'lib.rs',
   'r0.rs',
-  'ser.rs',
+  'serde.rs',
   'types.rs',
   'util.rs'
 )
diff --git a/fractal-matrix-api/src/r0/account.rs b/fractal-matrix-api/src/r0/account.rs
index 1718d71b..4ce99199 100644
--- a/fractal-matrix-api/src/r0/account.rs
+++ b/fractal-matrix-api/src/r0/account.rs
@@ -5,7 +5,7 @@ pub mod logout;
 pub mod register;
 
 use crate::r0::{Medium, ThreePIDCredentials};
-use crate::ser::serialize_url;
+use crate::serde::url as serde_url;
 use serde::Serialize;
 use url::Url;
 
@@ -89,7 +89,7 @@ pub enum AuthenticationData {
     },
     #[serde(rename = "m.login.oauth2")]
     OAuth2 {
-        #[serde(serialize_with = "serialize_url")]
+        #[serde(with = "serde_url")]
         uri: Url,
     },
     #[serde(rename = "m.login.email.identity")]
diff --git a/fractal-matrix-api/src/r0/contact/request_verification_token_email.rs 
b/fractal-matrix-api/src/r0/contact/request_verification_token_email.rs
index 62482512..826d7ed1 100644
--- a/fractal-matrix-api/src/r0/contact/request_verification_token_email.rs
+++ b/fractal-matrix-api/src/r0/contact/request_verification_token_email.rs
@@ -1,5 +1,5 @@
 use crate::r0::HostAndPort;
-use crate::ser::serialize_option_url;
+use crate::serde::option_url;
 use reqwest::Client;
 use reqwest::Error;
 use reqwest::Request;
@@ -17,7 +17,7 @@ pub struct Body {
     pub email: String,
     pub id_server: HostAndPort<String>,
     pub send_attempt: u64,
-    #[serde(serialize_with = "serialize_option_url")]
+    #[serde(with = "option_url")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub next_link: Option<Url>,
 }
diff --git a/fractal-matrix-api/src/r0/contact/request_verification_token_msisdn.rs 
b/fractal-matrix-api/src/r0/contact/request_verification_token_msisdn.rs
index 22ce283a..f2e5f947 100644
--- a/fractal-matrix-api/src/r0/contact/request_verification_token_msisdn.rs
+++ b/fractal-matrix-api/src/r0/contact/request_verification_token_msisdn.rs
@@ -1,5 +1,5 @@
 use crate::r0::HostAndPort;
-use crate::ser::serialize_option_url;
+use crate::serde::option_url;
 use reqwest::Client;
 use reqwest::Error;
 use reqwest::Request;
@@ -18,7 +18,7 @@ pub struct Body {
     pub country: String,
     pub id_server: HostAndPort<String>,
     pub send_attempt: u64,
-    #[serde(serialize_with = "serialize_option_url")]
+    #[serde(with = "option_url")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub next_link: Option<Url>,
 }
diff --git a/fractal-matrix-api/src/r0/directory/post_public_rooms.rs 
b/fractal-matrix-api/src/r0/directory/post_public_rooms.rs
index 5f341a7a..51c0a4d0 100644
--- a/fractal-matrix-api/src/r0/directory/post_public_rooms.rs
+++ b/fractal-matrix-api/src/r0/directory/post_public_rooms.rs
@@ -1,5 +1,4 @@
-use crate::de::option_url;
-use crate::ser::serialize_option_host;
+use crate::serde::{option_host, option_url};
 use reqwest::Client;
 use reqwest::Error;
 use reqwest::Request;
@@ -10,7 +9,7 @@ use url::Url;
 #[derive(Clone, Debug, Serialize)]
 pub struct Parameters {
     pub access_token: String,
-    #[serde(serialize_with = "serialize_option_host")]
+    #[serde(with = "option_host")]
     #[serde(skip_serializing_if = "Option::is_none")]
     pub server: Option<Host<String>>,
 }
@@ -62,7 +61,7 @@ pub struct Response {
 #[derive(Clone, Debug, Deserialize)]
 pub struct Chunk {
     pub aliases: Option<Vec<String>>,
-    #[serde(deserialize_with = "option_url::deserialize")]
+    #[serde(with = "option_url")]
     #[serde(default)]
     pub avatar_url: Option<Url>,
     pub canonical_alias: Option<String>,
diff --git a/fractal-matrix-api/src/r0/media/create.rs b/fractal-matrix-api/src/r0/media/create.rs
index 8410e541..183963d9 100644
--- a/fractal-matrix-api/src/r0/media/create.rs
+++ b/fractal-matrix-api/src/r0/media/create.rs
@@ -1,4 +1,4 @@
-use crate::de::url as serde_url;
+use crate::serde::url as serde_url;
 use reqwest::header::{HeaderValue, CONTENT_TYPE};
 use reqwest::Client;
 use reqwest::Error;
@@ -14,7 +14,7 @@ pub struct Parameters {
 
 #[derive(Clone, Debug, Deserialize)]
 pub struct Response {
-    #[serde(deserialize_with = "serde_url::deserialize")]
+    #[serde(with = "serde_url")]
     pub content_uri: Url,
 }
 
diff --git a/fractal-matrix-api/src/r0/profile/get_profile.rs 
b/fractal-matrix-api/src/r0/profile/get_profile.rs
index d27f7358..7af43940 100644
--- a/fractal-matrix-api/src/r0/profile/get_profile.rs
+++ b/fractal-matrix-api/src/r0/profile/get_profile.rs
@@ -1,4 +1,4 @@
-use crate::de::option_url;
+use crate::serde::option_url;
 use reqwest::Client;
 use reqwest::Error;
 use reqwest::Request;
@@ -7,7 +7,7 @@ use url::Url;
 
 #[derive(Clone, Debug, Deserialize)]
 pub struct Response {
-    #[serde(deserialize_with = "option_url::deserialize")]
+    #[serde(with = "option_url")]
     #[serde(default)]
     pub avatar_url: Option<Url>,
     pub displayname: Option<String>,
diff --git a/fractal-matrix-api/src/r0/profile/set_avatar_url.rs 
b/fractal-matrix-api/src/r0/profile/set_avatar_url.rs
index 05ed46b5..7c2b0de2 100644
--- a/fractal-matrix-api/src/r0/profile/set_avatar_url.rs
+++ b/fractal-matrix-api/src/r0/profile/set_avatar_url.rs
@@ -1,4 +1,4 @@
-use crate::ser::serialize_option_url;
+use crate::serde::option_url;
 use reqwest::Client;
 use reqwest::Error;
 use reqwest::Request;
@@ -12,7 +12,7 @@ pub struct Parameters {
 
 #[derive(Clone, Debug, Serialize)]
 pub struct Body {
-    #[serde(serialize_with = "serialize_option_url")]
+    #[serde(with = "option_url")]
     pub avatar_url: Option<Url>,
 }
 
diff --git a/fractal-matrix-api/src/r0/search/user.rs b/fractal-matrix-api/src/r0/search/user.rs
index 0703f51a..48055b13 100644
--- a/fractal-matrix-api/src/r0/search/user.rs
+++ b/fractal-matrix-api/src/r0/search/user.rs
@@ -1,4 +1,4 @@
-use crate::de::option_url;
+use crate::serde::option_url;
 use reqwest::Client;
 use reqwest::Error;
 use reqwest::Request;
@@ -37,7 +37,7 @@ pub struct User {
     pub user_id: String,
     #[serde(default)]
     pub display_name: Option<String>,
-    #[serde(deserialize_with = "option_url::deserialize")]
+    #[serde(with = "option_url")]
     #[serde(default)]
     pub avatar_url: Option<Url>,
 }
diff --git a/fractal-matrix-api/src/r0/server/domain_info.rs b/fractal-matrix-api/src/r0/server/domain_info.rs
index 1c298366..5e1f3778 100644
--- a/fractal-matrix-api/src/r0/server/domain_info.rs
+++ b/fractal-matrix-api/src/r0/server/domain_info.rs
@@ -1,4 +1,4 @@
-use crate::de::url as serde_url;
+use crate::serde::url as serde_url;
 use reqwest::Client;
 use reqwest::Error;
 use reqwest::Request;
@@ -15,13 +15,13 @@ pub struct Response {
 
 #[derive(Clone, Debug, Deserialize)]
 pub struct HomeserverInfo {
-    #[serde(deserialize_with = "serde_url::deserialize")]
+    #[serde(with = "serde_url")]
     pub base_url: Url,
 }
 
 #[derive(Clone, Debug, Deserialize)]
 pub struct IDServerInfo {
-    #[serde(deserialize_with = "serde_url::deserialize")]
+    #[serde(with = "serde_url")]
     pub base_url: Url,
 }
 
diff --git a/fractal-matrix-api/src/r0/sync/sync_events.rs b/fractal-matrix-api/src/r0/sync/sync_events.rs
index 6b6dc164..37e74a7d 100644
--- a/fractal-matrix-api/src/r0/sync/sync_events.rs
+++ b/fractal-matrix-api/src/r0/sync/sync_events.rs
@@ -1,5 +1,5 @@
 use crate::r0::filter::{serialize_filter_as_str, Filter};
-use crate::ser::serialize_duration_as_millis;
+use crate::serde::duration_as_millis;
 use reqwest::Client;
 use reqwest::Error;
 use reqwest::Request;
@@ -27,7 +27,7 @@ pub struct Parameters<'a> {
 #[serde(tag = "full_state", content = "timeout")]
 pub enum IncludeState {
     #[serde(rename = "false")]
-    #[serde(serialize_with = "serialize_duration_as_millis")]
+    #[serde(with = "duration_as_millis")]
     Changed(Duration),
     #[serde(rename = "true")]
     Full,
diff --git a/fractal-matrix-api/src/r0/thirdparty/get_supported_protocols.rs 
b/fractal-matrix-api/src/r0/thirdparty/get_supported_protocols.rs
index 07df1978..892ff119 100644
--- a/fractal-matrix-api/src/r0/thirdparty/get_supported_protocols.rs
+++ b/fractal-matrix-api/src/r0/thirdparty/get_supported_protocols.rs
@@ -1,4 +1,4 @@
-use crate::de::option_url;
+use crate::serde::option_url;
 use reqwest::Client;
 use reqwest::Error;
 use reqwest::Request;
@@ -20,7 +20,7 @@ pub struct Protocol {
     pub location_fields: Vec<String>,
     // This field is documented as "required",
     // but for some reason matrix.org does not send this
-    #[serde(deserialize_with = "option_url::deserialize")]
+    #[serde(with = "option_url")]
     #[serde(default)]
     pub icon: Option<Url>,
     pub field_types: BTreeMap<String, FieldType>,
@@ -39,7 +39,7 @@ pub struct ProtocolInstance {
     #[serde(rename = "network_id")]
     pub id: String,
     pub desc: String,
-    #[serde(deserialize_with = "option_url::deserialize")]
+    #[serde(with = "option_url")]
     #[serde(default)]
     pub icon: Option<Url>,
     pub fields: JsonValue,
diff --git a/fractal-matrix-api/src/de.rs b/fractal-matrix-api/src/serde.rs
similarity index 60%
rename from fractal-matrix-api/src/de.rs
rename to fractal-matrix-api/src/serde.rs
index e2b213d1..3076ae8e 100644
--- a/fractal-matrix-api/src/de.rs
+++ b/fractal-matrix-api/src/serde.rs
@@ -1,6 +1,7 @@
 pub mod url {
     use serde::de::{Error, Visitor};
     use serde::Deserializer;
+    use serde::Serializer;
     use std::fmt::{self, Formatter};
     use url::Url;
 
@@ -27,12 +28,20 @@ pub mod url {
     {
         de.deserialize_str(UrlVisitor)
     }
+
+    pub fn serialize<S>(url: &Url, ser: S) -> Result<S::Ok, S::Error>
+    where
+        S: Serializer,
+    {
+        ser.serialize_str(url.as_str())
+    }
 }
 
 pub mod option_url {
     use super::url as serde_url;
     use serde::de::{Error, Visitor};
     use serde::Deserializer;
+    use serde::Serializer;
     use std::fmt::{self, Formatter};
     use url::Url;
 
@@ -73,4 +82,42 @@ pub mod option_url {
     {
         de.deserialize_option(OptionUrlVisitor)
     }
+
+    pub fn serialize<S>(url: &Option<Url>, ser: S) -> Result<S::Ok, S::Error>
+    where
+        S: Serializer,
+    {
+        match url {
+            Some(u) => ser.serialize_str(u.as_str()),
+            None => ser.serialize_none(),
+        }
+    }
+}
+
+pub mod option_host {
+    use serde::Serializer;
+    use url::Host;
+
+    pub fn serialize<S>(host: &Option<Host>, ser: S) -> Result<S::Ok, S::Error>
+    where
+        S: Serializer,
+    {
+        match host {
+            Some(h) => ser.serialize_str(&h.to_string()),
+            None => ser.serialize_none(),
+        }
+    }
+}
+
+pub mod duration_as_millis {
+    use serde::Serializer;
+    use std::time::Duration;
+
+    // TODO: use as_millis when duration_as_u128 is stable
+    pub fn serialize<S>(duration: &Duration, ser: S) -> Result<S::Ok, S::Error>
+    where
+        S: Serializer,
+    {
+        ser.serialize_u64(duration.as_secs() * 1000 + (duration.subsec_millis() as u64))
+    }
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]