asn1_rs/
traits.rs

1use core::fmt::Debug;
2
3use crate::{error::*, BerParser};
4use crate::{Class, Explicit, Implicit, TaggedParser};
5
6/// Phantom type representing a BER parser
7// TODO: rename this to `BerMode`?
8#[doc(hidden)]
9#[derive(Debug)]
10pub enum BerMode {}
11
12/// Phantom type representing a DER parser
13#[doc(hidden)]
14#[derive(Debug)]
15pub enum DerMode {}
16
17#[doc(hidden)]
18pub trait ASN1Mode {}
19
20impl ASN1Mode for BerMode {}
21impl ASN1Mode for DerMode {}
22
23/// Helper trait for creating tagged EXPLICIT values
24///
25/// # Examples
26///
27/// ```
28/// use asn1_rs::{AsTaggedExplicit, Class, TaggedParser};
29///
30/// // create a `[1] EXPLICIT INTEGER` value
31/// let tagged: TaggedParser<_, _, _> = 4u32.explicit(Class::ContextSpecific, 1);
32/// ```
33pub trait AsTaggedExplicit<'a, E = Error>: Sized {
34    fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E> {
35        TaggedParser::new_explicit(class, tag, self)
36    }
37}
38
39impl<'a, T, E> AsTaggedExplicit<'a, E> for T where T: BerParser<'a, Error = E> {}
40
41/// Helper trait for creating tagged IMPLICIT values
42///
43/// # Examples
44///
45/// ```
46/// use asn1_rs::{AsTaggedImplicit, Class, TaggedParser};
47///
48/// // create a `[1] IMPLICIT INTEGER` value, not constructed
49/// let tagged: TaggedParser<_, _, _> = 4u32.implicit(Class::ContextSpecific, false, 1);
50/// ```
51pub trait AsTaggedImplicit<'a, E = Error>: Sized {
52    fn implicit(
53        self,
54        class: Class,
55        constructed: bool,
56        tag: u32,
57    ) -> TaggedParser<'a, Implicit, Self, E> {
58        TaggedParser::new_implicit(class, constructed, tag, self)
59    }
60}
61
62impl<'a, T, E> AsTaggedImplicit<'a, E> for T where T: BerParser<'a, Error = E> {}
63
64pub use crate::tostatic::*;