use super::*;
#[derive(Default)]
pub(super) struct LibraryMaterials<'a> {
pub(super) materials: HashMap<&'a str, Material<'a>>,
}
pub(super) struct Material<'a> {
pub(super) id: &'a str,
pub(super) name: Option<&'a str>,
pub(super) instance_effect: InstanceEffect<'a>,
}
pub(super) struct InstanceEffect<'a> {
pub(super) url: Uri<'a, Effect<'a>>,
}
pub(super) fn parse_library_materials<'a>(
cx: &mut Context<'a>,
node: xml::Node<'a, '_>,
) -> io::Result<()> {
debug_assert_eq!(node.tag_name().name(), "library_materials");
for node in node.element_children() {
match node.tag_name().name() {
"material" => {
let material = parse_material(node)?;
cx.library_materials.materials.insert(material.id, material);
}
"asset" | "extra" => { }
_ => return Err(error::unexpected_child_elem(node)),
}
}
Ok(())
}
fn parse_material<'a>(node: xml::Node<'a, '_>) -> io::Result<Material<'a>> {
debug_assert_eq!(node.tag_name().name(), "material");
let id = node.required_attribute("id")?;
let mut instance_effect = None;
for node in node.element_children() {
match node.tag_name().name() {
"instance_effect" => {
instance_effect = Some(parse_instance_effect(node)?);
}
"asset" | "extra" => { }
_ => return Err(error::unexpected_child_elem(node)),
}
}
let instance_effect = match instance_effect {
Some(instance_effect) => instance_effect,
None => return Err(error::one_or_more_elems(node, "instance_effect")),
};
Ok(Material {
id,
name: node.attribute("name"),
instance_effect,
})
}
fn parse_instance_effect<'a>(node: xml::Node<'a, '_>) -> io::Result<InstanceEffect<'a>> {
debug_assert_eq!(node.tag_name().name(), "instance_effect");
let url = node.parse_url("url")?;
Ok(InstanceEffect {
url,
})
}