use ggez::filesystem::File; use std::io::BufReader; use xml::reader::{EventReader, XmlEvent}; pub struct Layer { pub id: usize, pub data: Vec, } impl Layer { pub fn new(text: String, id: usize) -> Layer { Layer { id, data: text .replace("\n", "") .split(',') .map(|s| s.parse().unwrap()) .collect(), } } } pub struct Map { pub width: usize, pub height: usize, pub layers: Vec, } impl Map { pub fn new(file: File) -> Map { let mut width = None; let mut height = None; let mut layers = Vec::new(); for e in EventReader::new(BufReader::new(file)) { if let Ok(XmlEvent::StartElement { name, attributes, .. }) = e { if name.local_name == "map" { for attribute in attributes { match attribute.name.local_name.as_str() { "width" => width = Some(attribute.value.parse::().unwrap()), "height" => height = Some(attribute.value.parse::().unwrap()), _ => (), } } } } else if let Ok(XmlEvent::Characters(text)) = e { layers.push(Layer::new(text, layers.len() + 1)); } } Map { layers, width: width.unwrap(), height: height.unwrap(), } } }