dope-net 0.38.0

Owned network transports for dope
use std::time;

use dope_core::{
    Errno,
    driver::{result, retained::flight::cancel, schedule::clock},
    io::{event::net::connect, socket, transfer},
};
use o3::base::time::Positive;

use crate::link::oneshot::Cancellation;

#[derive(Clone, Copy, PartialEq, Eq)]
pub enum Error {
    Submit(result::SubmitError),
    Socket(socket::Create),
    Option(Errno),
    Connect(Errno),
    Send(Errno),
    SendAmount {
        observed: transfer::Len,
        submitted: transfer::NonZero,
    },
    SendDeadlineOverflow(clock::Range<Positive>),
    ConnectTimeout {
        late_by: time::Duration,
    },
    SendTimeout {
        late_by: time::Duration,
    },
    Cancelled,
    Cancellation((Cancellation, cancel::Failure)),
    Abandoned,
}

const _: () = assert!(
    std::mem::size_of::<Error>()
        == std::mem::size_of::<Result<clock::Range, (Cancellation, cancel::Failure)>>()
);

impl From<Cancellation> for Error {
    fn from(reason: Cancellation) -> Self {
        match reason {
            Cancellation::Cancelled => Self::Cancelled,
            Cancellation::ConnectTimeout { late_by } => Self::ConnectTimeout { late_by },
            Cancellation::SendTimeout { late_by } => Self::SendTimeout { late_by },
        }
    }
}

impl From<connect::Error> for Error {
    fn from(error: connect::Error) -> Self {
        match error {
            connect::Error::Option(errno) => Self::Option(errno),
            connect::Error::Connect(errno) => Self::Connect(errno),
        }
    }
}