/* This file is part of jellything (https://codeberg.org/metamuffin/jellything) which is licensed under the GNU Affero General Public License (version 3); see /COPYING. Copyright (C) 2026 metamuffin */ use crate::{Object, Registry, types::*}; use serde_json::{Map, Value}; pub fn object_to_json(reg: &Registry, ob: Object<'_>) -> Value { let mut o = Map::new(); let mut nonexhaustive = false; for (i, tag) in ob.keys().enumerate() { let Some(info) = reg.info(tag) else { nonexhaustive = true; continue; }; let Some(ty) = info.r#type else { nonexhaustive = true; continue; }; let key = info.name.to_string(); match ty { x if x == STR => { let val = ob.get_typed::<&str>(i).unwrap().to_string().into(); multi_insert(&mut o, key, val); } x if x == OBJECT => { let val = object_to_json(reg, ob.get_typed::(i).unwrap()); multi_insert(&mut o, key, val); } x if x == U32 => { let val = ob.get_typed::(i).unwrap().into(); multi_insert(&mut o, key, val); } x if x == U64 => { let val = ob.get_typed::(i).unwrap().into(); multi_insert(&mut o, key, val); } x if x == F64 => { let val = ob.get_typed::(i).unwrap().into(); multi_insert(&mut o, key, val); } _ => { nonexhaustive = true; } }; } if nonexhaustive { o.insert("_nonexhaustive".to_owned(), Value::Bool(true)); } Value::Object(o) } fn multi_insert(m: &mut Map, key: String, val: Value) { if let Some(cur) = m.get_mut(&key) { if let Some(cur) = cur.as_array_mut() { cur.push(val); } else { *cur = Value::Array(vec![cur.clone(), val]) } } else { m.insert(key, val); } }