#![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)
);
}
}
}