From ba9d8fcf21225a36725ae315dd592bfb5fb1f8c2 Mon Sep 17 00:00:00 2001 From: jaby Date: Fri, 7 Oct 2022 15:04:07 +0200 Subject: [PATCH] Construct DirectoryIterator --- src/Tools/psxcdgen_ex/src/main.rs | 9 ++- src/Tools/psxcdgen_ex/src/types/iterator.rs | 61 +++++++++++++++++++++ src/Tools/psxcdgen_ex/src/types/mod.rs | 6 ++ 3 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 src/Tools/psxcdgen_ex/src/types/iterator.rs diff --git a/src/Tools/psxcdgen_ex/src/main.rs b/src/Tools/psxcdgen_ex/src/main.rs index dc54ae35..1290d203 100644 --- a/src/Tools/psxcdgen_ex/src/main.rs +++ b/src/Tools/psxcdgen_ex/src/main.rs @@ -1,11 +1,18 @@ use psxcdgen_ex::types::{CDDesc, Data}; use tool_helper::Error; -fn run_main() -> Result<(), Error> { +fn populate() -> Result { let mut desc = CDDesc::new(); let file = Data::new("Planschi")?; desc.root.add_data(file); + Ok(desc) +} + +fn run_main() -> Result<(), Error> { + let desc = populate()?; + + desc.root.iter(); Ok(()) } diff --git a/src/Tools/psxcdgen_ex/src/types/iterator.rs b/src/Tools/psxcdgen_ex/src/types/iterator.rs new file mode 100644 index 00000000..987507af --- /dev/null +++ b/src/Tools/psxcdgen_ex/src/types/iterator.rs @@ -0,0 +1,61 @@ +use super::*; + +pub struct DirectoryIterator<'a> { + parent: &'a Directory, + state: DirectoryIteratorState<'a> +} + +impl<'a> DirectoryIterator<'a> { + pub fn new(parent: &Directory) -> DirectoryIterator { + DirectoryIterator{parent, state: DirectoryIteratorState::Root} + } +} + +impl<'a> std::iter::Iterator for DirectoryIterator<'a> { + type Item = DirectoryIteratorElement<'a>; + + fn next(&mut self) -> Option> { + match std::mem::replace(&mut self.state, DirectoryIteratorState::Done) { + DirectoryIteratorState::Root => { + self.state = DirectoryIteratorState::Data(self.parent.data.iter()); + return Some(DirectoryIteratorElement::Directory(&self.parent)); + } + DirectoryIteratorState::Data(mut iter) => { + if let Some(data) = iter.next() { + self.state = DirectoryIteratorState::Data(iter); + return Some(DirectoryIteratorElement::Data(data)); + } + + else { + self.state = DirectoryIteratorState::Directory(self.parent.dirs.iter()); + return self.next(); + } + }, + DirectoryIteratorState::Directory(mut iter) => { + if let Some(dir) = iter.next() { + self.state = DirectoryIteratorState::Directory(iter); + return Some(DirectoryIteratorElement::Directory(dir)); + } + + else { + return self.next(); + } + }, + DirectoryIteratorState::Done => { + return None; + } + } + } +} + +enum DirectoryIteratorState<'a> { + Root, + Data(std::slice::Iter<'a, Data>), + Directory(std::slice::Iter<'a, Directory>), + Done +} + +pub enum DirectoryIteratorElement<'a> { + Directory(&'a Directory), + Data(&'a Data), +} \ No newline at end of file diff --git a/src/Tools/psxcdgen_ex/src/types/mod.rs b/src/Tools/psxcdgen_ex/src/types/mod.rs index 0fde591a..3ca87ce9 100644 --- a/src/Tools/psxcdgen_ex/src/types/mod.rs +++ b/src/Tools/psxcdgen_ex/src/types/mod.rs @@ -1,6 +1,8 @@ +use iterator::DirectoryIterator; use cdtypes::types::cdstring::DString; use tool_helper::Error; +pub mod iterator; pub struct CDDesc { pub root: Directory } @@ -33,6 +35,10 @@ impl Directory { pub fn add_data(&mut self, data: Data) { self.data.push(data); } + + pub fn iter(&self) -> DirectoryIterator { + DirectoryIterator::new(&self) + } } pub struct Data {