sark-h2 0.29.4

Fiber-free HTTP/2 protocol primitives and manifold server for sark
use core::ops;
use std::convert::Infallible;

use o3::buffer::hold::evidence::{Mode, Off};
use sark_http::{
    field::metadata::section::rules,
    owner::handoff::{self, stage},
};

use crate::{
    conn::{self, event},
    server::response::{Handoff, Head, Receipt, head::Staged},
};

pub(in crate::server) struct Detached<
    'a,
    'd,
    F: rules::Policy,
    M: Mode = Off,
    E: event::Evidence = event::Retirement,
    D = Infallible,
> {
    pub(in crate::server::response) staged: Staged<'a, 'd, F, E>,
    pub(in crate::server::response) body: handoff::Pending<'d, M, D>,
}

impl<'a, 'd, F: rules::Policy, M: Handoff, E: event::Evidence, D: stage::Deferred<'d>>
    Detached<'a, 'd, F, M, E, D>
{
    pub(in crate::server) fn defer(
        self,
        request: D::Owner,
    ) -> Result<ops::ControlFlow<Head<'d>, Receipt<'d>>, conn::Error> {
        let Self { staged, body } = self;
        let receipt = M::finish(body, request)?;
        staged.defer(receipt)
    }
}