use std::num::NonZeroU16;
use crate::connection::{IpmiCommand, Message, NetFn, NotEnoughData};
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum ClearSelAction {
InitiateErase,
GetStatus,
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum ErasureProgress {
InProgress,
Completed,
}
pub struct ClearSel {
reservation_id: Option<NonZeroU16>,
action: ClearSelAction,
}
impl ClearSel {
pub fn initiate(reservation_id: Option<NonZeroU16>) -> Self {
Self {
reservation_id,
action: ClearSelAction::InitiateErase,
}
}
pub fn get_status(reservation_id: Option<NonZeroU16>) -> Self {
Self {
reservation_id,
action: ClearSelAction::GetStatus,
}
}
}
impl IpmiCommand for ClearSel {
type Output = ErasureProgress;
type Error = NotEnoughData;
fn parse_success_response(data: &[u8]) -> Result<Self::Output, Self::Error> {
if data.is_empty() {
return Err(NotEnoughData);
}
let progress = data[0] & 0x0F;
Ok(if progress == 0x01 {
ErasureProgress::Completed
} else {
ErasureProgress::InProgress
})
}
}
impl From<ClearSel> for Message {
fn from(value: ClearSel) -> Self {
let action_byte = match value.action {
ClearSelAction::InitiateErase => 0xAA,
ClearSelAction::GetStatus => 0x00,
};
let mut data = vec![0u8; 6];
data[0..2].copy_from_slice(&value.reservation_id.map_or(0, |id| id.get()).to_le_bytes());
data[2] = 0x43; data[3] = 0x4C; data[4] = 0x52; data[5] = action_byte;
Message::new_request(NetFn::Storage, 0x47, data)
}
}