use indexmap::IndexMap;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize)]
#[serde(rename_all = "snake_case", tag = "type")]
pub enum Value {
Int {
value: i32,
},
Float {
value: f32,
},
Bool {
value: bool,
},
String {
value: String,
},
Object(Object),
Array {
items: Vec<Value>,
},
Map {
entries: Vec<(Value, Value)>,
},
Struct {
elements: Vec<Value>,
},
#[serde(rename = "hstring")]
HString {
value: String,
},
Null,
ObjectLink {
id: i32,
},
}
#[derive(Serialize, Deserialize)]
pub struct Object {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<i32>,
pub classname: String,
pub properties: ObjectProperties,
}
#[derive(Serialize, Deserialize)]
#[serde(untagged)]
pub enum ObjectProperties {
Map(IndexMap<String, Value>),
List(Vec<(String, Value)>),
}