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