ptero/method/
complex.rs

1pub mod eluv;
2pub mod extended_line;
3
4/// Macro for implementing the [Encoder](crate::encoder::Encoder) trait for
5/// complex methods. It assumes that method is only composed by other methods.
6///
7/// Requires the method to have `methods` field being vector containing type [Encoder](crate::encoder::Encoder).
8#[macro_export]
9macro_rules! impl_complex_encoder {
10    ($t:ident, $c:ident) => {
11        impl crate::encoder::Encoder<$c> for $t {
12            fn partial_encode(
13                &self,
14                context: &mut $c,
15                data: &mut dyn Iterator<Item = crate::binary::Bit>,
16            ) -> Result<crate::encoder::EncoderResult, Box<dyn std::error::Error>> {
17                let mut is_data_still_available = crate::encoder::EncoderResult::Success;
18                for encoder in &self.methods {
19                    if let crate::encoder::EncoderResult::NoDataLeft =
20                        encoder.partial_encode(context, data)?
21                    {
22                        is_data_still_available = crate::encoder::EncoderResult::NoDataLeft;
23                        break;
24                    }
25                }
26                Ok(is_data_still_available)
27            }
28        }
29
30        impl crate::encoder::Capacity for $t {
31            fn bitrate(&self) -> usize {
32                self.methods
33                    .iter()
34                    .fold(0, |acc, encoder| acc + encoder.bitrate())
35            }
36        }
37    };
38}
39
40/// Macro for implementing the [Decoder](crate::decoder::Decoder) trait for
41/// complex methods. It assumes that method is only composed by other methods.
42///
43/// Requires the method to have `methods` field being vector containing type [Decoder](crate::decoder::Decoder).
44#[macro_export]
45macro_rules! impl_complex_decoder {
46    ($t:ident, $c:ident) => {
47        impl crate::decoder::Decoder<$c> for $t {
48            fn partial_decode(
49                &self,
50                context: &$c,
51            ) -> Result<Vec<crate::binary::Bit>, crate::context::ContextError> {
52                let mut secret_data = Vec::default();
53                for decoder in &self.methods {
54                    let mut result = decoder.partial_decode(context)?;
55                    secret_data.append(&mut result);
56                }
57                Ok(secret_data)
58            }
59        }
60    };
61}