[fractal] API: Merge serializers and deserializers
- From: Daniel Garcia Moreno <danigm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [fractal] API: Merge serializers and deserializers
- Date: Mon, 21 Oct 2019 09:33:34 +0000 (UTC)
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]