#[repr(u16)]
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub enum ControlOpcode {
PrepareTransition = 0x0001,
ReadyForTransition = 0x0002,
ExecuteTransition = 0x0003,
AbortTransition = 0x0004,
GroupStateDigestRequest = 0x0005,
GroupStateDigestResponse = 0x0006,
ReportInvalidCommit = 0x0007,
CapabilitiesAdvertise = 0x0008,
Ack = 0x0009,
Nack = 0x000A,
}
impl ControlOpcode {
pub fn name(self) -> &'static str {
use ControlOpcode::*;
match self {
PrepareTransition => "PREPARE_TRANSITION",
ReadyForTransition => "READY_FOR_TRANSITION",
ExecuteTransition => "EXECUTE_TRANSITION",
AbortTransition => "ABORT_TRANSITION",
GroupStateDigestRequest => "GROUP_STATE_DIGEST_REQUEST",
GroupStateDigestResponse => "GROUP_STATE_DIGEST_RESPONSE",
ReportInvalidCommit => "REPORT_INVALID_COMMIT",
CapabilitiesAdvertise => "CAPABILITIES_ADVERTISE",
Ack => "ACK",
Nack => "NACK",
}
}
}
impl TryFrom<u16> for ControlOpcode {
type Error = u16;
fn try_from(v: u16) -> Result<Self, u16> {
use ControlOpcode::*;
Ok(match v {
0x0001 => PrepareTransition,
0x0002 => ReadyForTransition,
0x0003 => ExecuteTransition,
0x0004 => AbortTransition,
0x0005 => GroupStateDigestRequest,
0x0006 => GroupStateDigestResponse,
0x0007 => ReportInvalidCommit,
0x0008 => CapabilitiesAdvertise,
0x0009 => Ack,
0x000A => Nack,
other => return Err(other),
})
}
}