#![allow(missing_docs)]
use std::fmt;
#[derive(Debug)]
#[non_exhaustive]
pub enum CommandDispatchError {
UnknownCommand(String),
ExecutionFailed(String),
SerializationError(String),
}
impl fmt::Display for CommandDispatchError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::UnknownCommand(cmd) => write!(f, "unknown command: {cmd}"),
Self::ExecutionFailed(msg) => write!(f, "dispatch failed: {msg}"),
Self::SerializationError(msg) => write!(f, "serde error: {msg}"),
}
}
}
impl std::error::Error for CommandDispatchError {}
pub trait CommandDispatcher: Send + Sync {
fn dispatch(&self, command_type: &str, payload: &[u8])
-> Result<Vec<u8>, CommandDispatchError>;
}
pub trait PolicyProvider: Send + Sync {
fn required_permission(&self, command_type: &str) -> Option<String>;
fn activity_maximum(&self, command_type: &str) -> Option<u8>;
fn security_floor(&self, command_type: &str) -> Option<u8>;
fn decision_tier(&self, command_type: &str) -> Option<String>;
fn role_authorization_level(&self, role: &str) -> Option<u8>;
}
#[cfg(test)]
mod tests {
use super::*;
struct EchoDispatcher;
impl CommandDispatcher for EchoDispatcher {
fn dispatch(
&self,
command_type: &str,
payload: &[u8],
) -> Result<Vec<u8>, CommandDispatchError> {
if command_type == "unknown" {
return Err(CommandDispatchError::UnknownCommand(command_type.into()));
}
Ok(payload.to_vec())
}
}
struct TestPolicyProvider;
impl PolicyProvider for TestPolicyProvider {
fn required_permission(&self, command_type: &str) -> Option<String> {
match command_type {
"user.create" => Some("users:manage".into()),
_ => None,
}
}
fn activity_maximum(&self, command_type: &str) -> Option<u8> {
match command_type {
"user.create" => Some(3),
_ => None,
}
}
fn security_floor(&self, command_type: &str) -> Option<u8> {
match command_type {
"user.create" => Some(2),
_ => None,
}
}
fn decision_tier(&self, command_type: &str) -> Option<String> {
match command_type {
"user.create" => Some("Significant".into()),
_ => None,
}
}
fn role_authorization_level(&self, role: &str) -> Option<u8> {
match role {
"Admin" => Some(4),
"Operator" => Some(3),
"Viewer" => Some(1),
_ => None,
}
}
}
#[test]
fn dispatcher_echo_returns_payload() {
let d = EchoDispatcher;
let result = d.dispatch("user.create", b"test-payload").unwrap();
assert_eq!(result, b"test-payload");
}
#[test]
fn dispatcher_unknown_command_errors() {
let d = EchoDispatcher;
let err = d.dispatch("unknown", b"").unwrap_err();
assert!(matches!(err, CommandDispatchError::UnknownCommand(_)));
assert!(err.to_string().contains("unknown"));
}
#[test]
fn policy_required_permission() {
let p = TestPolicyProvider;
assert_eq!(
p.required_permission("user.create"),
Some("users:manage".into())
);
assert_eq!(p.required_permission("noop"), None);
}
#[test]
fn policy_aeq_dimensions() {
let p = TestPolicyProvider;
assert_eq!(p.activity_maximum("user.create"), Some(3));
assert_eq!(p.security_floor("user.create"), Some(2));
assert_eq!(p.decision_tier("user.create"), Some("Significant".into()));
}
#[test]
fn policy_role_authorization_level() {
let p = TestPolicyProvider;
assert_eq!(p.role_authorization_level("Admin"), Some(4));
assert_eq!(p.role_authorization_level("Viewer"), Some(1));
assert_eq!(p.role_authorization_level("Ghost"), None);
}
#[test]
fn dispatch_error_display() {
let e1 = CommandDispatchError::UnknownCommand("foo".into());
let e2 = CommandDispatchError::ExecutionFailed("bar".into());
let e3 = CommandDispatchError::SerializationError("baz".into());
assert_eq!(e1.to_string(), "unknown command: foo");
assert_eq!(e2.to_string(), "dispatch failed: bar");
assert_eq!(e3.to_string(), "serde error: baz");
}
}