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;