lib3mf_core/parser/
build_parser.rs1use crate::error::{Lib3mfError, Result};
2use crate::model::{Build, BuildItem};
3use crate::parser::component_parser::parse_transform;
4use crate::parser::xml_parser::{XmlParser, get_attribute, get_attribute_u32};
5
6use glam::Mat4;
7use quick_xml::events::Event;
8use std::borrow::Cow;
9use std::io::BufRead;
10
11pub fn parse_build<R: BufRead>(parser: &mut XmlParser<R>) -> Result<Build> {
12 let mut build = Build::default();
13
14 loop {
15 match parser.read_next_event()? {
16 Event::Start(e) | Event::Empty(e) if e.name().as_ref() == b"item" => {
17 let object_id = crate::model::ResourceId(get_attribute_u32(&e, b"objectid")?);
18 let transform = if let Some(s) = get_attribute(&e, b"transform") {
19 parse_transform(&s)?
20 } else {
21 Mat4::IDENTITY
22 };
23
24 let part_number =
25 get_attribute(&e, b"partnumber").map(|s: Cow<str>| s.into_owned());
26 let uuid = crate::parser::xml_parser::get_attribute_uuid(&e)?;
27 let path = get_attribute(&e, b"path")
29 .or_else(|| get_attribute(&e, b"p:path"))
30 .map(|s: Cow<str>| s.into_owned());
31
32 let printable = get_attribute(&e, b"printable").and_then(|s| match s.as_ref() {
33 "1" => Some(true),
34 "0" => Some(false),
35 _ => None,
36 });
37
38 build.items.push(BuildItem {
39 object_id,
40 part_number,
41 uuid,
42 path,
43 transform,
44 printable,
45 });
46 }
47 Event::End(e) if e.name().as_ref() == b"build" => break,
48 Event::Eof => {
49 return Err(Lib3mfError::Validation(
50 "Unexpected EOF in build".to_string(),
51 ));
52 }
53 _ => {}
54 }
55 }
56
57 Ok(build)
58}