| //! ASN.1 `CHOICE` support. |
| |
| use crate::{Decode, FixedTag, Tag, Tagged}; |
| |
| /// ASN.1 `CHOICE` denotes a union of one or more possible alternatives. |
| /// |
| /// The types MUST have distinct tags. |
| /// |
| /// This crate models choice as a trait, with a blanket impl for all types |
| /// which impl `Decode + FixedTag` (i.e. they are modeled as a `CHOICE` |
| /// with only one possible variant) |
| pub trait Choice<'a>: Decode<'a> + Tagged { |
| /// Is the provided [`Tag`] decodable as a variant of this `CHOICE`? |
| fn can_decode(tag: Tag) -> bool; |
| } |
| |
| /// This blanket impl allows any [`Tagged`] type to function as a [`Choice`] |
| /// with a single alternative. |
| impl<'a, T> Choice<'a> for T |
| where |
| T: Decode<'a> + FixedTag, |
| { |
| fn can_decode(tag: Tag) -> bool { |
| T::TAG == tag |
| } |
| } |