use crate::Map;
use alloc::{string::String, vec::Vec};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Default)]
#[serde(untagged)]
pub enum PrimitiveValue {
String(String),
U64(u64),
I64(i64),
F32(f32),
F64(f64),
Bool(bool),
#[default]
Null,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(untagged)]
pub enum ValuePrimitiveType {
Primitive(PrimitiveValue),
NestedPrimitive(ValuePrimitive),
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(untagged)]
pub enum ValueType {
Primitive(PrimitiveValue),
Array(Vec<ValuePrimitiveType>),
Nested(Value),
}
pub type ValuePrimitive = Map<String, PrimitiveValue>;
pub type Value = Map<String, ValueType>;
pub type Properties = Value;
pub type MValue = Value;
pub trait MValueCompatible:
for<'a> From<&'a MValue> + From<MValue> + Into<MValue> + Clone + Default
{
}
impl From<&MValue> for MValue {
fn from(mvalue: &MValue) -> MValue {
mvalue.clone()
}
}
impl MValueCompatible for MValue {}
pub type LineStringMValues<M = MValue> = Vec<M>;
pub type MultiLineStringMValues<M = MValue> = Vec<LineStringMValues<M>>;
pub type PolygonMValues<M = MValue> = Vec<LineStringMValues<M>>;
pub type MultiPolygonMValues<M = MValue> = Vec<PolygonMValues<M>>;
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(untagged)]
pub enum MValues<M: Clone = MValue> {
MValue(M),
LineStringMValues(LineStringMValues<M>),
MultiLineStringMValues(MultiLineStringMValues<M>),
PolygonMValues(PolygonMValues<M>),
MultiPolygonMValues(MultiPolygonMValues<M>),
}
#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)]
#[serde(untagged)]
pub enum JSONValue {
Primitive(PrimitiveValue),
Array(Vec<JSONValue>),
Object(Map<String, JSONValue>),
}
pub type JSONProperties = Map<String, JSONValue>;
pub type MapboxProperties = Map<String, PrimitiveValue>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn json_value() {
let json_default = JSONValue::default();
assert_eq!(json_default, JSONValue::Primitive(PrimitiveValue::Null));
let json_default2: JSONValue = Default::default();
assert_eq!(json_default2, json_default);
}
#[test]
fn mvalue_from_ref() {
let mvalue = MValue::from(&MValue::default());
assert_eq!(mvalue, MValue::default());
}
#[test]
fn primitive_value() {
let prim_value = PrimitiveValue::String("test".into());
assert_eq!(prim_value, PrimitiveValue::String("test".into()));
let prim_value = PrimitiveValue::U64(1);
assert_eq!(prim_value, PrimitiveValue::U64(1));
let prim_value = PrimitiveValue::I64(1);
assert_eq!(prim_value, PrimitiveValue::I64(1));
let prim_value = PrimitiveValue::F32(1.0);
assert_eq!(prim_value, PrimitiveValue::F32(1.0));
let prim_value = PrimitiveValue::F64(1.0);
assert_eq!(prim_value, PrimitiveValue::F64(1.0));
let prim_value = PrimitiveValue::Bool(true);
assert_eq!(prim_value, PrimitiveValue::Bool(true));
let prim_value = PrimitiveValue::Null;
assert_eq!(prim_value, PrimitiveValue::Null);
}
#[test]
fn primitive_string_serialize() {
let prim_value = PrimitiveValue::String("test".into());
let serialized = serde_json::to_string(&prim_value).unwrap();
assert_eq!(serialized, "\"test\"");
let deserialize = serde_json::from_str::<PrimitiveValue>(&serialized).unwrap();
assert_eq!(deserialize, PrimitiveValue::String("test".into()));
}
#[test]
fn primitive_u64_serialize() {
let prim_value = PrimitiveValue::U64(1);
let serialized = serde_json::to_string(&prim_value).unwrap();
assert_eq!(serialized, "1");
let deserialize = serde_json::from_str::<PrimitiveValue>(&serialized).unwrap();
assert_eq!(deserialize, PrimitiveValue::U64(1));
}
#[test]
fn primitive_i64_serialize() {
let prim_value = PrimitiveValue::I64(-1);
let serialized = serde_json::to_string(&prim_value).unwrap();
assert_eq!(serialized, "-1");
let deserialize = serde_json::from_str::<PrimitiveValue>(&serialized).unwrap();
assert_eq!(deserialize, PrimitiveValue::I64(-1));
}
#[test]
fn primitive_f32_serialize() {
let prim_value = PrimitiveValue::F32(1.0);
let serialized = serde_json::to_string(&prim_value).unwrap();
assert_eq!(serialized, "1.0");
let deserialize = serde_json::from_str::<PrimitiveValue>(&serialized).unwrap();
assert_eq!(deserialize, PrimitiveValue::F32(1.0));
}
#[test]
fn primitive_f64_serialize() {
let prim_value = PrimitiveValue::F64(-135435345435345345.0);
let serialized = serde_json::to_string(&prim_value).unwrap();
assert_eq!(serialized, "-1.3543534543534534e17");
let deserialize = serde_json::from_str::<PrimitiveValue>(&serialized).unwrap();
assert_eq!(deserialize, PrimitiveValue::F32(-1.3543534e17));
}
#[test]
fn primitive_bool_serialize() {
let prim_value = PrimitiveValue::Bool(true);
let serialized = serde_json::to_string(&prim_value).unwrap();
assert_eq!(serialized, "true");
let deserialize = serde_json::from_str::<PrimitiveValue>(&serialized).unwrap();
assert_eq!(deserialize, PrimitiveValue::Bool(true));
}
#[test]
fn primitive_null_serialize() {
let prim_value = PrimitiveValue::Null;
let serialized = serde_json::to_string(&prim_value).unwrap();
assert_eq!(serialized, "null");
let deserialize = serde_json::from_str::<PrimitiveValue>(&serialized).unwrap();
assert_eq!(deserialize, PrimitiveValue::Null);
}
#[test]
fn value_default() {
let default = ValueType::default();
assert_eq!(default, ValueType::Primitive(PrimitiveValue::Null));
let default_instance: ValueType = Default::default();
assert_eq!(default, default_instance);
}
#[test]
fn value_serialize() {
let value = Value::from([
("type".into(), ValueType::Primitive(PrimitiveValue::String("Point".into()))),
("coordinates".into(), ValueType::Primitive(PrimitiveValue::F32(1.0))),
]);
let serialized = serde_json::to_string(&value).unwrap();
assert_eq!(serialized, "{\"coordinates\":1.0,\"type\":\"Point\"}");
let deserialize = serde_json::from_str::<Value>(&serialized).unwrap();
assert_eq!(deserialize, value);
let value_str = r#"
{
"class": "ocean",
"offset": 22,
"info": {
"name": "Pacific Ocean",
"value": 22.2
}
}
"#;
let deserialize: MValue = serde_json::from_str::<Value>(value_str).unwrap();
assert_eq!(
deserialize,
Value::from([
("class".into(), ValueType::Primitive(PrimitiveValue::String("ocean".into()))),
("offset".into(), ValueType::Primitive(PrimitiveValue::U64(22))),
(
"info".into(),
ValueType::Nested(Value::from([
(
"name".into(),
ValueType::Primitive(PrimitiveValue::String("Pacific Ocean".into()))
),
("value".into(), ValueType::Primitive(PrimitiveValue::F32(22.2))),
]))
),
])
);
let deserialize_to: MValue = deserialize.clone();
assert_eq!(deserialize_to, deserialize);
let desrialize_from: MValue = MValue::from(deserialize_to);
assert_eq!(desrialize_from, deserialize);
}
}