/* 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 { eprintln!("{ob:#?}"); 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 => { o.insert(key, ob.get_typed::<&str>(i).unwrap().to_string().into()); } x if x == OBJECT => { eprintln!("{key}"); o.insert(key, object_to_json(reg, ob.get_typed::(i).unwrap())); } x if x == U32 => { o.insert(key, ob.get_typed::(i).unwrap().to_string().into()); } x if x == U64 => { o.insert(key, ob.get_typed::(i).unwrap().to_string().into()); } x if x == F64 => { o.insert(key, ob.get_typed::(i).unwrap().to_string().into()); } _ => { nonexhaustive = true; } }; } if nonexhaustive { o.insert("_nonexhaustive".to_owned(), Value::Bool(true)); } Value::Object(o) }