use crate::tracking_copy::TrackingCopyError;
use casper_types::{execution::Effects, BlockTime, Digest, ProtocolVersion};
use std::fmt::{Display, Formatter};
use thiserror::Error;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum BlockGlobalKind {
BlockTime(BlockTime),
MessageCount(u64),
ProtocolVersion(ProtocolVersion),
AddressableEntity(bool),
}
impl Default for BlockGlobalKind {
fn default() -> Self {
BlockGlobalKind::BlockTime(BlockTime::default())
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Default)]
pub struct BlockGlobalRequest {
state_hash: Digest,
protocol_version: ProtocolVersion,
block_global_kind: BlockGlobalKind,
}
impl BlockGlobalRequest {
pub fn block_time(
state_hash: Digest,
protocol_version: ProtocolVersion,
block_time: BlockTime,
) -> Self {
let block_global_kind = BlockGlobalKind::BlockTime(block_time);
BlockGlobalRequest {
state_hash,
protocol_version,
block_global_kind,
}
}
pub fn set_protocol_version(state_hash: Digest, protocol_version: ProtocolVersion) -> Self {
let block_global_kind = BlockGlobalKind::ProtocolVersion(protocol_version);
BlockGlobalRequest {
state_hash,
protocol_version,
block_global_kind,
}
}
pub fn set_addressable_entity(
state_hash: Digest,
protocol_version: ProtocolVersion,
addressable_entity: bool,
) -> Self {
let block_global_kind = BlockGlobalKind::AddressableEntity(addressable_entity);
BlockGlobalRequest {
state_hash,
protocol_version,
block_global_kind,
}
}
pub fn state_hash(&self) -> Digest {
self.state_hash
}
pub fn protocol_version(&self) -> ProtocolVersion {
self.protocol_version
}
pub fn block_global_kind(&self) -> BlockGlobalKind {
self.block_global_kind
}
}
#[derive(Error, Debug, Clone)]
pub enum BlockGlobalResult {
RootNotFound,
Failure(TrackingCopyError),
Success {
post_state_hash: Digest,
effects: Box<Effects>,
},
}
impl Display for BlockGlobalResult {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
BlockGlobalResult::RootNotFound => f.write_str("root not found"),
BlockGlobalResult::Failure(tce) => {
write!(f, "failed {}", tce)
}
BlockGlobalResult::Success { .. } => f.write_str("success"),
}
}
}