diff options
Diffstat (limited to 'src/object.rs')
-rw-r--r-- | src/object.rs | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/src/object.rs b/src/object.rs index 5275eb7..ab27ea4 100644 --- a/src/object.rs +++ b/src/object.rs @@ -1,7 +1,7 @@ use crate::helper::{AlignExt, Endianness, ReadExt}; use crate::serialized_file::TypeTreeNode; use anyhow::Result; -use log::{debug, trace}; +use log::trace; use std::io::Seek; use std::{collections::BTreeMap, io::Read}; @@ -92,3 +92,35 @@ pub fn read_value( } r } + +impl Value { + pub fn to_json(self) -> serde_json::Value { + match self { + Value::Bool(x) => serde_json::Value::Bool(x), + Value::U8(x) => serde_json::Value::Number(x.into()), + Value::U16(x) => serde_json::Value::Number(x.into()), + Value::I16(x) => serde_json::Value::Number(x.into()), + Value::U32(x) => serde_json::Value::Number(x.into()), + Value::I32(x) => serde_json::Value::Number(x.into()), + Value::F32(x) => serde_json::Value::Number( + serde_json::Number::from_f64(x as f64).unwrap_or(0.into()), + ), + Value::I64(x) => serde_json::Value::Number(x.into()), + Value::F64(x) => serde_json::Value::Number(serde_json::Number::from_f64(x).unwrap()), + Value::String(x) => serde_json::Value::String(x), + Value::Array(values) => { + serde_json::Value::Array(values.into_iter().map(Value::to_json).collect()) + } + Value::Object { class, fields } => serde_json::Value::Object( + fields + .into_iter() + .map(|(k, v)| (k, v.to_json())) + .chain(Some(( + "_class".to_string(), + serde_json::Value::String(class), + ))) + .collect(), + ), + } + } +} |