#![no_std]
use pipecircuit::Switchboard;
use __CRATE___pipes as app_pipes;
pipecircuit::pipe_roster! {
pub mod activation {
client: super::app_pipes::Client,
activator: super::app_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>,
) -> pipecircuit::Route<Self::To<'message>> {
pipecircuit::Route::one({
match from {
From::Client(request) => To::Activator(request),
From::Activator(activation) => To::Client(activation),
}
})
}
}
#[cfg(test)]
mod tests {
use super::*;
use __CRATE___core::{domain_primitives::Activation, state_machines::latch::Activate};
#[test]
fn client_request_reaches_the_authority() {
assert!(matches!(
ActivationProgram.route(From::Client(Activate)),
pipecircuit::Route::One(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)), pipecircuit::Route::One(To::Client(value)) if value == outcome)
);
}
}
}