v_common_onto/
individual2json.rs1use crate::datatype::{exponent_to_scale, DataType, Lang};
2use crate::individual::*;
3use crate::resource::{Resource, Value};
4use chrono::{TimeZone, Utc};
5use rust_decimal::Decimal;
6use serde::ser::{Serialize, SerializeMap, SerializeStruct, Serializer};
7use serde_json::json;
8use serde_json::value::Value as JSONValue;
9
10impl IndividualObj {
11 pub fn as_json_str(&self) -> String {
12 if let Ok(b) = serde_json::to_value(&self) {
13 return b.to_string();
14 }
15 "".to_owned()
16 }
17
18 pub fn as_json(&self) -> JSONValue {
19 if let Ok(b) = serde_json::to_value(&self) {
20 return b;
21 }
22
23 json!(null)
24 }
25}
26
27impl Serialize for IndividualObj {
28 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
29 where
30 S: Serializer,
31 {
32 let mut map = serializer.serialize_map(Some(self.resources.len()))?;
33 map.serialize_entry("@", &self.uri)?;
34 for (k, v) in &self.resources {
35 map.serialize_entry(&k, &v)?;
36 }
37 map.end()
38 }
39}
40
41impl Serialize for Resource {
42 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
43 where
44 S: Serializer,
45 {
46 let mut tup = serializer.serialize_struct("E", 0)?;
48
49 match &self.value {
50 Value::Num(_m, _e) => {
51 tup.serialize_field("data", &self.value)?;
52 }
53 Value::Int(i) => {
54 tup.serialize_field("data", &*i)?;
55 }
56 Value::Datetime(i) => {
57 let dt = *i;
58 tup.serialize_field("data", &format!("{:?}", &Utc.timestamp(dt, 0)))?;
59 }
60 Value::Bool(b) => {
61 tup.serialize_field("data", &*b)?;
62 }
63 Value::Str(s, l) => {
64 tup.serialize_field("data", &*s)?;
65
66 if self.rtype == DataType::String && *l != Lang::NONE {
67 tup.serialize_field("lang", &*l)?;
68 }
69 }
70 Value::Uri(s) => {
71 tup.serialize_field("data", &*s)?;
72 }
73 _ => {}
74 }
75 tup.serialize_field("type", &self.rtype)?;
76
77 tup.end()
78 }
79}
80
81impl Serialize for Value {
82 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
83 where
84 S: Serializer,
85 {
86 match &self {
87 Value::Num(m, e) => {
88 let (num, scale) = exponent_to_scale(m, e);
89 let d = Decimal::new(num, scale);
90 serializer.serialize_str(&d.to_string())
91 }
92 Value::Int(i) => serializer.serialize_i64(*i),
93 Value::Datetime(i) => serializer.serialize_i64(*i),
94 Value::Bool(b) => serializer.serialize_bool(*b),
95 Value::Str(s, l) => {
96 let mut tup = serializer.serialize_struct("E", 0)?;
99 tup.serialize_field("data", &*s)?;
101
102 if *l != Lang::NONE {
103 tup.serialize_field("lang", &*l)?;
104 }
105 tup.end()
106 }
107 Value::Uri(s) => {
108 let mut tup = serializer.serialize_struct("E", 0)?;
111 tup.serialize_field("data", &*s)?;
113
114 tup.end()
115 }
116 _ => serializer.serialize_none(),
117 }
118 }
119}
120
121impl Serialize for Lang {
122 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
123 where
124 S: Serializer,
125 {
126 match &self {
127 Lang::NONE => serializer.serialize_str("None"),
128 Lang::RU => serializer.serialize_str("RU"),
129 Lang::EN => serializer.serialize_str("EN"),
130 }
131 }
132}
133
134impl Serialize for DataType {
135 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
136 where
137 S: Serializer,
138 {
139 match &self {
140 DataType::Uri => serializer.serialize_str("Uri"),
141 DataType::String => serializer.serialize_str("String"),
142 DataType::Integer => serializer.serialize_str("Integer"),
143 DataType::Datetime => serializer.serialize_str("Datetime"),
144 DataType::Decimal => serializer.serialize_str("Decimal"),
145 DataType::Boolean => serializer.serialize_str("Boolean"),
146 DataType::Binary => serializer.serialize_str("Binary"),
147 }
148 }
149}