use std::hash::Hash;
use serde::{Serialize, de::DeserializeOwned};
use crate::manifest::{
ManifestError,
domain::{CatalogKey, CatalogValue, GcPlanKey, GcPlanValue, VersionKey, VersionValue},
};
pub(crate) trait ManifestCodec {
type Key: Clone + Ord + Eq + Hash + Serialize + DeserializeOwned + Send + Sync + 'static;
type Value: Clone + Serialize + DeserializeOwned + Send + Sync + 'static;
fn validate_key_value(key: &Self::Key, value: &Self::Value) -> Result<(), ManifestError>;
}
#[derive(Debug, Clone, Copy, Default)]
pub(crate) struct CatalogCodec;
impl ManifestCodec for CatalogCodec {
type Key = CatalogKey;
type Value = CatalogValue;
fn validate_key_value(_key: &Self::Key, _value: &Self::Value) -> Result<(), ManifestError> {
Ok(())
}
}
#[derive(Debug, Clone, Copy, Default)]
pub(crate) struct VersionCodec;
impl ManifestCodec for VersionCodec {
type Key = VersionKey;
type Value = VersionValue;
fn validate_key_value(key: &Self::Key, value: &Self::Value) -> Result<(), ManifestError> {
match (key, value) {
(VersionKey::TableHead { .. }, VersionValue::TableHead(_)) => Ok(()),
(VersionKey::TableVersion { .. }, VersionValue::TableVersion(_)) => Ok(()),
(VersionKey::WalFloor { .. }, VersionValue::WalFloor(_)) => Ok(()),
_ => Err(ManifestError::Invariant("manifest key/value type mismatch")),
}
}
}
#[derive(Debug, Clone, Copy, Default)]
pub(crate) struct GcPlanCodec;
impl ManifestCodec for GcPlanCodec {
type Key = GcPlanKey;
type Value = GcPlanValue;
fn validate_key_value(_key: &Self::Key, _value: &Self::Value) -> Result<(), ManifestError> {
Ok(())
}
}