use bytes::Bytes;
use vapory_types::H256;
use crate::{
import_route::ImportRoute,
};
use std::time::Duration;
use std::collections::HashMap;
pub enum ChainMessageType {
Consensus(Vec<u8>),
PrivateTransaction(H256, Vec<u8>),
SignedPrivateTransaction(H256, Vec<u8>),
PrivateStateRequest(H256),
}
#[derive(Clone)]
pub enum ChainRouteType {
Enacted,
Retracted
}
#[derive(Default, Clone)]
pub struct ChainRoute {
route: Vec<(H256, ChainRouteType)>,
enacted: Vec<H256>,
retracted: Vec<H256>,
}
impl<'a> From<&'a [ImportRoute]> for ChainRoute {
fn from(import_results: &'a [ImportRoute]) -> ChainRoute {
ChainRoute::new(import_results.iter().flat_map(|route| {
route.retracted.iter().map(|h| (*h, ChainRouteType::Retracted))
.chain(route.enacted.iter().map(|h| (*h, ChainRouteType::Enacted)))
}).collect())
}
}
impl ChainRoute {
pub fn new(route: Vec<(H256, ChainRouteType)>) -> Self {
let (enacted, retracted) = Self::to_enacted_retracted(&route);
Self { route, enacted, retracted }
}
fn to_enacted_retracted(route: &[(H256, ChainRouteType)]) -> (Vec<H256>, Vec<H256>) {
fn map_to_vec(map: Vec<(H256, bool)>) -> Vec<H256> {
map.into_iter().map(|(k, _v)| k).collect()
}
let map = route.iter().fold(HashMap::new(), |mut map, route| {
match &route.1 {
&ChainRouteType::Enacted => {
map.insert(route.0, true);
},
&ChainRouteType::Retracted => {
map.insert(route.0, false);
},
}
map
});
let (enacted, retracted) = map.into_iter().partition(|&(_k, v)| v);
(map_to_vec(enacted), map_to_vec(retracted))
}
pub fn into_enacted_retracted(self) -> (Vec<H256>, Vec<H256>) {
(self.enacted, self.retracted)
}
pub fn enacted(&self) -> &[H256] {
&self.enacted
}
pub fn retracted(&self) -> &[H256] {
&self.retracted
}
pub fn route(&self) -> &[(H256, ChainRouteType)] {
&self.route
}
}
pub struct NewBlocks {
pub imported: Vec<H256>,
pub invalid: Vec<H256>,
pub route: ChainRoute,
pub sealed: Vec<H256>,
pub proposed: Vec<Bytes>,
pub duration: Duration,
pub has_more_blocks_to_import: bool,
}
impl NewBlocks {
pub fn new(
imported: Vec<H256>,
invalid: Vec<H256>,
route: ChainRoute,
sealed: Vec<H256>,
proposed: Vec<Bytes>,
duration: Duration,
has_more_blocks_to_import: bool,
) -> NewBlocks {
NewBlocks {
imported,
invalid,
route,
sealed,
proposed,
duration,
has_more_blocks_to_import,
}
}
}