use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum EffectKind {
Read,
IdempotentWrite,
ReversibleWrite,
IrreversibleWrite,
}
impl EffectKind {
pub const fn is_naturally_idempotent(self) -> bool {
matches!(self, Self::Read | Self::IdempotentWrite)
}
pub const fn as_str(self) -> &'static str {
match self {
Self::Read => "read",
Self::IdempotentWrite => "idempotent_write",
Self::ReversibleWrite => "reversible_write",
Self::IrreversibleWrite => "irreversible_write",
}
}
pub fn parse(s: &str) -> Option<Self> {
Some(match s {
"read" => Self::Read,
"idempotent_write" => Self::IdempotentWrite,
"reversible_write" => Self::ReversibleWrite,
"irreversible_write" => Self::IrreversibleWrite,
_ => return None,
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn storage_representation_round_trips_and_matches_serde() {
for kind in [
EffectKind::Read,
EffectKind::IdempotentWrite,
EffectKind::ReversibleWrite,
EffectKind::IrreversibleWrite,
] {
assert_eq!(EffectKind::parse(kind.as_str()), Some(kind));
assert_eq!(
serde_json::to_string(&kind).unwrap(),
format!("\"{}\"", kind.as_str())
);
}
}
}