main.rs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. use eliza_error::Error;
  2. use std::path::Path;
  3. use xml::writer::events::XmlEvent;
  4. struct DirWriter<W: std::io::Write> {
  5. writer: xml::writer::EventWriter<W>,
  6. }
  7. impl<W: std::io::Write> DirWriter<W> {
  8. fn walk_root(&mut self) -> Result<(), Error> {
  9. self.writer
  10. .write(XmlEvent::start_element("dir").attr("name", "."))?;
  11. self.walk(&Path::new("."))?;
  12. self.writer.write(XmlEvent::end_element())?;
  13. Ok(())
  14. }
  15. fn walk(&mut self, path: &Path) -> Result<(), Error> {
  16. for entry in std::fs::read_dir(path)? {
  17. let entry = entry?;
  18. let path = entry.path();
  19. let name = path.file_name().unwrap().to_str().unwrap();
  20. if path.is_dir() {
  21. self.writer
  22. .write(XmlEvent::start_element("dir").attr("name", name))?;
  23. self.walk(&path)?;
  24. self.writer.write(XmlEvent::end_element())?;
  25. } else {
  26. self.writer
  27. .write(XmlEvent::start_element("file").attr("name", name))?;
  28. let contents = std::fs::read_to_string(path)?;
  29. self.writer.write(XmlEvent::characters(&contents))?;
  30. self.writer.write(XmlEvent::end_element())?;
  31. }
  32. }
  33. Ok(())
  34. }
  35. }
  36. fn main() -> () {
  37. let mut writer = DirWriter {
  38. writer: xml::writer::EventWriter::new(std::io::stdout()),
  39. };
  40. if let Err(err) = writer.walk_root() {
  41. eprintln!("shit's fucked: {:?}", err);
  42. }
  43. }