robotrt-transport-local 0.1.0-beta.2

RobotRT modular robotics runtime and middleware components.
Documentation
use core_types::{SessionId, TransportDomain};
use transport_core::{
    Endpoint, ListenerHandle, StreamSpec, TransportAdapter, TransportCapabilities, TransportSession,
};

use crate::session::LocalSession;

#[derive(Default)]
pub struct LocalTransportAdapter {
    next_session: u64,
    listeners: Vec<Endpoint>,
}

impl LocalTransportAdapter {
    pub fn new() -> Self {
        Self::default()
    }
}

impl TransportAdapter for LocalTransportAdapter {
    fn domain(&self) -> TransportDomain {
        TransportDomain::Local
    }

    fn capabilities(&self) -> TransportCapabilities {
        TransportCapabilities {
            supports_zero_copy: true,
            supports_reliable: true,
            supports_multicast: false,
            max_payload: 8 * 1024 * 1024,
        }
    }

    fn bind(&mut self, endpoint: Endpoint) -> Result<ListenerHandle, core_types::RtError> {
        self.listeners.push(endpoint.clone());
        Ok(ListenerHandle { endpoint })
    }

    fn connect(
        &mut self,
        _endpoint: Endpoint,
    ) -> Result<Box<dyn TransportSession>, core_types::RtError> {
        self.next_session += 1;
        Ok(Box::new(LocalSession::new(SessionId::new(
            self.next_session,
        ))))
    }

    fn connect_with_spec(
        &mut self,
        endpoint: Endpoint,
        _spec: StreamSpec,
    ) -> Result<Box<dyn TransportSession>, core_types::RtError> {
        self.connect(endpoint)
    }
}