Construct DirectoryIterator

This commit is contained in:
Björn Gaier 2022-10-07 15:04:07 +02:00
parent 595e6901bb
commit c0e67feca7
3 changed files with 75 additions and 1 deletions

View File

@ -1,11 +1,18 @@
use psxcdgen_ex::types::{CDDesc, Data};
use tool_helper::Error;
fn run_main() -> Result<(), Error> {
fn populate() -> Result<CDDesc, Error> {
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(())
}

View File

@ -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<DirectoryIteratorElement<'a>> {
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),
}

View File

@ -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 {