use crate::{NoInput, NoOutput, Switchboard};
pub trait Wiring {
type Switchboard: for<'message> Switchboard<BoundaryIn<'message> = NoInput, BoundaryOut<'message> = NoOutput>;
fn switchboard(&self) -> &Self::Switchboard;
fn switchboard_mut(&mut self) -> &mut Self::Switchboard;
}
pub struct Pipecircuit<InstalledWiring: Wiring> {
wiring: InstalledWiring,
}
impl<InstalledWiring: Wiring> Pipecircuit<InstalledWiring> {
pub const fn new(wiring: InstalledWiring) -> Self {
Self { wiring }
}
pub const fn wiring(&self) -> &InstalledWiring {
&self.wiring
}
pub const fn wiring_mut(&mut self) -> &mut InstalledWiring {
&mut self.wiring
}
pub fn into_wiring(self) -> InstalledWiring {
self.wiring
}
pub fn switchboard(&self) -> &InstalledWiring::Switchboard {
self.wiring.switchboard()
}
pub fn switchboard_mut(&mut self) -> &mut InstalledWiring::Switchboard {
self.wiring.switchboard_mut()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{Participant, StateMachine};
#[derive(Debug, Eq, PartialEq)]
struct FabricSwitchboard;
impl StateMachine for FabricSwitchboard {}
impl Participant for FabricSwitchboard {
type In<'message> = u8;
type Out<'message> = u16;
}
impl Switchboard for FabricSwitchboard {
type BoundaryIn<'message> = NoInput;
type BoundaryOut<'message> = NoOutput;
fn route<'message>(&mut self, input: Self::In<'message>) -> Self::Out<'message> {
u16::from(input)
}
}
struct ProgramWiring {
switchboard: FabricSwitchboard,
}
impl super::Wiring for ProgramWiring {
type Switchboard = FabricSwitchboard;
fn switchboard(&self) -> &Self::Switchboard {
&self.switchboard
}
fn switchboard_mut(&mut self) -> &mut Self::Switchboard {
&mut self.switchboard
}
}
#[test]
fn a_pipecircuit_owns_its_wiring_and_one_fabric_switchboard() {
let mut program = Pipecircuit::new(ProgramWiring {
switchboard: FabricSwitchboard,
});
assert_eq!(program.switchboard(), &FabricSwitchboard);
assert_eq!(*program.switchboard_mut(), FabricSwitchboard);
assert_eq!(program.wiring().switchboard, FabricSwitchboard);
assert_eq!(program.wiring_mut().switchboard, FabricSwitchboard);
assert_eq!(program.into_wiring().switchboard, FabricSwitchboard);
}
}