scsir 0.3.0

A simple library for issuing SCSI commands
Documentation
use crate::command::get_array;

use super::header::PageHeader;

#[derive(Clone, Debug)]
pub struct PageWrapper<Parameter: LogParameter> {
    pub header: PageHeader,
    pub parameters: Vec<Parameter>,
}

pub trait LogParameter {
    fn new() -> Self
    where
        Self: Sized;

    fn from_bytes(bytes: &[u8]) -> (Self, &[u8])
    where
        Self: Sized;

    fn to_bytes(&self) -> Vec<u8>;
}

impl<Parameter: LogParameter> PageWrapper<Parameter> {
    pub fn from_bytes(bytes: &[u8]) -> Self {
        let (arryay, bytes) = get_array(bytes);
        let header = PageHeader::from_bytes(arryay);

        let mut bytes = &bytes[..usize::min(header.page_length() as usize, bytes.len())];
        let mut parameter;
        let mut parameters = vec![];
        while !bytes.is_empty() {
            (parameter, bytes) = Parameter::from_bytes(bytes);
            parameters.push(parameter);
        }

        Self { header, parameters }
    }

    pub fn to_bytes(&self) -> Vec<u8> {
        let mut bytes = vec![];
        bytes.extend_from_slice(&self.header.into_bytes());
        for item in &self.parameters {
            bytes.extend_from_slice(&item.to_bytes());
        }

        bytes
    }
}