dope-net 0.36.0

Owned network transports for dope
use dope_core::driver::result;

use crate::wire::send::reclaim;

pub(crate) struct Attempt<P: reclaim::Policy> {
    credit: P::Credit,
    state: State,
}

#[derive(Clone, Copy)]
pub(crate) enum State {
    Submitted,
    Rejected(result::SubmitError),
    Idle,
}

impl<P: reclaim::Policy> Attempt<P> {
    pub(crate) fn submitted(credit: P::Credit) -> Self {
        Self {
            credit,
            state: State::Submitted,
        }
    }

    pub(crate) fn rejected(credit: P::Credit, error: result::SubmitError) -> Self {
        Self {
            credit,
            state: State::Rejected(error),
        }
    }

    pub(crate) fn idle(credit: P::Credit) -> Self {
        Self {
            credit,
            state: State::Idle,
        }
    }

    pub(crate) fn into_parts(self) -> (P::Credit, State) {
        (self.credit, self.state)
    }
}

const _: () =
    assert!(std::mem::size_of::<Attempt<reclaim::OnSubmit>>() <= 2 * std::mem::size_of::<usize>());
const _: () =
    assert!(std::mem::size_of::<Attempt<reclaim::OnComplete>>() == std::mem::size_of::<State>());