use crate::types::{SourceString, ToSource};
use super::primitive::{Placeholder, Template};
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum JsonValue {
Placeholder(Placeholder),
Number(String),
String(Template),
Boolean(bool),
List {
space0: String,
elements: Vec<JsonListElement>,
},
Object {
space0: String,
elements: Vec<JsonObjectElement>,
},
Null,
}
impl ToSource for JsonValue {
fn to_source(&self) -> SourceString {
match self {
JsonValue::Placeholder(expr) => format!("{{{{{expr}}}}}").to_source(),
JsonValue::Number(s) => s.to_source(),
JsonValue::String(template) => template.to_source(),
JsonValue::Boolean(value) => {
if *value {
"true".to_source()
} else {
"false".to_source()
}
}
JsonValue::List { space0, elements } => {
let elements = elements
.iter()
.map(|e| e.to_source())
.collect::<Vec<SourceString>>();
format!("[{}{}]", space0, elements.join(",")).to_source()
}
JsonValue::Object { space0, elements } => {
let elements = elements
.iter()
.map(|e| e.to_source())
.collect::<Vec<SourceString>>();
format!("{{{}{}}}", space0, elements.join(",")).to_source()
}
JsonValue::Null => "null".to_source(),
}
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct JsonListElement {
pub space0: String,
pub value: JsonValue,
pub space1: String,
}
impl ToSource for JsonListElement {
fn to_source(&self) -> SourceString {
let mut s = SourceString::new();
s.push_str(self.space0.as_str());
s.push_str(self.value.to_source().as_str());
s.push_str(self.space1.as_str());
s
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct JsonObjectElement {
pub space0: String,
pub name: Template,
pub space1: String,
pub space2: String,
pub value: JsonValue,
pub space3: String,
}
impl ToSource for JsonObjectElement {
fn to_source(&self) -> SourceString {
let mut s = SourceString::new();
s.push_str(self.space0.as_str());
s.push_str(self.name.to_source().as_str());
s.push_str(self.space1.as_str());
s.push(':');
s.push_str(self.space2.as_str());
s.push_str(self.value.to_source().as_str());
s.push_str(self.space3.as_str());
s
}
}