Skip to main content

threemf/
read.rs

1use serde::Deserialize;
2use std::io::{self, BufReader, Read};
3
4use quick_xml::de::Deserializer;
5use zip::ZipArchive;
6
7use crate::model::Model;
8use crate::Error;
9
10/// Read all models from a 3MF reader
11pub fn read<R: Read + io::Seek>(reader: R) -> Result<Vec<Model>, Error> {
12    let mut zip = ZipArchive::new(reader)?;
13    let mut models = Vec::new();
14
15    for i in 0..zip.len() {
16        let file = zip.by_index(i)?;
17        if file.name().ends_with(".model") {
18            let mut de = Deserializer::from_reader(BufReader::new(file));
19            models.push(Model::deserialize(&mut de)?);
20        }
21    }
22
23    Ok(models)
24}