1use std::any::{Any, type_name};
2use std::fmt::{Debug, Display, Formatter};
3use bytes::Bytes;
4use serde::{Deserialize, Serialize};
5use serde_json::Value;
6use crate::request::ResponseStatus;
7use dce_util::mixed::{DceErr, DceResult};
8
9#[derive(Debug)]
10pub enum Serializable<Dto> {
11 Dto(Dto),
12 Status(ResponseStatus<Dto>),
13}
14
15
16#[derive(Debug)]
17pub enum Serialized {
18 String(String),
19 Bytes(Bytes),
20}
21
22impl Serialized {
23 pub fn to_string(&self) -> String {
24 match self {
25 Serialized::String(v) => v.to_string(),
26 Serialized::Bytes(v) => String::from_utf8_lossy(&v).to_string(),
27 }
28 }
29
30 pub fn json_value(&self) -> DceResult<Value> {
31 serde_json::from_str(self.to_string().as_str()).map_err(DceErr::closed0)
32 }
33}
34
35impl Display for Serialized {
36 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
37 f.write_str(self.to_string().as_str())
38 }
39}
40
41
42
43pub trait Deserializer<Dto> {
44 fn deserialize<'a>(&self, value: Serialized) -> DceResult<Dto>;
45}
46
47pub trait Serializer<Dto> {
48 fn serialize(&self, value: Serializable<Dto>) -> DceResult<Serialized>;
49}
50
51
52impl<Dto> Debug for dyn Deserializer<Dto> + Send + Sync {
53 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
54 f.write_str(format!("Deserializer: {}{{}}", type_name::<Self>()).as_str())
55 }
56}
57
58impl<Dto> Debug for dyn Serializer<Dto> + Send + Sync {
59 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
60 f.write_str(format!("Serializer: {}{{}}", type_name::<Self>()).as_str())
61 }
62}
63
64
65
66
67pub struct StringSerializer;
68
69impl<Dto: From<Serialized>> Deserializer<Dto> for StringSerializer {
70 fn deserialize<'a>(&self, value: Serialized) -> DceResult<Dto> {
71 Ok(Dto::from(value))
72 }
73}
74
75impl<Dto: Into<Serialized> + 'static> Serializer<Dto> for StringSerializer {
76 fn serialize(&self, value: Serializable<Dto>) -> DceResult<Serialized> {
77 Ok(match value {
78 Serializable::Dto(v) => v.into(),
79 Serializable::Status(s) => Serialized::String((if s.status { "succeeded" } else { "failed" }).to_string())
80 })
81 }
82}
83
84impl From<Vec<(&str, Box<dyn Any>)>> for StringSerializer {
85 fn from(_: Vec<(&str, Box<dyn Any>)>) -> Self {
86 StringSerializer
87 }
88}
89
90
91
92pub struct JsonSerializer {
93
94}
95
96impl<Dto: for<'a> Deserialize<'a>> Deserializer<Dto> for JsonSerializer {
97 fn deserialize<'a>(&self, value: Serialized) -> DceResult<Dto> {
98 Ok((match value {
99 Serialized::String(v) => serde_json::from_str(v.as_str()),
100 Serialized::Bytes(v) => serde_json::from_slice(v.as_ref()),
101 }).or(DceErr::closed0_wrap("Serialized cannot deserialize to ReqDto"))?)
102 }
103}
104
105impl<Dto: Serialize + 'static> Serializer<Dto> for JsonSerializer {
106 fn serialize(&self, value: Serializable<Dto>) -> DceResult<Serialized> {
107 Ok(Serialized::String(match value {
108 Serializable::Dto(v) => serde_json::to_string::<Dto>(&v),
109 Serializable::Status(v) => serde_json::to_string::<ResponseStatus<Dto>>(&v),
110 }.or(DceErr::closed0_wrap("RespDto not a jsonable"))?))
111 }
112}
113
114impl From<Vec<(&'static str, Box<dyn Any>)>> for JsonSerializer {
115 fn from(_: Vec<(&'static str, Box<dyn Any>)>) -> Self {
116 JsonSerializer {}
117 }
118}