use crate::Map;
use alloc::{string::String, vec::Vec};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone, 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(JSONProperties),
}
pub type JSONProperties = Map<String, JSONValue>;
pub trait JSONPropertiesCompatible:
for<'a> From<&'a JSONProperties> + From<JSONProperties> + Into<JSONProperties> + Clone + Default
{
}
impl From<&JSONProperties> for JSONProperties {
fn from(json: &JSONProperties) -> JSONProperties {
json.clone()
}
}
impl JSONPropertiesCompatible for JSONProperties {}
pub type MapboxProperties = ValuePrimitive;