use crate::kv_store::StorageColumn;
use alloc::{
format,
string::{
String,
ToString,
},
};
#[repr(u32)]
#[derive(
Copy,
Clone,
Debug,
PartialEq,
Eq,
Hash,
enum_iterator::Sequence,
strum_macros::IntoStaticStr,
)]
pub enum MerkleizedColumn<TC> {
Metadata,
MerkleMetadataColumn,
TableColumn(TC),
MerkleDataColumn(TC),
}
impl<TC> strum::EnumCount for MerkleizedColumn<TC>
where
TC: strum::EnumCount + AsU32,
{
const COUNT: usize = TC::COUNT * 2 + 2;
}
pub trait AsU32 {
fn as_u32(&self) -> u32;
}
impl<TC> MerkleizedColumn<TC>
where
TC: strum::EnumCount + AsU32,
{
pub const COUNT: usize = <Self as strum::EnumCount>::COUNT;
pub const MERKLE_DATA_COLUMNS_START: u32 = u16::MAX as u32;
pub const METADATA_COLUMN: u32 = 0;
pub const MERKLE_METADATA_COLUMN: u32 = 1;
#[inline]
fn with_metadata_offset(column: u32) -> u32 {
column.wrapping_add(Self::MERKLE_METADATA_COLUMN + 1)
}
pub fn as_u32(&self) -> u32 {
match self {
Self::Metadata => Self::METADATA_COLUMN,
Self::MerkleMetadataColumn => Self::MERKLE_METADATA_COLUMN,
Self::TableColumn(column) => Self::with_metadata_offset(column.as_u32()),
Self::MerkleDataColumn(column) => Self::with_metadata_offset(
Self::MERKLE_DATA_COLUMNS_START.wrapping_add(column.as_u32()),
),
}
}
}
impl<TC> StorageColumn for MerkleizedColumn<TC>
where
TC: core::fmt::Debug + Copy + strum::EnumCount + AsU32,
{
fn name(&self) -> String {
match self {
Self::Metadata => "Metadata".to_string(),
MerkleizedColumn::MerkleMetadataColumn => "MerkleMetadata".to_string(),
Self::TableColumn(column) => {
format!("{:?}", column)
}
Self::MerkleDataColumn(column) => {
format!("Merkle{:?}", column)
}
}
}
fn id(&self) -> u32 {
self.as_u32()
}
}