use alloc::format;
use alloc::string::String;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ReceptacleArity {
Simplex,
Multiplex,
}
#[must_use]
pub fn context_method_for_receptacle(
receptacle_name: &str,
interface_type: &str,
arity: ReceptacleArity,
) -> String {
let ami_type = format!("AMI4CCM_{interface_type}");
match arity {
ReceptacleArity::Simplex => {
format!("{ami_type} sendc_{receptacle_name}();")
}
ReceptacleArity::Multiplex => {
format!("sequence<{ami_type}> sendc_{receptacle_name}s();")
}
}
}
#[must_use]
pub fn sequence_typedef_for_interface(interface_type: &str) -> String {
let ami_type = format!("AMI4CCM_{interface_type}");
format!("typedef sequence<{ami_type}> {ami_type}Seq;")
}
#[cfg(test)]
#[allow(clippy::expect_used, clippy::unwrap_used, clippy::panic)]
mod tests {
use super::*;
#[test]
fn simplex_produces_single_method() {
let m = context_method_for_receptacle("manager", "StockManager", ReceptacleArity::Simplex);
assert_eq!(m, "AMI4CCM_StockManager sendc_manager();");
}
#[test]
fn multiplex_produces_sequence_method() {
let m =
context_method_for_receptacle("manager", "StockManager", ReceptacleArity::Multiplex);
assert_eq!(m, "sequence<AMI4CCM_StockManager> sendc_managers();");
}
#[test]
fn typedef_emits_seq_alias() {
let t = sequence_typedef_for_interface("StockManager");
assert_eq!(
t,
"typedef sequence<AMI4CCM_StockManager> AMI4CCM_StockManagerSeq;"
);
}
#[test]
fn arity_variants_are_distinct() {
assert_ne!(ReceptacleArity::Simplex, ReceptacleArity::Multiplex);
}
}