use super::registry::rip_command_name;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum RipCommand {
Request,
Response,
UpdateRequest,
UpdateResponse,
UpdateAcknowledge,
Other(u8),
}
impl RipCommand {
pub const fn from_code(code: u8) -> RipCommand {
match code {
1 => RipCommand::Request,
2 => RipCommand::Response,
9 => RipCommand::UpdateRequest,
10 => RipCommand::UpdateResponse,
11 => RipCommand::UpdateAcknowledge,
other => RipCommand::Other(other),
}
}
pub const fn code(self) -> u8 {
match self {
RipCommand::Request => 1,
RipCommand::Response => 2,
RipCommand::UpdateRequest => 9,
RipCommand::UpdateResponse => 10,
RipCommand::UpdateAcknowledge => 11,
RipCommand::Other(code) => code,
}
}
pub fn name(self) -> &'static str {
rip_command_name(self.code()).unwrap_or("Unassigned")
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn rip_command_roundtrips_known_and_unknown() {
assert_eq!(RipCommand::from_code(1), RipCommand::Request);
assert_eq!(RipCommand::Request.code(), 1);
assert_eq!(RipCommand::from_code(2), RipCommand::Response);
assert_eq!(RipCommand::Response.code(), 2);
assert_eq!(RipCommand::from_code(9), RipCommand::UpdateRequest);
assert_eq!(RipCommand::UpdateRequest.code(), 9);
assert_eq!(RipCommand::from_code(10), RipCommand::UpdateResponse);
assert_eq!(RipCommand::UpdateResponse.code(), 10);
assert_eq!(RipCommand::from_code(11), RipCommand::UpdateAcknowledge);
assert_eq!(RipCommand::UpdateAcknowledge.code(), 11);
assert_eq!(RipCommand::from_code(200), RipCommand::Other(200));
assert_eq!(RipCommand::Other(200).code(), 200);
assert_eq!(
RipCommand::from_code(RipCommand::Other(200).code()),
RipCommand::Other(200)
);
assert_eq!(RipCommand::Request.name(), "Request");
assert_eq!(RipCommand::UpdateAcknowledge.name(), "Update Acknowledge");
assert_eq!(RipCommand::Other(200).name(), "Unassigned");
}
}