pipecircuit-cli 0.0.7

Command-line architectural tools for Pipecircuit programs
#![no_std]

use pipecircuit::Switchboard;

use __CRATE___core as app_core;

pipecircuit::pipe_roster! {
    pub mod activation {
        client: super::app_core::pipes::Client,
        activator: super::app_core::pipes::Activator,
    }
}
pub use activation::{From, To};

pub struct ActivationProgram;
impl Switchboard for ActivationProgram {
    type From<'message> = From<'message>;
    type To<'message> = To<'message>;

    fn route<'message>(&mut self, from: Self::From<'message>) -> Self::To<'message> {
        match from {
            From::Client(input) => To::Activator(input),
            From::Activator(output) => To::Client(output),
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use app_core::{domain_primitives::Activation, state_machines::latch::Activate};

    #[test]
    fn client_request_reaches_the_authority() {
        assert!(matches!(
            ActivationProgram.route(From::Client(Activate)),
            To::Activator(Activate)
        ));
    }

    #[test]
    fn every_authority_outcome_reaches_the_client() {
        for outcome in [Activation::Activated, Activation::AlreadyActive] {
            assert!(
                matches!(ActivationProgram.route(From::Activator(outcome)), To::Client(value) if value == outcome)
            );
        }
    }
}