From 4a0e601063ed5eeb94921c7fb70ab54202c57280 Mon Sep 17 00:00:00 2001 From: P0lunin Date: Sat, 19 Oct 2019 20:01:22 +0300 Subject: [PATCH 1/3] added type False --- src/types/mod.rs | 2 ++ src/types/unit_false.rs | 78 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 src/types/unit_false.rs diff --git a/src/types/mod.rs b/src/types/mod.rs index e1f08e4f..eadb5942 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -47,6 +47,7 @@ pub use sticker::*; pub use sticker_set::*; pub use successful_payment::*; pub use unit_true::*; +pub use unit_false::*; pub use update::*; pub use user::*; pub use user_profile_photos::*; @@ -130,6 +131,7 @@ mod shipping_query; mod sticker; mod sticker_set; mod successful_payment; +mod unit_false; mod unit_true; mod update; mod user; diff --git a/src/types/unit_false.rs b/src/types/unit_false.rs new file mode 100644 index 00000000..2ac0f793 --- /dev/null +++ b/src/types/unit_false.rs @@ -0,0 +1,78 @@ +use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use serde::de::Visitor; + +#[derive(Copy, Clone, Debug, Default, Eq, Hash, PartialEq, PartialOrd, Ord)] +pub struct False; + +impl std::convert::TryFrom for False { + type Error = (); + + fn try_from(value: bool) -> Result { + #[allow(clippy::match_bool)] + match value { + true => Err(()), + false => Ok(False), + } + } +} + +impl<'de> Deserialize<'de> for False { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de> + { + deserializer.deserialize_bool(FalseVisitor) + } +} + +struct FalseVisitor; + +impl<'de> Visitor<'de> for FalseVisitor { + type Value = False; + + fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(formatter, "bool, equal to `false`") + } + + fn visit_bool(self, value: bool) -> Result + where + E: serde::de::Error, + { + #[allow(clippy::match_bool)] + match value { + true => Err(E::custom("expected `false`, found `true`")), + false => Ok(False) + } + } +} + +impl Serialize for False { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer + { + serializer.serialize_bool(false) + } +} + +#[cfg(test)] +mod tests { + use serde_json::{from_str, to_string}; + + use super::False; + + #[test] + fn unit_true_de() { + let json = "false"; + let expected = False; + let actual = from_str(json).unwrap(); + assert_eq!(expected, actual); + } + + #[test] + fn unit_true_se() { + let actual = to_string(&False).unwrap(); + let expected = "false"; + assert_eq!(expected, actual); + } +} From 1e0f60bdef67a9896509445053c0a44cae87ca25 Mon Sep 17 00:00:00 2001 From: P0lunin Date: Sat, 19 Oct 2019 20:02:27 +0300 Subject: [PATCH 2/3] added True and False types --- src/network/telegram_response.rs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/network/telegram_response.rs b/src/network/telegram_response.rs index 05e7acb7..a3c77b4e 100644 --- a/src/network/telegram_response.rs +++ b/src/network/telegram_response.rs @@ -2,6 +2,7 @@ use reqwest::StatusCode; use crate::{ requests::ResponseResult, types::ResponseParameters, RequestError, + types::{True, False} }; #[derive(Deserialize)] @@ -10,14 +11,14 @@ pub enum TelegramResponse { Ok { /// A dummy field. Used only for deserialization. #[allow(dead_code)] - ok: bool, // TODO: True type + ok: True, result: R, }, Err { /// A dummy field. Used only for deserialization. #[allow(dead_code)] - ok: bool, // TODO: False type + ok: False, description: String, error_code: u16, From 281d01d1a27bc790409d7dcb4c83ceebf53d0ad1 Mon Sep 17 00:00:00 2001 From: P0lunin Date: Sat, 19 Oct 2019 20:08:09 +0300 Subject: [PATCH 3/3] tests were renamed --- src/types/unit_false.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/types/unit_false.rs b/src/types/unit_false.rs index 2ac0f793..78299be1 100644 --- a/src/types/unit_false.rs +++ b/src/types/unit_false.rs @@ -62,7 +62,7 @@ mod tests { use super::False; #[test] - fn unit_true_de() { + fn unit_false_de() { let json = "false"; let expected = False; let actual = from_str(json).unwrap(); @@ -70,7 +70,7 @@ mod tests { } #[test] - fn unit_true_se() { + fn unit_false_se() { let actual = to_string(&False).unwrap(); let expected = "false"; assert_eq!(expected, actual);