use crate::deserialize::util::unwrap_single_member_hash; use crate::spec::leaf_struct_spec::{LeafStructBuildSpec, LeafStructMember, LeafStructMemberKind}; use yaml_rust2::Yaml; fn deserialize_member(member_name: &str, member_props: &Yaml) -> LeafStructMember { let kind = match member_props["kind"].as_str().unwrap() { "string" => LeafStructMemberKind::String, "file_id" => LeafStructMemberKind::FileId, "range" => LeafStructMemberKind::Range, _ => panic!(), }; LeafStructMember::new(member_name, kind) } pub fn deserialize_leaf_struct(name: &str, props: &Yaml) -> LeafStructBuildSpec { let members = props["members"] .as_vec() .unwrap() .iter() .map(|member_hash| { let (member_name, props) = unwrap_single_member_hash(member_hash); deserialize_member(&member_name, props) }) .map(Box::new) .collect(); let derive = props["derive"] .as_vec() .map(|derive_yaml| { derive_yaml .iter() .map(|trait_yaml| trait_yaml.as_str().unwrap().to_string()) .collect::>() }) .unwrap_or_default(); LeafStructBuildSpec::new(name, members, derive) }