diff options
author | Matthias Beyer <mail@beyermatthias.de> | 2020-04-29 21:21:07 +0200 |
---|---|---|
committer | Matthias Beyer <mail@beyermatthias.de> | 2020-04-29 21:21:07 +0200 |
commit | 9a1aa5a31cbb442b3bad366bd27bab9948f387e5 (patch) | |
tree | 74947f3417d5bbba951785689e90a8d130ecf693 | |
parent | 5062a7541a3c8263aeb3f5ab32978d48d27e75bc (diff) |
Add method to get a stream of Blocks
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r-- | src/app.rs | 29 |
1 files changed, 29 insertions, 0 deletions
@@ -1,6 +1,8 @@ use std::collections::BTreeMap; use failure::Error; +use futures::Stream; +use futures::stream; use crate::types::util::IPFSHash; use crate::types::util::MimeType; @@ -68,6 +70,33 @@ impl App { Ok(()) } + pub fn blocks(&self, head: IPFSHash) -> impl Stream<Item = Result<Block, Error>> { + stream::unfold((self.repo.clone(), vec![head]), move |(repo, mut state)| { + async { + if let Some(hash) = state.pop() { + match repo + .get_block(hash) + .await + .map(move |block| { + block.parents().iter().for_each(|parent| { + state.push(parent.clone()) + }); + + (block, state) + }) + .map(Some) + .transpose() + { + Some(Ok((item, state))) => Some((Ok(item), (repo, state))), + Some(Err(e)) => Some((Err(e), (repo, vec![]))), + None => None, + } + } else { + None + } + } + }) + } } |