38 lines
1.2 KiB
Rust
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)
|
|
}
|