hydro2_basic_operators/
single_channel_passthrough_op.rs

1// ---------------- [ File: src/single_channel_passthrough_op.rs ]
2crate::ix!();
3
4// --------------------------------------
5// SingleChannelPassthroughOperator<T>
6// --------------------------------------
7#[derive(NamedItem, Operator, Debug)]
8#[operator(
9    execute="pass_through",
10    opcode="BasicOpCode::SingleChannelPassthrough",
11    input0="T",
12    output0="T"
13)]
14pub struct SingleChannelPassthroughOperator<T>
15where
16    T: Copy + Debug + Send + Sync
17{
18    name: String,
19    _0:   PhantomData<T>,
20}
21
22impl<T> SingleChannelPassthroughOperator<T>
23where
24    T: Copy + Debug + Send + Sync
25{
26    pub fn with_name(x: impl AsRef<str>) -> Self {
27        Self {
28            name: x.as_ref().to_string(),
29            _0:   Default::default(),
30        }
31    }
32
33    async fn pass_through(&self, val: &T) -> NetResult<T> {
34        info!("SingleChannelPassthrough => pass_through: {:?}", val);
35        Ok(*val)
36    }
37}
38
39impl<T> Default for SingleChannelPassthroughOperator<T>
40where
41    T: Copy + Debug + Send + Sync
42{
43    fn default() -> Self {
44        Self::with_name("single channel passthrough")
45    }
46}
47
48#[cfg(test)]
49mod single_channel_passthrough_operator_tests {
50    use super::*;
51
52    #[tokio::test]
53    async fn test_single_channel_passthrough_noop() -> Result<(), NetworkError> {
54        // This test was originally called “test_no_op_operator_basic”
55        // We'll rename to clarify it's testing pass-through with a certain input
56        let nop = SingleChannelPassthroughOperator::<i32>::with_name("test_noop");
57        assert_eq!(nop.opcode().val(), BasicOpCode::SingleChannelPassthrough.val());
58        assert_eq!(nop.name(), "test_noop");
59        assert_eq!(nop.input_count(), 1);
60        assert_eq!(nop.output_count(), 1);
61
62        // Instead of passing &123_i32, we must pass &<IO>::Input0(123)
63        let input_val = SingleChannelPassthroughOperatorIO::<i32>::Input0(123);
64        let input = [Some(&input_val), None, None, None];
65        let mut out = [None,None,None,None];
66
67        nop.execute(input, &mut out).await?;
68        // The operator passes input straight to Output0
69        assert_eq!(out[0], Some(SingleChannelPassthroughOperatorIO::Output0(123)));
70        Ok(())
71    }
72
73    #[tokio::test]
74    async fn test_single_channel_passthrough_basic() -> Result<(), NetworkError> {
75        let op = SingleChannelPassthroughOperator::<i32>::with_name("PassX");
76        let input = [Some(&SingleChannelPassthroughOperatorIO::Input0(123)), None, None, None];
77        let mut out = [None,None,None,None];
78
79        op.execute(input, &mut out).await?;
80        assert_eq!(out[0], Some(SingleChannelPassthroughOperatorIO::Output0(123)));
81        Ok(())
82    }
83
84    #[tokio::test]
85    async fn test_single_channel_passthrough_zero() -> Result<(), NetworkError> {
86        let op = SingleChannelPassthroughOperator::<i32>::with_name("PassX");
87        let input = [Some(&SingleChannelPassthroughOperatorIO::Input0(0)), None, None, None];
88        let mut out = [None,None,None,None];
89        op.execute(input, &mut out).await?;
90        assert_eq!(out[0], Some(SingleChannelPassthroughOperatorIO::Output0(0)));
91        Ok(())
92    }
93}