use serde::{Deserialize, Serialize};
use shikumi::TieredConfig;
use crate::error::ConfigError;
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ConsistencyConfig {
pub default_tier: ConsistencyTierKind,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ConsistencyTierKind {
Strong,
EventualGossip,
DurableStream,
Content,
}
impl TieredConfig for ConsistencyConfig {
fn bare() -> Self {
Self {
default_tier: ConsistencyTierKind::Strong,
}
}
fn prescribed_default() -> Self {
Self {
default_tier: ConsistencyTierKind::Strong,
}
}
fn extend(self, _base: &Self) -> Self {
self
}
}
impl ConsistencyConfig {
pub fn validate(&self) -> Result<(), ConfigError> {
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn prescribed_default_uses_strong() {
let cfg = ConsistencyConfig::prescribed_default();
assert_eq!(cfg.default_tier, ConsistencyTierKind::Strong);
cfg.validate().unwrap();
}
#[test]
fn tier_kind_serializes_snake_case() {
let json = serde_json::to_string(&ConsistencyTierKind::EventualGossip).unwrap();
assert_eq!(json, "\"eventual_gossip\"");
}
}