diff options
author | metamuffin <metamuffin@disroot.org> | 2025-03-12 22:39:58 +0100 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-03-12 22:39:58 +0100 |
commit | 5555c8bbefb4f52f5002603eb91b6c95cbdd97e4 (patch) | |
tree | 208e88359deb3cf5f7e2a4135693f12d76ad97e1 /src/object/helper.rs | |
parent | 4906844cbfd2717a29b434fb7d8f90c5117fddd5 (diff) | |
download | unity-tools-5555c8bbefb4f52f5002603eb91b6c95cbdd97e4.tar unity-tools-5555c8bbefb4f52f5002603eb91b6c95cbdd97e4.tar.bz2 unity-tools-5555c8bbefb4f52f5002603eb91b6c95cbdd97e4.tar.zst |
more parsing helpers
Diffstat (limited to 'src/object/helper.rs')
-rw-r--r-- | src/object/helper.rs | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/src/object/helper.rs b/src/object/helper.rs new file mode 100644 index 0000000..3f41703 --- /dev/null +++ b/src/object/helper.rs @@ -0,0 +1,125 @@ +use super::Value; + +impl Value { + pub fn class_name(&self) -> Option<&String> { + if let Value::Object { class, .. } = self { + Some(class) + } else { + None + } + } + pub fn as_string(self) -> Option<String> { + if let Value::String(s) = self { + Some(s) + } else { + None + } + } + pub fn as_i64(&self) -> Option<i64> { + if let Value::I64(s) = self { + Some(*s) + } else { + None + } + } + pub fn as_i32(&self) -> Option<i32> { + if let Value::I32(s) = self { + Some(*s) + } else { + None + } + } + pub fn as_u32(&self) -> Option<u32> { + if let Value::U32(s) = self { + Some(*s) + } else { + None + } + } + pub fn as_u8(&self) -> Option<u8> { + if let Value::U8(s) = self { + Some(*s) + } else { + None + } + } + pub fn as_u64(&self) -> Option<u64> { + match self { + Self::U64(x) => Some(*x), + Self::U32(x) => Some(*x as u64), + _ => None, + } + } + pub fn as_f32(&self) -> Option<f32> { + if let Value::F32(s) = self { + Some(*s) + } else { + None + } + } + pub fn as_u16(&self) -> Option<u16> { + if let Value::U16(s) = self { + Some(*s) + } else { + None + } + } + pub fn as_bool(&self) -> Option<bool> { + if let Value::Bool(s) = self { + Some(*s) + } else { + None + } + } + pub fn as_array(self) -> Option<Vec<Value>> { + if let Value::Array(s) = self { + Some(s) + } else { + None + } + } + pub fn as_typeless(self) -> Option<Vec<u8>> { + if let Value::Typeless(s) = self { + Some(s) + } else { + None + } + } + 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::I8(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::U64(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::Typeless(values) => serde_json::Value::Array( + values + .into_iter() + .map(|e| serde_json::Value::Number(e.into())) + .collect(), + ), + 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(), + ), + } + } +} |