diff options
Diffstat (limited to 'src/assets.rs')
-rw-r--r-- | src/assets.rs | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/assets.rs b/src/assets.rs new file mode 100644 index 0000000..a272920 --- /dev/null +++ b/src/assets.rs @@ -0,0 +1,35 @@ +use crate::object::Value; +use anyhow::Result; +use std::collections::BTreeMap; + +pub enum AssetValue { + Value(Value), + Array(Vec<AssetValue>), + Object { + class: String, + fields: BTreeMap<String, AssetValue>, + }, +} + +impl AssetValue { + pub fn from_value(value: Value) -> Result<Self> { + Ok(match value { + Value::Array(elems) => Self::Array( + elems + .into_iter() + .map(|e| AssetValue::from_value(e)) + .collect::<Result<Vec<_>>>()?, + ), + Value::Object { class, fields } => match class.as_str() { + _ => Self::Object { + class, + fields: fields + .into_iter() + .map(|(k, v)| Ok((k, AssetValue::from_value(v)?))) + .collect::<Result<BTreeMap<_, _>>>()?, + }, + }, + x => Self::Value(x), + }) + } +} |