sark-http 0.29.5

HTTP wire types, semantics, codecs, and ownership invariants for Sark
use o3::buffer::{pool, write::consume};
use sark_http::field::metadata::{map, map::record, packed, section::storage};

#[derive(Debug)]
pub enum Error {
    Fields(map::Error),
    Pool(pool::CreateError),
    Write(consume::Error),
    Format(storage::Fault),
}

pub trait Decode: Sized {
    fn try_decode(entries: &[record::Entry<'_>]) -> Result<Self, Error>;
}

impl Decode for packed::Decoded {
    fn try_decode(entries: &[record::Entry<'_>]) -> Result<Self, Error> {
        let mut fields = map::Fields::new();
        for field in entries {
            fields.push_entry(*field).map_err(Error::Fields)?;
        }
        let bytes = fields.as_bytes();
        let mut lease = pool::Span::try_new(bytes.len().max(1)).map_err(Error::Pool)?;
        lease.try_append(bytes).map_err(Error::Write)?.commit();
        Ok(<packed::Decoded as storage::Block>::from(
            storage::Finished::try_from(lease).map_err(Error::Format)?,
        ))
    }
}