pipecircuit 0.0.10

Correct. Robust. Fast. Portable.
Documentation
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);
    }
}