use std::time::Duration;
use protobuf::well_known_types::Duration as ProtoDuration;
use crate::proto::abci::{
BlockID as ProtoBlockId, BlockParams as ProtoBlockParams,
ConsensusParams as ProtoConsensusParams, Event as ProtoEvent, Evidence as ProtoEvidence,
EvidenceParams as ProtoEvidenceParams, Header as ProtoHeader,
LastCommitInfo as ProtoLastCommitInfo, PartSetHeader as ProtoPartSetHeader,
PubKey as ProtoPublicKey, Validator as ProtoValidator, ValidatorParams as ProtoValidatorParams,
ValidatorUpdate as ProtoValidatorUpdate, Version as ProtoVersion, VoteInfo as ProtoVoteInfo,
};
use crate::proto::merkle::{Proof as ProtoProof, ProofOp as ProtoProofOp};
use crate::proto::types::Pair as ProtoPair;
#[derive(Debug, Default)]
pub struct ConsensusParams {
pub block: Option<BlockParams>,
pub evidence: Option<EvidenceParams>,
pub validator: Option<ValidatorParams>,
}
impl From<ConsensusParams> for ProtoConsensusParams {
fn from(consensus_params: ConsensusParams) -> ProtoConsensusParams {
let mut proto_consensus_params = ProtoConsensusParams::new();
proto_consensus_params.block = consensus_params.block.map(Into::into).into();
proto_consensus_params.evidence = consensus_params.evidence.map(Into::into).into();
proto_consensus_params.validator = consensus_params.validator.map(Into::into).into();
proto_consensus_params
}
}
impl From<ProtoConsensusParams> for ConsensusParams {
fn from(proto_consensus_params: ProtoConsensusParams) -> ConsensusParams {
ConsensusParams {
block: proto_consensus_params.block.into_option().map(Into::into),
evidence: proto_consensus_params
.evidence
.into_option()
.map(Into::into),
validator: proto_consensus_params
.validator
.into_option()
.map(Into::into),
}
}
}
#[derive(Debug, Default)]
pub struct BlockParams {
pub max_bytes: i64,
pub max_gas: i64,
}
impl From<BlockParams> for ProtoBlockParams {
fn from(block_params: BlockParams) -> ProtoBlockParams {
let mut proto_block_params = ProtoBlockParams::new();
proto_block_params.max_bytes = block_params.max_bytes;
proto_block_params.max_gas = block_params.max_gas;
proto_block_params
}
}
impl From<ProtoBlockParams> for BlockParams {
fn from(proto_block_params: ProtoBlockParams) -> BlockParams {
BlockParams {
max_bytes: proto_block_params.max_bytes,
max_gas: proto_block_params.max_gas,
}
}
}
#[derive(Debug, Default)]
pub struct EvidenceParams {
pub max_age_num_blocks: i64,
pub max_age_duration: Option<Duration>,
}
impl From<EvidenceParams> for ProtoEvidenceParams {
fn from(evidence_params: EvidenceParams) -> ProtoEvidenceParams {
let mut proto_evidence_params = ProtoEvidenceParams::new();
proto_evidence_params.max_age_num_blocks = evidence_params.max_age_num_blocks;
proto_evidence_params.max_age_duration = evidence_params
.max_age_duration
.map(|duration| {
let mut proto_duration = ProtoDuration::new();
proto_duration.set_seconds(duration.as_secs() as i64);
proto_duration.set_nanos(duration.subsec_nanos() as i32);
proto_duration
})
.into();
proto_evidence_params
}
}
impl From<ProtoEvidenceParams> for EvidenceParams {
fn from(proto_evidence_params: ProtoEvidenceParams) -> EvidenceParams {
let max_age_duration =
proto_evidence_params
.max_age_duration
.into_option()
.map(|ref proto_duration| {
Duration::new(
proto_duration.get_seconds() as u64,
proto_duration.get_nanos() as u32,
)
});
EvidenceParams {
max_age_num_blocks: proto_evidence_params.max_age_num_blocks,
max_age_duration,
}
}
}
#[derive(Debug, Default)]
pub struct ValidatorParams {
pub public_key_types: Vec<String>,
}
impl From<ValidatorParams> for ProtoValidatorParams {
fn from(validator_params: ValidatorParams) -> ProtoValidatorParams {
let mut proto_validator_params = ProtoValidatorParams::new();
proto_validator_params.pub_key_types = validator_params.public_key_types.into();
proto_validator_params
}
}
impl From<ProtoValidatorParams> for ValidatorParams {
fn from(proto_validator_params: ProtoValidatorParams) -> ValidatorParams {
ValidatorParams {
public_key_types: proto_validator_params.pub_key_types.into_vec(),
}
}
}
#[derive(Debug, Default)]
pub struct ValidatorUpdate {
pub public_key: Option<PublicKey>,
pub power: i64,
}
impl From<ValidatorUpdate> for ProtoValidatorUpdate {
fn from(validator_update: ValidatorUpdate) -> ProtoValidatorUpdate {
let mut proto_validator_update = ProtoValidatorUpdate::new();
proto_validator_update.pub_key = validator_update.public_key.map(Into::into).into();
proto_validator_update.power = validator_update.power;
proto_validator_update
}
}
impl From<ProtoValidatorUpdate> for ValidatorUpdate {
fn from(proto_validator_update: ProtoValidatorUpdate) -> ValidatorUpdate {
ValidatorUpdate {
public_key: proto_validator_update.pub_key.into_option().map(Into::into),
power: proto_validator_update.power,
}
}
}
#[derive(Debug, Default)]
pub struct PublicKey {
pub public_key_type: String,
pub data: Vec<u8>,
}
impl From<PublicKey> for ProtoPublicKey {
fn from(public_key: PublicKey) -> ProtoPublicKey {
let mut proto_public_key = ProtoPublicKey::new();
proto_public_key.field_type = public_key.public_key_type;
proto_public_key.data = public_key.data;
proto_public_key
}
}
impl From<ProtoPublicKey> for PublicKey {
fn from(proto_public_key: ProtoPublicKey) -> PublicKey {
PublicKey {
public_key_type: proto_public_key.field_type,
data: proto_public_key.data,
}
}
}
#[derive(Debug, Default)]
pub struct Proof {
pub ops: Vec<ProofOp>,
}
impl From<Proof> for ProtoProof {
fn from(proof: Proof) -> ProtoProof {
let mut proto_proof = ProtoProof::new();
proto_proof.ops = proof
.ops
.into_iter()
.map(Into::into)
.collect::<Vec<ProtoProofOp>>()
.into();
proto_proof
}
}
#[derive(Debug, Default)]
pub struct ProofOp {
pub proof_op_type: String,
pub key: Vec<u8>,
pub data: Vec<u8>,
}
impl From<ProofOp> for ProtoProofOp {
fn from(proof_op: ProofOp) -> ProtoProofOp {
let mut proto_proof_op = ProtoProofOp::new();
proto_proof_op.field_type = proof_op.proof_op_type;
proto_proof_op.key = proof_op.key;
proto_proof_op.data = proof_op.data;
proto_proof_op
}
}
#[derive(Debug, Default)]
pub struct Version {
pub block: u64,
pub app: u64,
}
impl From<ProtoVersion> for Version {
fn from(proto_version: ProtoVersion) -> Version {
Version {
block: proto_version.Block,
app: proto_version.App,
}
}
}
#[derive(Debug, Default)]
pub struct PartSetHeader {
pub total: i32,
pub hash: Vec<u8>,
}
impl From<ProtoPartSetHeader> for PartSetHeader {
fn from(proto_part_set_header: ProtoPartSetHeader) -> PartSetHeader {
PartSetHeader {
total: proto_part_set_header.total,
hash: proto_part_set_header.hash,
}
}
}
#[derive(Debug, Default)]
pub struct BlockId {
pub hash: Vec<u8>,
pub parts_header: Option<PartSetHeader>,
}
impl From<ProtoBlockId> for BlockId {
fn from(proto_block_id: ProtoBlockId) -> BlockId {
BlockId {
hash: proto_block_id.hash,
parts_header: proto_block_id.parts_header.into_option().map(Into::into),
}
}
}
#[derive(Debug, Default)]
pub struct Header {
pub version: Option<Version>,
pub chain_id: String,
pub height: i64,
pub time: Option<Duration>,
pub last_block_id: Option<BlockId>,
pub last_commit_hash: Vec<u8>,
pub data_hash: Vec<u8>,
pub validators_hash: Vec<u8>,
pub next_validators_hash: Vec<u8>,
pub consensus_hash: Vec<u8>,
pub app_hash: Vec<u8>,
pub last_results_hash: Vec<u8>,
pub evidence_hash: Vec<u8>,
pub proposer_address: Vec<u8>,
}
impl From<ProtoHeader> for Header {
fn from(proto_header: ProtoHeader) -> Header {
Header {
version: proto_header.version.into_option().map(Into::into),
chain_id: proto_header.chain_id,
height: proto_header.height,
time: proto_header
.time
.into_option()
.map(|timestamp| Duration::new(timestamp.seconds as u64, timestamp.nanos as u32)),
last_block_id: proto_header.last_block_id.into_option().map(Into::into),
last_commit_hash: proto_header.last_commit_hash,
data_hash: proto_header.data_hash,
validators_hash: proto_header.validators_hash,
next_validators_hash: proto_header.next_validators_hash,
consensus_hash: proto_header.consensus_hash,
app_hash: proto_header.app_hash,
last_results_hash: proto_header.last_results_hash,
evidence_hash: proto_header.evidence_hash,
proposer_address: proto_header.proposer_address,
}
}
}
#[derive(Debug, Default)]
pub struct Validator {
pub address: Vec<u8>,
pub power: i64,
}
impl From<ProtoValidator> for Validator {
fn from(proto_validator: ProtoValidator) -> Validator {
Validator {
address: proto_validator.address,
power: proto_validator.power,
}
}
}
#[derive(Debug, Default)]
pub struct VoteInfo {
pub validator: Option<Validator>,
pub signed_last_block: bool,
}
impl From<ProtoVoteInfo> for VoteInfo {
fn from(proto_vote_info: ProtoVoteInfo) -> VoteInfo {
VoteInfo {
validator: proto_vote_info.validator.into_option().map(Into::into),
signed_last_block: proto_vote_info.signed_last_block,
}
}
}
#[derive(Debug, Default)]
pub struct LastCommitInfo {
pub round: i32,
pub votes: Vec<VoteInfo>,
}
impl From<ProtoLastCommitInfo> for LastCommitInfo {
fn from(proto_last_commit_info: ProtoLastCommitInfo) -> LastCommitInfo {
LastCommitInfo {
round: proto_last_commit_info.round,
votes: proto_last_commit_info
.votes
.into_iter()
.map(Into::into)
.collect(),
}
}
}
#[derive(Debug, Default)]
pub struct Evidence {
pub evidence_type: String,
pub validator: Option<Validator>,
pub height: i64,
pub time: Option<Duration>,
pub total_voting_power: i64,
}
impl From<ProtoEvidence> for Evidence {
fn from(proto_evidence: ProtoEvidence) -> Evidence {
Evidence {
evidence_type: proto_evidence.field_type,
validator: proto_evidence.validator.into_option().map(Into::into),
height: proto_evidence.height,
time: proto_evidence
.time
.into_option()
.map(|timestamp| Duration::new(timestamp.seconds as u64, timestamp.nanos as u32)),
total_voting_power: proto_evidence.total_voting_power,
}
}
}
#[derive(Debug, Default)]
pub struct Pair {
pub key: Vec<u8>,
pub value: Vec<u8>,
}
impl From<Pair> for ProtoPair {
fn from(pair: Pair) -> ProtoPair {
let mut proto_pair = ProtoPair::new();
proto_pair.key = pair.key;
proto_pair.value = pair.value;
proto_pair
}
}
#[derive(Debug, Default)]
pub struct Event {
pub event_type: String,
pub attributes: Vec<Pair>,
}
impl From<Event> for ProtoEvent {
fn from(event: Event) -> ProtoEvent {
let mut proto_event = ProtoEvent::new();
proto_event.field_type = event.event_type;
proto_event.attributes = event
.attributes
.into_iter()
.map(Into::into)
.collect::<Vec<ProtoPair>>()
.into();
proto_event
}
}