/* 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, Tag, TypedTag, types::*}; use std::{any::type_name, fmt::Debug}; pub struct Inspector<'a, T>(pub &'a Registry, pub T); impl Debug for Inspector<'_, Object<'_>> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let mut s = f.debug_struct("Object"); let mut nonexhaustive = false; for (i, k) in self.1.keys().enumerate() { let Some(info) = self.0.info(k) else { nonexhaustive = true; continue; }; let Some(ty) = info.r#type else { nonexhaustive = true; continue; }; match ty { x if x == STR => s.field(info.name, &self.1.get_typed::<&str>(i).unwrap()), x if x == OBJECT => s.field(info.name, &self.1.get_typed::(i).unwrap()), x if x == U32 => s.field(info.name, &self.1.get_typed::(i).unwrap()), x if x == U64 => s.field(info.name, &self.1.get_typed::(i).unwrap()), _ => &mut s, }; } if nonexhaustive { s.finish_non_exhaustive() } else { s.finish() } } } impl Debug for Inspector<'_, TypedTag> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let name = self.0.info(self.1.0).map(|t| t.name).unwrap_or("unknown"); f.debug_tuple(&format!("TypedTag<{}>", type_name::())) .field(&name) .finish() } } impl Debug for Inspector<'_, Tag> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let name = self.0.info(self.1).map(|t| t.name).unwrap_or("unknown"); f.debug_tuple("Tag").field(&name).finish() } }