use crate::Switchboard;
pub trait WiringDraft {
type Switchboard: Switchboard;
fn switchboard(&self) -> &Self::Switchboard;
fn switchboard_mut(&mut self) -> &mut Self::Switchboard;
}
pub struct PipecircuitDraft<InstalledWiring: WiringDraft> {
wiring: InstalledWiring,
}
impl<InstalledWiring: WiringDraft> PipecircuitDraft<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::{NoInput, NoOutput};
#[derive(Debug, Eq, PartialEq)]
struct FabricSwitchboard;
impl Switchboard for FabricSwitchboard {
type From<'message> = NoInput;
type To<'message> = NoOutput;
fn route<'message>(&mut self, input: Self::From<'message>) -> Self::To<'message> {
match input {}
}
}
struct ProgramWiring {
switchboard: FabricSwitchboard,
}
impl super::WiringDraft 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 = PipecircuitDraft::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);
}
}