use crate::{InstalledPipe, Pipe, PipeDriver};
pub trait PipeRole {
type Protocol: Pipe;
}
pub trait PipeRoster {
type From<'message>;
type To<'message>;
type Roles;
const PIPE_NAMES: &'static [&'static str];
}
pub trait PipeBinding {
type Protocol: Pipe;
type Driver: PipeDriver<Self::Protocol>;
fn driver_mut(&mut self) -> &mut Self::Driver;
}
impl<P: Pipe, T: PipeDriver<P>> PipeBinding for InstalledPipe<P, T> {
type Protocol = P;
type Driver = T;
fn driver_mut(&mut self) -> &mut T {
self.transport_mut()
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct DeclarationLocation {
pub package: &'static str,
pub file: &'static str,
pub line: u32,
pub column: u32,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct PipeDescription {
pub name: &'static str,
pub documentation: &'static [&'static str],
pub protocol: &'static str,
pub input: &'static str,
pub output: &'static str,
pub declaration: DeclarationLocation,
}
pub trait DescribeRoster: PipeRoster {
fn describe_pipes() -> impl ExactSizeIterator<Item = PipeDescription>;
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct BindingDescription {
pub name: &'static str,
pub documentation: &'static [&'static str],
pub binding: &'static str,
pub driver: &'static str,
pub declaration: DeclarationLocation,
}
pub trait DescribeBindings {
type Roster: DescribeRoster;
fn describe_bindings(&self) -> impl ExactSizeIterator<Item = BindingDescription>;
}