|
@@ -0,0 +1,47 @@
|
|
|
+use eliza_error::Error;
|
|
|
+use std::path::Path;
|
|
|
+use xml::writer::events::XmlEvent;
|
|
|
+
|
|
|
+struct DirWriter<W: std::io::Write> {
|
|
|
+ writer: xml::writer::EventWriter<W>,
|
|
|
+}
|
|
|
+
|
|
|
+impl<W: std::io::Write> DirWriter<W> {
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+}
|