use crate::{
data::{DataError, ValidationError},
emit_error,
};
use core::fmt;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, Default, Deserialize, Eq, Hash, PartialEq, Serialize)]
pub enum ObjectType {
#[default]
#[serde(rename = "Activity")]
Activity,
#[serde(rename = "Agent")]
Agent,
#[serde(rename = "Group")]
Group,
#[serde(rename = "SubStatement")]
SubStatement,
#[serde(rename = "StatementRef")]
StatementRef,
#[serde(rename = "contextAgent")]
ContextAgent,
#[serde(rename = "contextGroup")]
ContextGroup,
#[serde(rename = "Person")]
Person,
}
#[allow(dead_code)]
impl ObjectType {
fn from(s: &str) -> Result<Self, DataError> {
let s = s.trim();
match s {
"Activity" => Ok(ObjectType::Activity),
"Agent" => Ok(ObjectType::Agent),
"Group" => Ok(ObjectType::Group),
"SubStatement" => Ok(ObjectType::SubStatement),
"StatementRef" => Ok(ObjectType::StatementRef),
"contextAgent" => Ok(ObjectType::ContextAgent),
"contextGroup" => Ok(ObjectType::ContextGroup),
"Person" => Ok(ObjectType::Person),
_ => emit_error!(DataError::Validation(ValidationError::ConstraintViolation(
format!("Unknown|invalid ObjectType: '{s}'").into()
))),
}
}
}
impl fmt::Display for ObjectType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let res = match self {
ObjectType::Activity => "Activity",
ObjectType::Agent => "Agent",
ObjectType::Group => "Group",
ObjectType::SubStatement => "SubStatement",
ObjectType::StatementRef => "StatementRef",
ObjectType::ContextAgent => "contextAgent",
ObjectType::ContextGroup => "contextGroup",
ObjectType::Person => "Person",
};
write!(f, "{res}")
}
}
#[cfg(test)]
mod tests {
use super::*;
use tracing_test::traced_test;
#[traced_test]
#[test]
fn test_serde() {
let ot = ObjectType::Agent;
let se_result = serde_json::to_string(&ot);
assert!(se_result.is_ok());
let json = se_result.unwrap();
assert_eq!(json, "\"Agent\"");
let de_result = serde_json::from_str::<ObjectType>(&json);
assert!(de_result.is_ok());
let ot_ = de_result.unwrap();
assert_eq!(ot_, ObjectType::Agent);
}
#[traced_test]
#[test]
fn test_valid_from() {
const JSON: &str = "Agent";
let from_result = ObjectType::from(JSON);
assert!(from_result.is_ok());
let ot = from_result.unwrap();
assert_eq!(ot, ObjectType::Agent);
}
#[test]
fn test_invalid_from() {
const JSON: &str = "\"Agent\"";
let from_result = ObjectType::from(JSON);
assert!(from_result.is_err());
}
}