dope-net 0.20.0

Owned network transports for dope
Documentation
use std::net;

pub use dope_core::io::socket::Config;
use dope_core::{
    driver,
    io::{
        fd::handles,
        socket::{self, install::Install, option},
    },
};

#[derive(Clone, Copy, Default, PartialEq, Eq)]
pub struct StreamConfig {
    pub recv_buffer_size: Option<option::Buffer>,
    pub send_buffer_size: Option<option::Buffer>,
    pub no_delay: Option<option::Switch>,
    pub keep_alive: Option<option::Switch>,
    pub keep_alive_idle: Option<option::Period>,
    pub keep_alive_interval: Option<option::Period>,
    pub keep_alive_retries: Option<option::Retries>,
}

pub struct Tcp;

impl crate::Transport for Tcp {
    type Addr = net::SocketAddr;
    type Prepared = socket::Inet;
    type StreamConfig = StreamConfig;

    fn options(config: StreamConfig) -> option::Set {
        option::Set::new(
            config.recv_buffer_size,
            config.send_buffer_size,
            config.no_delay,
            config.keep_alive,
            config.keep_alive_idle,
            config.keep_alive_interval,
            config.keep_alive_retries,
        )
    }
}

impl crate::Listen for Tcp {
    type ListenerConfig = Config;
    type BoundListener = socket::Listener;

    fn bind<'d>(
        driver: &mut driver::Context<'_, 'd>,
        addr: &net::SocketAddr,
        cap: socket::Backlog,
        config: &Config,
    ) -> Result<(handles::Descriptor<'d>, net::SocketAddr), crate::BindingError> {
        Install::bind_stream(driver.reborrow(), *addr, cap, config)
            .map_err(crate::BindingError::Bootstrap)
    }

    fn adopt<'d>(
        driver: &mut driver::Context<'_, 'd>,
        bound: socket::Listener,
    ) -> Result<(handles::Descriptor<'d>, net::SocketAddr), crate::BindingError> {
        Install::adopt_bound(driver.reborrow(), bound).map_err(crate::BindingError::Bootstrap)
    }
}