field_block 0.1.3

A definition language for buffer parsing
Documentation
use std::collections::HashMap;

use octets::{Octets, OctetsMut};

use crate::{Def, Error, Field, FieldName, Val, ValInfo};

pub struct Block<F>
where
    F: FieldName,
{
    fields: Vec<Field<F>>,
}

impl<F> Block<F>
where
    F: FieldName,
{
    fn check_rep(&self) {}

    #[must_use]
    pub fn new() -> Self {
        let self_ = Block { fields: Vec::new() };
        self_.check_rep();
        self_
    }

    pub fn add_field(&mut self, name: F, def: Def) {
        self.fields.push(Field::new(name, def));
        self.check_rep();
    }

    pub fn to_bytes(&self, values: &HashMap<F, Val>, b: &mut [u8]) -> Result<usize, Error<F>> {
        let mut b = OctetsMut::with_slice(b);
        return self.to_bytes_(values, &mut b);
    }

    fn to_bytes_(&self, values: &HashMap<F, Val>, b: &mut OctetsMut) -> Result<usize, Error<F>> {
        for field in self.fields.iter() {
            field.to_bytes(values, b)?;
        }
        Ok(b.off())
    }

    pub fn to_values<'buf>(
        &self,
        b: &'buf [u8],
        values: &mut HashMap<F, ValInfo<'buf>>,
    ) -> Result<usize, Error<F>> {
        let mut b = Octets::with_slice(b);
        return self.to_values_(&mut b, values);
    }

    fn to_values_<'buf>(
        &self,
        b: &mut Octets<'buf>,
        values: &mut HashMap<F, ValInfo<'buf>>,
    ) -> Result<usize, Error<F>> {
        for field in self.fields.iter() {
            field.to_value(b, values)?;
        }
        Ok(b.off())
    }
}