gin_tonic_core/
macros.rs

1//! a collection of macros to encode/decode data. Mainly used by the derive macros of [gin_tonic_derive](https://docs.rs/gin-tonic-derive/latest/gin_tonic_derive/)
2#[macro_export]
3macro_rules! decode_field {
4    ($prototy:ty, $var:expr, $wire_type:expr, $decoder:expr, $decode_fn:path) => {
5        if <$prototy>::WIRE_TYPE == $wire_type {
6            $var = Some($decode_fn($decoder)?);
7        } else {
8            return Err(DecodeError::UnexpectedWireType(
9                <$prototy>::WIRE_TYPE,
10                $wire_type,
11            ));
12        }
13    };
14}
15
16#[macro_export]
17macro_rules! decode_vector {
18    ($prototy:ty, $vec:expr, $wire_type:expr, $decoder:expr, $decode_fn:path) => {
19        if <$prototy>::WIRE_TYPE == $wire_type {
20            $vec.push($decode_fn($decoder)?);
21        } else if WIRE_TYPE_LENGTH_ENCODED == $wire_type {
22            $decoder.decode_packed($vec, $decode_fn)?;
23        } else {
24            return Err(DecodeError::UnexpectedWireType(
25                <$prototy>::WIRE_TYPE,
26                $wire_type,
27            ));
28        }
29    };
30}
31
32#[macro_export]
33macro_rules! decode_vector_nested {
34    ($vec:expr, $wire_type:expr, $decoder:expr, $decode_fn:path) => {
35        if WIRE_TYPE_LENGTH_ENCODED == $wire_type {
36            $vec.push($decode_fn($decoder)?);
37        } else {
38            return Err(DecodeError::UnexpectedWireType(
39                WIRE_TYPE_LENGTH_ENCODED,
40                $wire_type,
41            ));
42        }
43    };
44}
45
46#[macro_export]
47macro_rules! decode_map {
48    ($var:expr, $wire_type:expr, $decoder:expr, $decode_key_fn:path, $decode_value_fn:path) => {
49        if WIRE_TYPE_LENGTH_ENCODED == $wire_type {
50            if let Some((key, value)) =
51                $decoder.decode_map_element($decode_key_fn, $decode_value_fn)?
52            {
53                $var.insert(key, value);
54            }
55        } else {
56            return Err(DecodeError::UnexpectedWireType(
57                WIRE_TYPE_LENGTH_ENCODED,
58                $wire_type,
59            ));
60        }
61    };
62}
63
64#[macro_export]
65macro_rules! decode_nested {
66    ($var:expr, $wire_type:expr, $decoder:expr, $decode_fn:path) => {
67        if WIRE_TYPE_LENGTH_ENCODED == $wire_type {
68            $var = Some($decode_fn($decoder)?);
69        } else {
70            return Err(DecodeError::UnexpectedWireType(
71                WIRE_TYPE_LENGTH_ENCODED,
72                $wire_type,
73            ));
74        }
75    };
76}
77
78#[macro_export]
79macro_rules! encode_field {
80    ($field_number:expr, $prototy:ty, $var:expr, $encoder:expr, $encode_fn:path) => {
81        $encoder.encode_uint32(u32::from_parts($field_number, <$prototy>::WIRE_TYPE));
82        $encode_fn($encoder, $var);
83    };
84}
85
86#[macro_export]
87macro_rules! encode_vector_packed {
88    ($field_number:expr, $var:expr, $encoder:expr, $encode_fn:path) => {
89        $encoder.encode_uint32(u32::from_parts($field_number, WIRE_TYPE_LENGTH_ENCODED));
90        $encoder.encode_packed($var, $encode_fn, $encode_fn);
91    };
92}
93
94#[macro_export]
95macro_rules! encode_vector_unpacked_clone {
96    ($field_number:expr, $prototy:ty, $var:expr, $encoder:expr, $encode_fn:path) => {
97        for item in $var {
98            $encoder.encode_uint32(u32::from_parts($field_number, <$prototy>::WIRE_TYPE));
99            $encode_fn($encoder, item.clone());
100        }
101    };
102}
103
104#[macro_export]
105macro_rules! encode_vector_unpacked {
106    ($field_number:expr, $prototy:ty, $var:expr, $encoder:expr, $encode_fn:path) => {
107        for item in $var {
108            $encoder.encode_uint32(u32::from_parts($field_number, <$prototy>::WIRE_TYPE));
109            $encode_fn($encoder, item);
110        }
111    };
112}
113
114#[macro_export]
115macro_rules! encode_vector_nested {
116    ($field_number:expr, $var:expr, $encoder:expr, $encode_fn:path) => {
117        for item in $var {
118            $encoder.encode_uint32(u32::from_parts($field_number, WIRE_TYPE_LENGTH_ENCODED));
119            $encode_fn($encoder, item);
120        }
121    };
122}
123
124#[macro_export]
125macro_rules! encode_map {
126    (
127        $field_number:expr,
128        $var:expr,
129        $key_access:path,
130        $value_access:path,
131        $key_wire_type:expr,
132        $value_wire_type:expr,
133        $encoder:expr,
134        $key_encode_fn:path,
135        $value_encode_fn:path,
136    ) => {
137        for (key, value) in $var {
138            $encoder.encode_uint32(u32::from_parts($field_number, WIRE_TYPE_LENGTH_ENCODED));
139            $encoder.encode_map_element(
140                $key_access(key),
141                $value_access(value),
142                $key_wire_type,
143                $value_wire_type,
144                $key_encode_fn,
145                $value_encode_fn,
146                $key_encode_fn,
147                $value_encode_fn,
148            )
149        }
150    };
151}
152
153#[macro_export]
154macro_rules! encode_nested {
155    ($field_number:expr, $var:expr, $encoder:expr, $encode_fn:path) => {
156        $encoder.encode_uint32(u32::from_parts($field_number, WIRE_TYPE_LENGTH_ENCODED));
157        $encode_fn($encoder, $var);
158    };
159}