hydro2_basic_operators/
split_and_double_op.rs

1// ---------------- [ File: src/split_and_double_op.rs ]
2crate::ix!();
3
4// --------------------------------------
5// SplitAndDoubleOp
6// --------------------------------------
7#[derive(NamedItem, Operator, Debug)]
8#[operator(
9    execute="split_and_double",
10    opcode="BasicOpCode::SplitAndDoubleOp",
11    input0="i32",
12    output0="i32",
13    output1="i32"
14)]
15pub struct SplitAndDoubleOp {
16    name: String,
17}
18
19impl Default for SplitAndDoubleOp {
20    fn default() -> Self {
21        Self { name: "SplitAndDoubleOp".into() }
22    }
23}
24
25impl SplitAndDoubleOp {
26
27    async fn split_and_double(&self, val: &i32) -> NetResult<(i32,i32)> {
28        let out0 = *val;
29        let out1 = *val * 2;
30        Ok((out0, out1))
31    }
32}
33
34#[cfg(test)]
35mod split_and_double_op_tests {
36    use super::*;
37
38    #[tokio::test]
39    async fn test_split_and_double() -> Result<(), NetworkError> {
40        let op = SplitAndDoubleOp::default();
41        let i0 = SplitAndDoubleOpIO::Input0(10);
42        let input = [Some(&i0), None, None, None];
43        let mut out = [None, None, None, None];
44        op.execute(input, &mut out).await?;
45
46        assert_eq!(out[0], Some(SplitAndDoubleOpIO::Output0(10)));
47        assert_eq!(out[1], Some(SplitAndDoubleOpIO::Output1(20)));
48        Ok(())
49    }
50}