use std::sync::Arc;
use zakura_chain::block::Block;
use zakura_state::BlockAdmission;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PreparedCandidateSource {
ServerTemplate,
ClientProposal,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Request {
Commit(Arc<Block>),
CommitMined {
block: Arc<Block>,
work_id: Option<String>,
admission: BlockAdmission,
},
CheckProposal(Arc<Block>),
Prepare {
block: Arc<Block>,
work_id: Option<String>,
source: PreparedCandidateSource,
},
}
impl Request {
pub fn block(&self) -> Arc<Block> {
Arc::clone(match self {
Request::Commit(block) => block,
Request::CommitMined { block, .. } => block,
Request::CheckProposal(block) => block,
Request::Prepare { block, .. } => block,
})
}
pub fn is_proposal(&self) -> bool {
match self {
Request::Commit(_) | Request::CommitMined { .. } => false,
Request::CheckProposal(_) | Request::Prepare { .. } => true,
}
}
pub fn should_cache(&self) -> bool {
matches!(self, Request::Prepare { .. })
}
pub fn prepared_candidate_source(&self) -> Option<PreparedCandidateSource> {
match self {
Request::Prepare { source, .. } => Some(*source),
_ => None,
}
}
pub fn work_id(&self) -> Option<&str> {
match self {
Request::CommitMined { work_id, .. } | Request::Prepare { work_id, .. } => {
work_id.as_deref()
}
Request::Commit(_) | Request::CheckProposal(_) => None,
}
}
pub fn admission(&self) -> Option<BlockAdmission> {
match self {
Request::CommitMined { admission, .. } => Some(admission.clone()),
_ => None,
}
}
pub fn is_mined_commit(&self) -> bool {
matches!(self, Request::CommitMined { .. })
}
}