asn1_rs/asn1_types/tagged/
parser.rs

1use crate::*;
2use core::marker::PhantomData;
3
4#[derive(Debug, PartialEq, Eq)]
5pub struct TaggedParser<'a, TagKind, T, E = Error> {
6    pub header: Header<'a>,
7    pub inner: T,
8
9    pub(crate) tag_kind: PhantomData<TagKind>,
10    pub(crate) _e: PhantomData<E>,
11}
12
13impl<'a, TagKind, T, E> TaggedParser<'a, TagKind, T, E> {
14    pub const fn new(header: Header<'a>, inner: T) -> Self {
15        TaggedParser {
16            header,
17            inner,
18            tag_kind: PhantomData,
19            _e: PhantomData,
20        }
21    }
22
23    pub const fn assert_class(&self, class: Class) -> Result<()> {
24        self.header.assert_class(class)
25    }
26
27    pub const fn assert_tag(&self, tag: Tag) -> Result<()> {
28        self.header.assert_tag(tag)
29    }
30
31    #[inline]
32    pub const fn class(&self) -> Class {
33        self.header.class
34    }
35
36    #[inline]
37    pub const fn tag(&self) -> Tag {
38        self.header.tag
39    }
40}
41
42impl<TagKind, T, E> AsRef<T> for TaggedParser<'_, TagKind, T, E> {
43    fn as_ref(&self) -> &T {
44        &self.inner
45    }
46}
47
48impl<'a, TagKind, T, E> TaggedParser<'a, TagKind, T, E>
49where
50    Self: FromBer<'a, E>,
51    E: From<Error>,
52{
53    pub fn parse_ber(class: Class, tag: Tag, bytes: &'a [u8]) -> ParseResult<'a, Self, E> {
54        let (rem, t) = TaggedParser::<TagKind, T, E>::from_ber(bytes)?;
55        t.assert_class(class).map_err(|e| Err::Error(e.into()))?;
56        t.assert_tag(tag).map_err(|e| Err::Error(e.into()))?;
57        Ok((rem, t))
58    }
59}
60
61impl<'a, TagKind, T, E> TaggedParser<'a, TagKind, T, E>
62where
63    Self: FromDer<'a, E>,
64    E: From<Error>,
65{
66    pub fn parse_der(class: Class, tag: Tag, bytes: &'a [u8]) -> ParseResult<'a, Self, E> {
67        let (rem, t) = TaggedParser::<TagKind, T, E>::from_der(bytes)?;
68        t.assert_class(class).map_err(|e| Err::Error(e.into()))?;
69        t.assert_tag(tag).map_err(|e| Err::Error(e.into()))?;
70        Ok((rem, t))
71    }
72}
73
74impl<TagKind, T, E> DynTagged for TaggedParser<'_, TagKind, T, E> {
75    fn tag(&self) -> Tag {
76        self.tag()
77    }
78}