aboutsummaryrefslogtreecommitdiff
path: root/src/assets.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/assets.rs')
-rw-r--r--src/assets.rs35
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),
+ })
+ }
+}