1use crate::Map;
2use alloc::{string::String, vec::Vec};
3use serde::{Deserialize, Serialize};
4
5#[derive(Serialize, Deserialize, Debug, Clone, Default)]
7#[serde(untagged)]
8pub enum PrimitiveValue {
9    String(String),
11    U64(u64),
13    I64(i64),
15    F32(f32),
17    F64(f64),
19    Bool(bool),
21    #[default]
23    Null,
24}
25
26#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
28#[serde(untagged)]
29pub enum ValuePrimitiveType {
30    Primitive(PrimitiveValue),
32    NestedPrimitive(ValuePrimitive),
34}
35
36#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
41#[serde(untagged)]
42pub enum ValueType {
43    Primitive(PrimitiveValue),
45    Array(Vec<ValuePrimitiveType>),
47    Nested(Value),
49}
50
51pub type ValuePrimitive = Map<String, PrimitiveValue>;
53pub type Value = Map<String, ValueType>;
55pub type Properties = Value;
57pub type MValue = Value;
59
60pub trait MValueCompatible:
62    for<'a> From<&'a MValue> + From<MValue> + Into<MValue> + Clone + Default
63{
64}
65impl From<&MValue> for MValue {
66    fn from(mvalue: &MValue) -> MValue {
67        mvalue.clone()
68    }
69}
70impl MValueCompatible for MValue {}
71
72pub type LineStringMValues<M = MValue> = Vec<M>;
74pub type MultiLineStringMValues<M = MValue> = Vec<LineStringMValues<M>>;
76pub type PolygonMValues<M = MValue> = Vec<LineStringMValues<M>>;
78pub type MultiPolygonMValues<M = MValue> = Vec<PolygonMValues<M>>;
80
81#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
83#[serde(untagged)]
84pub enum MValues<M: Clone = MValue> {
85    MValue(M),
87    LineStringMValues(LineStringMValues<M>),
89    MultiLineStringMValues(MultiLineStringMValues<M>),
91    PolygonMValues(PolygonMValues<M>),
93    MultiPolygonMValues(MultiPolygonMValues<M>),
95}
96
97#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)]
99#[serde(untagged)]
100pub enum JSONValue {
101    Primitive(PrimitiveValue),
103    Array(Vec<JSONValue>),
105    Object(JSONProperties),
107}
108
109pub type JSONProperties = Map<String, JSONValue>;
111pub trait JSONPropertiesCompatible:
113    for<'a> From<&'a JSONProperties> + From<JSONProperties> + Into<JSONProperties> + Clone + Default
114{
115}
116impl From<&JSONProperties> for JSONProperties {
117    fn from(json: &JSONProperties) -> JSONProperties {
118        json.clone()
119    }
120}
121impl JSONPropertiesCompatible for JSONProperties {}
122
123pub type MapboxProperties = ValuePrimitive;