1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// This is free and unencumbered software released into the public domain.

use crate::{prelude::Bytes, InputPortID, OutputPortID, PortID, PortResult, PortState};

#[allow(unused)]
pub trait Transport: AsTransport + Send + Sync {
    fn state(&self, port: PortID) -> PortResult<PortState> {
        match port {
            PortID::Input(input) => self.input_state(input),
            PortID::Output(output) => self.output_state(output),
        }
    }

    fn input_state(&self, port: InputPortID) -> PortResult<PortState>;
    fn output_state(&self, port: OutputPortID) -> PortResult<PortState>;

    fn open_input(&self) -> PortResult<InputPortID>;
    fn open_output(&self) -> PortResult<OutputPortID>;

    fn close(&self, port: PortID) -> PortResult<bool> {
        Ok(match port {
            PortID::Input(input) => self.close_input(input)?,
            PortID::Output(output) => self.close_output(output)?,
        })
    }

    fn close_input(&self, input: InputPortID) -> PortResult<bool>;
    fn close_output(&self, output: OutputPortID) -> PortResult<bool>;
    fn connect(&self, source: OutputPortID, target: InputPortID) -> PortResult<bool>;
    fn send(&self, output: OutputPortID, message: Bytes) -> PortResult<()>;
    fn recv(&self, input: InputPortID) -> PortResult<Option<Bytes>>;
    fn try_recv(&self, input: InputPortID) -> PortResult<Option<Bytes>>;
}

pub trait AsTransport {
    fn as_transport(&self) -> &dyn Transport;
}

impl<T: Transport + Sized> AsTransport for T {
    fn as_transport(&self) -> &dyn Transport {
        self
    }
}