use std::sync::Arc;
use common_types::{
header::Header,
encoded,
receipt::Receipt,
};
use enjen::{Engine, StateDependentProof};
use vapory_types::H256;
use futures::future::IntoFuture;
pub trait ChainDataFetcher: Send + Sync + 'static {
type Error: ::std::fmt::Debug;
type Body: IntoFuture<Item=encoded::Block, Error=Self::Error>;
type Receipts: IntoFuture<Item=Vec<Receipt>, Error=Self::Error>;
type Transition: IntoFuture<Item=Vec<u8>, Error=Self::Error>;
fn block_body(&self, header: &Header) -> Self::Body;
fn block_receipts(&self, header: &Header) -> Self::Receipts;
fn epoch_transition(
&self,
_hash: H256,
_engine: Arc<dyn Engine>,
_checker: Arc<dyn StateDependentProof>
) -> Self::Transition;
}
pub struct Unavailable;
pub fn unavailable() -> Unavailable { Unavailable }
impl ChainDataFetcher for Unavailable {
type Error = &'static str;
type Body = Result<encoded::Block, &'static str>;
type Receipts = Result<Vec<Receipt>, &'static str>;
type Transition = Result<Vec<u8>, &'static str>;
fn block_body(&self, _header: &Header) -> Self::Body {
Err("fetching block bodies unavailable")
}
fn block_receipts(&self, _header: &Header) -> Self::Receipts {
Err("fetching block receipts unavailable")
}
fn epoch_transition(
&self,
_hash: H256,
_engine: Arc<dyn Engine>,
_checker: Arc<dyn StateDependentProof>
) -> Self::Transition {
Err("fetching epoch transition proofs unavailable")
}
}