use tetsy_rlp::RlpStream;
use vapory_types::{H64, H256, H520};
use vapjson;
#[derive(Debug)]
pub struct Vapory {
pub nonce: H64,
pub mix_hash: H256,
}
impl Into<Generic> for Vapory {
fn into(self) -> Generic {
let mut s = RlpStream::new_list(2);
s.append(&self.mix_hash).append(&self.nonce);
Generic(s.out())
}
}
#[derive(Debug)]
pub struct AuthorityRound {
pub step: usize,
pub signature: H520,
}
#[derive(Debug)]
pub struct Tendermint {
pub round: usize,
pub proposal: H520,
pub precommits: Vec<H520>,
}
impl Into<Generic> for AuthorityRound {
fn into(self) -> Generic {
let mut s = RlpStream::new_list(2);
s.append(&self.step).append(&self.signature);
Generic(s.out())
}
}
impl Into<Generic> for Tendermint {
fn into(self) -> Generic {
let mut stream = RlpStream::new_list(3);
stream
.append(&self.round)
.append(&self.proposal)
.append_list(&self.precommits);
Generic(stream.out())
}
}
#[derive(Debug)]
pub struct Generic(pub Vec<u8>);
#[derive(Debug)]
pub enum Seal {
Vapory(Vapory),
AuthorityRound(AuthorityRound),
Tendermint(Tendermint),
Generic(Generic),
}
impl From<vapjson::spec::Seal> for Seal {
fn from(s: vapjson::spec::Seal) -> Self {
match s {
vapjson::spec::Seal::Vapory(vap) => Seal::Vapory(Vapory {
nonce: vap.nonce.into(),
mix_hash: vap.mix_hash.into()
}),
vapjson::spec::Seal::AuthorityRound(ar) => Seal::AuthorityRound(AuthorityRound {
step: ar.step.into(),
signature: ar.signature.into()
}),
vapjson::spec::Seal::Tendermint(tender) => Seal::Tendermint(Tendermint {
round: tender.round.into(),
proposal: tender.proposal.into(),
precommits: tender.precommits.into_iter().map(Into::into).collect()
}),
vapjson::spec::Seal::Generic(g) => Seal::Generic(Generic(g.into())),
}
}
}
impl Into<Generic> for Seal {
fn into(self) -> Generic {
match self {
Seal::Generic(generic) => generic,
Seal::Vapory(vap) => vap.into(),
Seal::AuthorityRound(ar) => ar.into(),
Seal::Tendermint(tender) => tender.into(),
}
}
}