From 9a1aa5a31cbb442b3bad366bd27bab9948f387e5 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Wed, 29 Apr 2020 21:21:07 +0200 Subject: Add method to get a stream of Blocks Signed-off-by: Matthias Beyer --- src/app.rs | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/app.rs b/src/app.rs index 9a1e0d3..052973c 100644 --- a/src/app.rs +++ b/src/app.rs @@ -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> { + 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 + } + } + }) + } } -- cgit v1.2.3