From 6857959562a53edc37e5296de68adf5cc9a0275c Mon Sep 17 00:00:00 2001 From: Horhik Date: Mon, 29 Mar 2021 10:21:38 +0300 Subject: [PATCH] fail to implement deserialize for SSK --- src/types/key.rs | 91 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 82 insertions(+), 9 deletions(-) diff --git a/src/types/key.rs b/src/types/key.rs index fd6a544..30252fe 100644 --- a/src/types/key.rs +++ b/src/types/key.rs @@ -6,8 +6,11 @@ use rusqlite::{ }; extern crate serde; +use std::fmt; + +use serde::de::{self, Deserialize, Deserializer, MapAccess, SeqAccess, Visitor, Error}; use serde::ser::{SerializeStruct, Serializer}; -use serde::Serialize ; +use serde::Serialize; #[derive(Debug, PartialEq)] pub struct SSK { pub sign_key: String, @@ -40,6 +43,70 @@ impl serde::ser::Serialize for SSK { serializer.serialize_str(&self.convert()[..]) } } + +impl<'de> Deserialize<'de> for SSK { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct SSKVisitor; + + impl<'de> Visitor<'de> for SSKVisitor { + type Value = SSK; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("struct SSK") + } + fn visit_str(self, v: &str) -> Result + where + E: de::Error, + { + return Ok(SSK{sign_key: "lol".to_string(), decrypt_key: "kik".to_string(),settings: Some("kek".to_string())}); + match SSK::parse(v) { + Some(ssk) => { + Ok(ssk) + }, + None => { + Err(de::Error::unknown_variant(v, &["expected key with structure like SSK@../../?"])) + } + } + + } + fn visit_borrowed_str(self, v: &'de str) -> Result + where + E: de::Error, + { + return Ok(SSK{sign_key: "lol".to_string(), decrypt_key: "kik".to_string(),settings: Some("kek".to_string())}); + match SSK::parse(v) { + Some(ssk) => { + Ok(ssk) + }, + None => { + Err(de::Error::unknown_variant(v, &["expected key with structure like SSK@../../?"])) + } + } + + } + fn visit_string(self, v: String) -> Result + where + E: de::Error, + { + return Ok(SSK{sign_key: "lol".to_string(), decrypt_key: "kik".to_string(),settings: Some("kek".to_string())}); + match SSK::parse(&v[..]) { + Some(ssk) => { + Ok(ssk) + }, + None => { + Err(de::Error::unknown_variant(&v[..], &["expected key with structure like SSK@../../?"])) + } + } + } + } + println!("tset"); + return deserializer.deserialize_any(SSKVisitor) + } +} + #[derive(Debug, PartialEq)] pub struct USK { pub ssk: SSK, @@ -53,20 +120,26 @@ mod tests { use crate::types::SSK; use crate::*; #[test] - fn is_serializing() { - let ssk:SSK = SSK { + fn is_ssk_serializing() { + let ssk: SSK = SSK { sign_key: "AKTTKG6YwjrHzWo67laRcoPqibyiTdyYufjVg54fBlWr".to_string(), decrypt_key: "AwUSJG5ZS-FDZTqnt6skTzhxQe08T-fbKXj8aEHZsXM".to_string(), - settings: None + settings: None, }; let json = serde_json::json!(&ssk); - - assert_eq!("SSK@AKTTKG6YwjrHzWo67laRcoPqibyiTdyYufjVg54fBlWr,AwUSJG5ZS-FDZTqnt6skTzhxQe08T-fbKXj8aEHZsXM", json); assert_eq!("SSK@AKTTKG6YwjrHzWo67laRcoPqibyiTdyYufjVg54fBlWr,AwUSJG5ZS-FDZTqnt6skTzhxQe08T-fbKXj8aEHZsXM", &ssk.convert()); - - - + } + #[test] + fn is_ssk_deserializing() { + let ssk: SSK = SSK { + sign_key: "AKTTKG6YwjrHzWo67laRcoPqibyiTdyYufjVg54fBlWr".to_string(), + decrypt_key: "AwUSJG5ZS-FDZTqnt6skTzhxQe08T-fbKXj8aEHZsXM".to_string(), + settings: None, + }; + let res = serde_json::from_str::("SSK@AKTTKG6YwjrHzWo67laRcoPqibyiTdyYufjVg54fBlWr,AwUSJG5ZS-FDZTqnt6skTzhxQe08T-fbKXj8aEHZsXM"); + let aa = res.unwrap(); + assert_eq!(aa, ssk) } }