gmsol_decode/value/
untagged_enum.rs

1/// Implement [`Decode`](crate::Decode) for a list of types.
2#[macro_export]
3macro_rules! untagged {
4    ($name:ident, [$($decoded:ty),+]) => {
5        $crate::paste::paste! {
6            #[doc = "A untagged decodable enum `" $name "`."]
7            #[allow(clippy::large_enum_variant)]
8            #[derive(Debug)]
9            pub enum $name {
10                $(
11                    #[doc = "Variant `" $decoded "`."]
12                    [<$decoded>]($decoded)
13                ),+
14            }
15
16            impl $crate::Decode for $name {
17                #[allow(unused_variables)]
18                fn decode<D: $crate::Decoder>(decoder: D) -> Result<Self, $crate::DecodeError> {
19                    $(
20                        match $decoded::decode(&decoder) {
21                            Ok(decoded) => {
22                                return Ok($name::[<$decoded>](decoded));
23                            },
24                            Err(err) => {
25                                $crate::tracing::trace!(%err, "try variant `{}::{}`, failed", stringify!($name), stringify!($decoded));
26                            }
27                        }
28                    );+
29                    Err($crate::DecodeError::custom("no matching variant found"))
30                }
31            }
32        }
33    };
34}