deimos-lang/ast-generator/src/deserialize/leaf_struct_spec.rs
2026-03-04 22:15:39 -06:00

38 lines
1.2 KiB
Rust

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::<Vec<_>>()
})
.unwrap_or_default();
LeafStructBuildSpec::new(name, members, derive)
}