sark-h2 0.25.0

Fiber-free HTTP/2 protocol primitives and manifold server for sark
use sark_core::decode::{self, exec, request};
use sark_http::payload::owned;

use crate::server::{payload, response, state::exchange::Deferred, sync::book::Delayed};

pub(in crate::server::sync) enum Phase<'d, R: decode::Decode> {
    Routed(Delayed<'d, R>),
    Request(request::Ready<exec::Sync, R::Prepared, owned::Segments<'d>>),
    Status(response::Status),
    Head(response::Head<'d>),
}

impl<'d, R: decode::Decode> Phase<'d, R>
where
    Delayed<'d, R>: Deferred<'d, R::Prepared, R::Routes>,
{
    pub(super) fn try_finish(self) -> (Self, Option<Result<(), payload::Error>>) {
        match self {
            Self::Routed(routed) => match Deferred::try_finish(routed) {
                Ok(routed) => (Self::Routed(routed), Some(Ok(()))),
                Err((error, routed)) => (Self::Routed(routed), Some(Err(error))),
            },
            phase => (phase, None),
        }
    }
}