asn1_rs/asn1_types/tagged/
parser.rs1use 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}