sark-http 0.28.5

HTTP wire types, semantics, codecs, and ownership invariants for Sark
Documentation
use crate::{
    field::metadata::map::record::Match,
    payload::compress::dynamic::{hash, index, table::delta::buffer},
};

#[derive(Clone, Copy)]
pub(in crate::payload::compress::dynamic::table::delta) struct Search<'a>(&'a buffer::Storage);

impl<'a> Search<'a> {
    pub(in crate::payload::compress::dynamic::table::delta) const fn new(
        storage: &'a buffer::Storage,
    ) -> Self {
        Self(storage)
    }

    pub(in crate::payload::compress::dynamic::table::delta) fn both<I: Copy>(
        self,
        probe: hash::Probe<'_>,
        oldest: usize,
        mut map: impl FnMut(usize) -> Option<I>,
    ) -> Match<I> {
        if let Some(exact) = self.exact(probe, oldest, &mut map) {
            return Match {
                exact: Some(exact),
                name: Some(exact),
            };
        }
        let name = self.needle(probe.needle(), oldest, &mut map);
        Match { exact: None, name }
    }

    pub(in crate::payload::compress::dynamic::table::delta) fn exact<I: Copy>(
        self,
        probe: hash::Probe<'_>,
        oldest: usize,
        mut map: impl FnMut(usize) -> Option<I>,
    ) -> Option<I> {
        let field = probe.field();
        let digest = probe.digest();
        self.0.find(
            index::Key::Exact,
            digest.exact(),
            |ordinal, found, relative| {
                if ordinal >= oldest
                    && found.name.is_equal(field.name)
                    && found.value.is_equal(field.value)
                {
                    map(ordinal).map(|mapped| (relative, mapped))
                } else {
                    None
                }
            },
        )
    }

    pub(in crate::payload::compress::dynamic::table::delta) fn needle<I: Copy>(
        self,
        needle: hash::Needle<'_>,
        oldest: usize,
        mut map: impl FnMut(usize) -> Option<I>,
    ) -> Option<I> {
        self.0.find(
            index::Key::Name,
            needle.hash(),
            |ordinal, field, relative| {
                if ordinal >= oldest && field.name.is_equal(needle.name()) {
                    map(ordinal).map(|mapped| (relative, mapped))
                } else {
                    None
                }
            },
        )
    }
}