extern crate alloc;
use crate::functions::write_dcr_logger::write_json_emitter_t;
use crate::functions::write_json_emitter_alt_ae::write_json_emitter_string_view;
use crate::functions::write_json_emitter_alt_w::write_json_emitter_bool;
use crate::functions::write_json_emitter_alt_x::write_json_emitter_f64;
use crate::records::json_emitter::JsonEmitter;
use crate::records::object_emitter::ObjectEmitter;
use alloc::string::String;
use alloc::string::ToString;
pub trait WriteJson {
fn write_json(&self, emitter: &mut JsonEmitter);
}
impl<T: WriteJson + ?Sized> WriteJson for &T {
fn write_json(&self, emitter: &mut JsonEmitter) {
(**self).write_json(emitter);
}
}
impl WriteJson for bool {
fn write_json(&self, emitter: &mut JsonEmitter) {
write_json_emitter_bool(emitter, *self);
}
}
impl WriteJson for f64 {
fn write_json(&self, emitter: &mut JsonEmitter) {
write_json_emitter_f64(emitter, *self);
}
}
macro_rules! write_json_int {
($($t:ty),*) => {$(
impl WriteJson for $t {
fn write_json(&self, emitter: &mut JsonEmitter) {
emitter.write_raw_string_view(&self.to_string());
}
}
)*};
}
write_json_int!(i32, u32, i64, u64, usize, isize, i16, u16);
impl WriteJson for str {
fn write_json(&self, emitter: &mut JsonEmitter) {
write_json_emitter_string_view(emitter, self);
}
}
impl WriteJson for String {
fn write_json(&self, emitter: &mut JsonEmitter) {
write_json_emitter_string_view(emitter, self.as_str());
}
}
impl<T> WriteJson for *const T {
fn write_json(&self, emitter: &mut JsonEmitter) {
write_json_emitter_t(emitter, *self);
}
}
impl ObjectEmitter {
pub fn write_pair<T: WriteJson>(&mut self, name: &str, value: T) {
if self.finished {
return;
}
let emitter = unsafe { &mut *self.emitter };
emitter.write_comma();
write_json_emitter_string_view(emitter, name);
emitter.write_raw_c_char(b':' as core::ffi::c_char);
value.write_json(emitter);
}
}
macro_rules! write_json_via {
($ty:path => $func:path) => {
impl WriteJson for $ty {
fn write_json(&self, emitter: &mut JsonEmitter) {
$func(emitter, self);
}
}
};
}
write_json_via!(luaur_ast::records::location::Location
=> crate::functions::write_dcr_logger_alt_f::write_json_emitter_location);
write_json_via!(crate::records::error_snapshot::ErrorSnapshot
=> crate::functions::write_dcr_logger_alt_g::write_json_emitter_error_snapshot);
write_json_via!(crate::records::binding_snapshot::BindingSnapshot
=> crate::functions::write_dcr_logger_alt_h::write_json_emitter_binding_snapshot);
write_json_via!(crate::records::type_binding_snapshot::TypeBindingSnapshot
=> crate::functions::write_dcr_logger_alt_i::write_json_emitter_type_binding_snapshot);
write_json_via!(crate::records::expr_types_at_location::ExprTypesAtLocation
=> crate::functions::write_dcr_logger_alt_k::write_json_emitter_expr_types_at_location);
write_json_via!(crate::records::annotation_types_at_location::AnnotationTypesAtLocation
=> crate::functions::write_dcr_logger_alt_l::write_json_emitter_annotation_types_at_location);
write_json_via!(crate::records::constraint_generation_log::ConstraintGenerationLog
=> crate::functions::write_dcr_logger_alt_m::write_json_emitter_constraint_generation_log);
write_json_via!(crate::records::scope_snapshot::ScopeSnapshot
=> crate::functions::write_dcr_logger_alt_n::write_json_emitter_scope_snapshot);
write_json_via!(crate::records::constraint_block::ConstraintBlock
=> crate::functions::write_dcr_logger_alt_o::write_json_emitter_constraint_block);
write_json_via!(crate::records::constraint_snapshot::ConstraintSnapshot
=> crate::functions::write_dcr_logger_alt_p::write_json_emitter_constraint_snapshot);
write_json_via!(crate::records::boundary_snapshot::BoundarySnapshot
=> crate::functions::write_dcr_logger_alt_q::write_json_emitter_boundary_snapshot);
write_json_via!(crate::type_aliases::step_snapshot::StepSnapshot
=> crate::functions::write_dcr_logger_alt_t::write_json_emitter_step_snapshot);
write_json_via!(crate::records::type_solve_log::TypeSolveLog
=> crate::functions::write_dcr_logger_alt_u::write_json_emitter_type_solve_log);
write_json_via!(crate::records::type_check_log::TypeCheckLog
=> crate::functions::write_dcr_logger_alt_v::write_json_emitter_type_check_log);