use crate::records::ast_json_encoder::AstJsonEncoder;
use alloc::format;
use alloc::string::String;
use luaur_ast::records::ast_name::AstName;
pub trait WriteJson {
fn write_json(&self, enc: &mut AstJsonEncoder);
}
impl AstJsonEncoder {
pub fn write<T: WriteJson + ?Sized>(&mut self, prop_name: &str, value: &T) {
if self.comma {
self.write_raw_string_view(",");
}
self.comma = true;
self.write_raw_string_view("\"");
self.write_raw_string_view(prop_name);
self.write_raw_string_view("\":");
value.write_json(self);
}
}
impl WriteJson for bool {
fn write_json(&self, enc: &mut AstJsonEncoder) {
enc.write_raw_string_view(if *self { "true" } else { "false" });
}
}
impl WriteJson for f64 {
fn write_json(&self, enc: &mut AstJsonEncoder) {
enc.write_f64(*self);
}
}
macro_rules! write_json_int {
($($t:ty),*) => {$(
impl WriteJson for $t {
fn write_json(&self, enc: &mut AstJsonEncoder) {
let s = format!("{}", self);
enc.write_raw_string_view(&s);
}
}
)*};
}
write_json_int!(i32, i64, u32, u64, usize, isize, u16, i16);
impl WriteJson for str {
fn write_json(&self, enc: &mut AstJsonEncoder) {
enc.write_string(self);
}
}
impl WriteJson for String {
fn write_json(&self, enc: &mut AstJsonEncoder) {
enc.write_string(self);
}
}
impl WriteJson for AstName {
fn write_json(&self, enc: &mut AstJsonEncoder) {
if self.value.is_null() {
enc.write_string("");
} else {
let s = unsafe { core::ffi::CStr::from_ptr(self.value) };
enc.write_string(&s.to_string_lossy());
}
}
}
impl<T: WriteJson> WriteJson for Option<T> {
fn write_json(&self, enc: &mut AstJsonEncoder) {
match self {
Some(v) => v.write_json(enc),
None => enc.write_raw_string_view("null"),
}
}
}