use serde::Serialize;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[serde(rename_all = "kebab-case")]
pub enum Class {
Read,
Write,
DeviceManagement,
}
impl Class {
pub fn name(self) -> &'static str {
match self {
Self::Read => "read",
Self::Write => "write",
Self::DeviceManagement => "device-management",
}
}
}
use Class::{DeviceManagement, Read, Write};
pub const COMMANDS: &[(&str, Class)] = &[
("discover", Read),
("whois", Read),
("find", Read),
("whohas", Read),
("read", Read),
("rp", Read),
("readm", Read),
("rpm", Read),
("read-range", Read),
("rr", Read),
("alarms", Read),
("alarm-summary", Read),
("enrollment-summary", Read),
("file-read", Read),
("bdt", Read),
("fdt", Read),
("whois-router", Read),
("subscribe", Read),
("cov", Read),
("register", Read),
("mstp-ports", Read),
("capture", Read),
("sc-check", Read),
("tui", Read),
("mcp", Read),
("help", Read),
("write", Write),
("wp", Write),
("writem", Write),
("wpm", Write),
("create-object", Write),
("delete-object", Write),
("file-write", Write),
("ack-alarm", Write),
("ack", Write),
("time-sync", Write),
("ts", Write),
("unregister", Write),
("control", DeviceManagement),
("dcc", DeviceManagement),
("reinit", DeviceManagement),
];
pub fn of_subscribe(lifetime: u32) -> Class {
if lifetime == 0 { Write } else { Read }
}
pub fn of(command: &str) -> Option<Class> {
COMMANDS
.iter()
.find(|(name, _)| *name == command)
.map(|&(_, class)| class)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn the_mutating_commands_are_pinned() {
let mutating: Vec<(&str, &str)> = COMMANDS
.iter()
.filter(|(_, class)| *class != Read)
.map(|&(name, class)| (name, class.name()))
.collect();
assert_eq!(
mutating,
[
("write", "write"),
("wp", "write"),
("writem", "write"),
("wpm", "write"),
("create-object", "write"),
("delete-object", "write"),
("file-write", "write"),
("ack-alarm", "write"),
("ack", "write"),
("time-sync", "write"),
("ts", "write"),
("unregister", "write"),
("control", "device-management"),
("dcc", "device-management"),
("reinit", "device-management"),
]
);
assert_eq!(of("subscribe"), Some(Read));
assert_eq!(of_subscribe(300), Read);
assert_eq!(of_subscribe(1), Read);
assert_eq!(of_subscribe(0), Write);
assert_eq!(of("register"), Some(Read));
assert_eq!(of("mcp"), Some(Read));
assert_eq!(of("no-such-command"), None);
}
}