use massa_models::{address::Address, block::Block, block_id::BlockId, slot::Slot};
use serde::{Deserialize, Serialize};
use crate::display_if_true;
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct BlockInfo {
pub id: BlockId,
pub content: Option<BlockInfoContent>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct BlockInfoContent {
pub is_final: bool,
pub is_in_blockclique: bool,
pub is_candidate: bool,
pub is_discarded: bool,
pub block: Block,
}
impl std::fmt::Display for BlockInfo {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if let Some(content) = &self.content {
writeln!(
f,
"Block ID: {}{}{}{}{}",
self.id,
display_if_true(content.is_final, " (final)"),
display_if_true(content.is_candidate, " (candidate)"),
display_if_true(content.is_in_blockclique, " (blockclique)"),
display_if_true(content.is_discarded, " (discarded)"),
)?;
writeln!(f, "Block: {}", content.block)?;
} else {
writeln!(f, "Block {} not found", self.id)?;
}
Ok(())
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct BlockSummary {
pub id: BlockId,
pub is_final: bool,
pub is_stale: bool,
pub is_in_blockclique: bool,
pub slot: Slot,
pub creator: Address,
pub parents: Vec<BlockId>,
}
impl std::fmt::Display for BlockSummary {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
writeln!(
f,
"Block's ID: {}{}{}{}",
self.id,
display_if_true(self.is_final, "final"),
display_if_true(self.is_stale, "stale"),
display_if_true(self.is_in_blockclique, "in blockclique"),
)?;
writeln!(f, "Slot: {}", self.slot)?;
writeln!(f, "Creator: {}", self.creator)?;
writeln!(f, "Parents' IDs:")?;
for parent in &self.parents {
writeln!(f, "\t- {}", parent)?;
}
Ok(())
}
}