Construct DirectoryIterator
This commit is contained in:
parent
6c5650c050
commit
cb090acfe7
|
@ -1,11 +1,18 @@
|
||||||
use psxcdgen_ex::types::{CDDesc, Data};
|
use psxcdgen_ex::types::{CDDesc, Data};
|
||||||
use tool_helper::Error;
|
use tool_helper::Error;
|
||||||
|
|
||||||
fn run_main() -> Result<(), Error> {
|
fn populate() -> Result<CDDesc, Error> {
|
||||||
let mut desc = CDDesc::new();
|
let mut desc = CDDesc::new();
|
||||||
let file = Data::new("Planschi")?;
|
let file = Data::new("Planschi")?;
|
||||||
|
|
||||||
desc.root.add_data(file);
|
desc.root.add_data(file);
|
||||||
|
Ok(desc)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_main() -> Result<(), Error> {
|
||||||
|
let desc = populate()?;
|
||||||
|
|
||||||
|
desc.root.iter();
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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),
|
||||||
|
}
|
|
@ -1,6 +1,8 @@
|
||||||
|
use iterator::DirectoryIterator;
|
||||||
use cdtypes::types::cdstring::DString;
|
use cdtypes::types::cdstring::DString;
|
||||||
use tool_helper::Error;
|
use tool_helper::Error;
|
||||||
|
|
||||||
|
pub mod iterator;
|
||||||
pub struct CDDesc {
|
pub struct CDDesc {
|
||||||
pub root: Directory
|
pub root: Directory
|
||||||
}
|
}
|
||||||
|
@ -33,6 +35,10 @@ impl Directory {
|
||||||
pub fn add_data(&mut self, data: Data) {
|
pub fn add_data(&mut self, data: Data) {
|
||||||
self.data.push(data);
|
self.data.push(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn iter(&self) -> DirectoryIterator {
|
||||||
|
DirectoryIterator::new(&self)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Data {
|
pub struct Data {
|
||||||
|
|
Loading…
Reference in New Issue