use crate::control::types::{Lane, SessionId};
use crate::global::const_dsl::{ControlScopeKind, ScopeId};
use super::{CAP_HANDLE_LEN, CapShot, ControlOp};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum WireControlEffect {
Fence,
StateSnapshot,
StateRestore,
TxCommit,
TxAbort,
AbortBegin,
AbortAck,
TopologyBegin,
TopologyAck,
TopologyCommit,
}
impl WireControlEffect {
pub(crate) const fn scope_kind(self) -> ControlScopeKind {
match self {
Self::Fence => ControlScopeKind::Policy,
Self::StateSnapshot | Self::StateRestore | Self::TxCommit | Self::TxAbort => {
ControlScopeKind::State
}
Self::AbortBegin | Self::AbortAck => ControlScopeKind::Abort,
Self::TopologyBegin | Self::TopologyAck | Self::TopologyCommit => {
ControlScopeKind::Topology
}
}
}
pub(crate) const fn op(self) -> ControlOp {
match self {
Self::Fence => ControlOp::Fence,
Self::StateSnapshot => ControlOp::StateSnapshot,
Self::StateRestore => ControlOp::StateRestore,
Self::TxCommit => ControlOp::TxCommit,
Self::TxAbort => ControlOp::TxAbort,
Self::AbortBegin => ControlOp::AbortBegin,
Self::AbortAck => ControlOp::AbortAck,
Self::TopologyBegin => ControlOp::TopologyBegin,
Self::TopologyAck => ControlOp::TopologyAck,
Self::TopologyCommit => ControlOp::TopologyCommit,
}
}
}
pub trait WireControlKind {
const TAG: u8;
const EFFECT: WireControlEffect;
}
pub(crate) trait LocalControlKind {
const TAG: u8;
const SCOPE: ControlScopeKind;
const TAP_ID: u16;
const SHOT: CapShot;
const OP: ControlOp;
fn encode_local_handle(session: SessionId, lane: Lane, scope: ScopeId) -> [u8; CAP_HANDLE_LEN];
}
#[cfg(all(test, hibana_repo_tests))]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) struct EndpointHandle {
pub(crate) sid: SessionId,
pub(crate) lane: Lane,
pub(crate) role: u8,
}
#[cfg(all(test, hibana_repo_tests))]
impl EndpointHandle {
pub(crate) const fn new(sid: SessionId, lane: Lane, role: u8) -> Self {
Self { sid, lane, role }
}
}
#[cfg(all(test, hibana_repo_tests))]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) enum EndpointResource {}
#[cfg(all(test, hibana_repo_tests))]
impl EndpointResource {
pub(crate) const TAG: u8 = 0;
pub(crate) fn encode_identity(handle: &EndpointHandle) -> [u8; CAP_HANDLE_LEN] {
let mut data = [0u8; CAP_HANDLE_LEN];
data[0..4].copy_from_slice(&handle.sid.raw().to_be_bytes());
data[4] = handle.lane.as_wire();
data[5] = handle.role;
data
}
pub(crate) fn decode_identity(
data: [u8; CAP_HANDLE_LEN],
) -> Result<EndpointHandle, super::CapError> {
let sid = SessionId::new(u32::from_be_bytes([data[0], data[1], data[2], data[3]]));
let lane = Lane::new(u32::from(data[4]));
let role = data[5];
Ok(EndpointHandle::new(sid, lane, role))
}
}