use serde::{Deserialize, Serialize};
use std::fmt;
#[cfg(feature = "schema")]
use schemars::JsonSchema;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[cfg_attr(feature = "schema", derive(JsonSchema))]
pub enum OwnershipLevel {
#[serde(rename = "L1")]
L1ActorLife,
#[serde(rename = "L2")]
L2ActorReflection,
#[serde(rename = "L3")]
L3SystemNode,
#[serde(rename = "L4")]
L4Views,
}
impl OwnershipLevel {
pub fn in_life_lens(&self) -> bool {
matches!(
self,
OwnershipLevel::L1ActorLife | OwnershipLevel::L2ActorReflection
)
}
pub fn can_enter_fact_layer(&self) -> bool {
!matches!(self, OwnershipLevel::L4Views)
}
pub fn requires_epoch(&self) -> bool {
matches!(self, OwnershipLevel::L3SystemNode)
}
pub fn requires_system_actor(&self) -> bool {
matches!(self, OwnershipLevel::L3SystemNode)
}
pub fn level(&self) -> u8 {
match self {
OwnershipLevel::L1ActorLife => 1,
OwnershipLevel::L2ActorReflection => 2,
OwnershipLevel::L3SystemNode => 3,
OwnershipLevel::L4Views => 4,
}
}
}
impl fmt::Display for OwnershipLevel {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
OwnershipLevel::L1ActorLife => write!(f, "L1-ActorLife"),
OwnershipLevel::L2ActorReflection => write!(f, "L2-ActorReflection"),
OwnershipLevel::L3SystemNode => write!(f, "L3-SystemNode"),
OwnershipLevel::L4Views => write!(f, "L4-Views"),
}
}
}
impl Default for OwnershipLevel {
fn default() -> Self {
OwnershipLevel::L1ActorLife
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_life_lens_inclusion() {
assert!(OwnershipLevel::L1ActorLife.in_life_lens());
assert!(OwnershipLevel::L2ActorReflection.in_life_lens());
assert!(!OwnershipLevel::L3SystemNode.in_life_lens());
assert!(!OwnershipLevel::L4Views.in_life_lens());
}
#[test]
fn test_fact_layer_entry() {
assert!(OwnershipLevel::L1ActorLife.can_enter_fact_layer());
assert!(OwnershipLevel::L2ActorReflection.can_enter_fact_layer());
assert!(OwnershipLevel::L3SystemNode.can_enter_fact_layer());
assert!(!OwnershipLevel::L4Views.can_enter_fact_layer());
}
#[test]
fn test_level_numbers() {
assert_eq!(OwnershipLevel::L1ActorLife.level(), 1);
assert_eq!(OwnershipLevel::L2ActorReflection.level(), 2);
assert_eq!(OwnershipLevel::L3SystemNode.level(), 3);
assert_eq!(OwnershipLevel::L4Views.level(), 4);
}
#[test]
fn test_serialization() {
assert_eq!(
serde_json::to_string(&OwnershipLevel::L1ActorLife).unwrap(),
"\"L1\""
);
assert_eq!(
serde_json::to_string(&OwnershipLevel::L2ActorReflection).unwrap(),
"\"L2\""
);
assert_eq!(
serde_json::to_string(&OwnershipLevel::L3SystemNode).unwrap(),
"\"L3\""
);
assert_eq!(
serde_json::to_string(&OwnershipLevel::L4Views).unwrap(),
"\"L4\""
);
for level in [
OwnershipLevel::L1ActorLife,
OwnershipLevel::L2ActorReflection,
OwnershipLevel::L3SystemNode,
OwnershipLevel::L4Views,
] {
let json = serde_json::to_string(&level).unwrap();
let parsed: OwnershipLevel = serde_json::from_str(&json).unwrap();
assert_eq!(parsed, level);
}
}
}