use eliza_error::Error; use std::path::Path; use xml::writer::events::XmlEvent; struct DirWriter { writer: xml::writer::EventWriter, } impl DirWriter { fn walk_root(&mut self) -> Result<(), Error> { self.writer .write(XmlEvent::start_element("dir").attr("name", "."))?; self.walk(&Path::new("."))?; self.writer.write(XmlEvent::end_element())?; Ok(()) } fn walk(&mut self, path: &Path) -> Result<(), Error> { for entry in std::fs::read_dir(path)? { let entry = entry?; let path = entry.path(); let name = path.file_name().unwrap().to_str().unwrap(); if path.is_dir() { self.writer .write(XmlEvent::start_element("dir").attr("name", name))?; self.walk(&path)?; self.writer.write(XmlEvent::end_element())?; } else { self.writer .write(XmlEvent::start_element("file").attr("name", name))?; let contents = std::fs::read_to_string(path)?; self.writer.write(XmlEvent::characters(&contents))?; self.writer.write(XmlEvent::end_element())?; } } Ok(()) } } fn main() -> () { let mut writer = DirWriter { writer: xml::writer::EventWriter::new(std::io::stdout()), }; if let Err(err) = writer.walk_root() { eprintln!("shit's fucked: {:?}", err); } }