protoflow_core/
transport.rs

1// This is free and unencumbered software released into the public domain.
2
3use crate::{prelude::Bytes, InputPortID, OutputPortID, PortID, PortResult, PortState};
4
5#[allow(unused)]
6pub trait Transport: AsTransport + Send + Sync {
7    fn state(&self, port: PortID) -> PortResult<PortState> {
8        match port {
9            PortID::Input(input) => self.input_state(input),
10            PortID::Output(output) => self.output_state(output),
11        }
12    }
13
14    fn input_state(&self, port: InputPortID) -> PortResult<PortState>;
15    fn output_state(&self, port: OutputPortID) -> PortResult<PortState>;
16
17    fn open_input(&self) -> PortResult<InputPortID>;
18    fn open_output(&self) -> PortResult<OutputPortID>;
19
20    fn close(&self, port: PortID) -> PortResult<bool> {
21        Ok(match port {
22            PortID::Input(input) => self.close_input(input)?,
23            PortID::Output(output) => self.close_output(output)?,
24        })
25    }
26
27    fn close_input(&self, input: InputPortID) -> PortResult<bool>;
28    fn close_output(&self, output: OutputPortID) -> PortResult<bool>;
29    fn connect(&self, source: OutputPortID, target: InputPortID) -> PortResult<bool>;
30    fn send(&self, output: OutputPortID, message: Bytes) -> PortResult<()>;
31    fn recv(&self, input: InputPortID) -> PortResult<Option<Bytes>>;
32    fn try_recv(&self, input: InputPortID) -> PortResult<Option<Bytes>>;
33}
34
35pub trait AsTransport {
36    fn as_transport(&self) -> &dyn Transport;
37}
38
39impl<T: Transport + Sized> AsTransport for T {
40    fn as_transport(&self) -> &dyn Transport {
41        self
42    }
43}