hydro2_basic_operators/
tri_to_single_op.rs

1// ---------------- [ File: src/tri_to_single_op.rs ]
2crate::ix!();
3
4// --------------------------------------
5// TriToSingleOp
6// --------------------------------------
7#[derive(NamedItem, Operator, Debug)]
8#[operator(
9    execute="tri_sum",
10    opcode="BasicOpCode::TriToSingleOp",
11    input0="i32",
12    input1="i32",
13    input2="i32",
14    output0="i32"
15)]
16pub struct TriToSingleOp {
17    name: String,
18}
19
20impl TriToSingleOp {
21    pub fn new() -> Self {
22        Self { name: "TriToSingleOp".into() }
23    }
24
25    async fn tri_sum(&self, a: &i32, b: &i32, c: &i32) -> NetResult<i32> {
26        let sum = *a + *b + *c;
27        info!("TriToSingleOp => a={}, b={}, c={} => sum={}", a, b, c, sum);
28        Ok(sum)
29    }
30}
31
32#[cfg(test)]
33mod tri_to_single_op_tests {
34    use super::*;
35
36    #[tokio::test]
37    async fn test_tri_to_single_op_basic() -> Result<(), NetworkError> {
38        let op = TriToSingleOp::new();
39        let i0 = TriToSingleOpIO::Input0(2);
40        let i1 = TriToSingleOpIO::Input1(3);
41        let i2 = TriToSingleOpIO::Input2(4);
42        let input = [Some(&i0), Some(&i1), Some(&i2), None];
43        let mut out = [None,None,None,None];
44        op.execute(input, &mut out).await?;
45        assert_eq!(out[0], Some(TriToSingleOpIO::Output0(9)));
46        Ok(())
47    }
48}