use nintypes::common::hash::Hash256;
use serde::{Deserialize, Serialize};
use crate::{cache::UpdateCapable, BlockHeight};
#[derive(Clone, Copy, Default, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct BlockMeta {
pub height: BlockHeight,
pub hash: Hash256,
pub prev_block_hash: Hash256,
}
impl From<nintypes::external::electrs::BlockInfo> for BlockMeta {
fn from(value: nintypes::external::electrs::BlockInfo) -> Self {
Self {
hash: value.block_hash,
height: value.height.0,
prev_block_hash: value.prev_block_hash,
}
}
}
#[derive(Clone, Default, Deserialize)]
pub struct BlockMetaWithoutPrevHash {
pub ord_height: BlockHeight,
pub ord_tip: String,
}
pub enum Update<Block: serde::Serialize + serde::de::DeserializeOwned> {
AddBlock(UpdateCapable<Block>),
RemoveBlock {
height: BlockHeight,
block: Option<UpdateCapable<Block>>,
},
}
impl<Block: serde::Serialize + serde::de::DeserializeOwned> Update<Block> {
pub fn get_height(&self) -> BlockHeight {
match self {
Self::AddBlock(UpdateCapable {
block: BlockMeta { height, .. },
..
})
| Self::RemoveBlock { height, .. } => *height,
}
}
pub fn is_remove(&self) -> bool {
match self {
Self::AddBlock { .. } => false,
Self::RemoveBlock { .. } => true,
}
}
}