1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
use crate::{matroska::MatroskaTag, Master};
use anyhow::Result;
pub struct Unflat<'a> {
pub item: MatroskaTag,
pub children: Option<Unflatten<'a>>,
}
pub struct Unflatten<'a> {
inner: &'a mut dyn Iterator<Item = Result<MatroskaTag>>,
stop: bool,
end: Option<MatroskaTag>,
}
impl<'a> Unflatten<'a> {
pub fn new(inner: &'a mut dyn Iterator<Item = Result<MatroskaTag>>) -> Self {
Self {
inner,
stop: false,
end: None,
}
}
pub fn next(&mut self) -> Option<Result<Unflat>> {
if self.stop {
return None;
}
match self.inner.next() {
None => None,
Some(Err(e)) => Some(Err(e)),
Some(Ok(item)) => {
let master = MatroskaTag::is_master(item.id()).unwrap();
if Some(&item) == self.end.as_ref() {
self.stop = true;
None
} else {
Some(Ok(Unflat {
children: if master {
let end =
MatroskaTag::construct_master(item.id(), Master::End).unwrap();
if end == item {
return None;
}
Some(Unflatten {
inner: self.inner,
stop: false,
end: Some(end),
})
} else {
None
},
item,
}))
}
}
}
}
}
impl Drop for Unflatten<'_> {
fn drop(&mut self) {
while let Some(_) = self.next() {}
}
}
|