use super::pptr::PPtr; use crate::object::{Value, parser::FromValue}; use anyhow::Result; use serde::Serialize; #[derive(Debug, Serialize)] pub struct Shader { pub dependencies: Vec>, pub name: String, pub parsed: SerializedShader, } #[derive(Debug, Serialize)] pub struct SerializedShader { pub name: String, } impl FromValue for Shader { fn from_value(v: Value) -> Result { let mut fields = v.as_class("Shader")?; Ok(Self { name: fields.field("m_Name")?, parsed: fields.field("m_ParsedForm")?, dependencies: fields .remove("m_Dependencies") .unwrap() .as_vector() .unwrap() .into_iter() .map(|e| e.parse().unwrap()) .collect(), }) } } impl FromValue for SerializedShader { fn from_value(v: Value) -> Result { let mut fields = v.as_class("SerializedShader")?; Ok(Self { name: fields.field("m_Name")?, }) } }