A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://docs.rs/asn1-rs/0.7.1/x86_64-unknown-linux-gnu/src/asn1_rs/traits.rs.html below:

traits.rs - source

1use crate::debug::{trace, trace_generic};
2use crate::error::*;
3use crate::{parse_der_any, Any, Class, Explicit, Implicit, Tag, TaggedParser};
4use core::convert::{TryFrom, TryInto};
5use core::fmt::{Debug, Display};
6#[cfg(feature = "std")]
7use std::io::Write;
8
9#[doc(hidden)]
11#[derive(Debug)]
12pub enum BerParser {}
13
14#[doc(hidden)]
16#[derive(Debug)]
17pub enum DerParser {}
18
19#[doc(hidden)]
20pub trait ASN1Parser {}
21
22impl ASN1Parser for BerParser {}
23impl ASN1Parser for DerParser {}
24
25pub trait Tagged {
26    const TAG: Tag;
27}
28
29impl<T> Tagged for &'_ T
30where
31    T: Tagged,
32{
33    const TAG: Tag = T::TAG;
34}
35
36pub trait DynTagged {
37    fn tag(&self) -> Tag;
38}
39
40impl<T> DynTagged for T
41where
42    T: Tagged,
43{
44    fn tag(&self) -> Tag {
45        T::TAG
46    }
47}
48
49pub trait FromBer<'a, E = Error>: Sized {
87    fn from_ber(bytes: &'a [u8]) -> ParseResult<'a, Self, E>;
89}
90
91impl<'a, T, E> FromBer<'a, E> for T
92where
93    T: TryFrom<Any<'a>, Error = E>,
94    E: From<Error>,
95{
96    fn from_ber(bytes: &'a [u8]) -> ParseResult<'a, T, E> {
97        let (i, any) = Any::from_ber(bytes).map_err(nom::Err::convert)?;
98        let result = any.try_into().map_err(nom::Err::Error)?;
99        Ok((i, result))
100    }
101}
102
103pub trait FromDer<'a, E = Error>: Sized {
156    fn from_der(bytes: &'a [u8]) -> ParseResult<'a, Self, E>;
158}
159
160pub trait DerAutoDerive {}
177
178impl<'a, T, E> FromDer<'a, E> for T
179where
180    T: TryFrom<Any<'a>, Error = E>,
181    T: CheckDerConstraints,
182    T: DerAutoDerive,
183    E: From<Error> + Display + Debug,
184{
185    fn from_der(bytes: &'a [u8]) -> ParseResult<'a, T, E> {
186        trace_generic(
187            core::any::type_name::<T>(),
188            "T::from_der",
189            |bytes| {
190                let (i, any) = trace(core::any::type_name::<T>(), parse_der_any, bytes)
191                    .map_err(nom::Err::convert)?;
192                <T as CheckDerConstraints>::check_constraints(&any)
193                    .map_err(|e| nom::Err::Error(e.into()))?;
194                let result = any.try_into().map_err(nom::Err::Error)?;
195                Ok((i, result))
196            },
197            bytes,
198        )
199    }
200}
201
202pub trait CheckDerConstraints {
204    fn check_constraints(any: &Any) -> Result<()>;
205}
206
207#[cfg(feature = "std")]
236pub trait ToDer
237where
238    Self: DynTagged,
239{
240    fn to_der_len(&self) -> Result<usize>;
245
246    fn to_der_vec(&self) -> SerializeResult<Vec<u8>> {
248        let mut v = Vec::new();
249        let _ = self.write_der(&mut v)?;
250        Ok(v)
251    }
252
253    fn to_der_vec_raw(&self) -> SerializeResult<Vec<u8>> {
256        let mut v = Vec::new();
257        let _ = self.write_der_raw(&mut v)?;
258        Ok(v)
259    }
260
261    fn write_der(&self, writer: &mut dyn Write) -> SerializeResult<usize> {
276        let sz = self.write_der_header(writer)?;
277        let sz = sz + self.write_der_content(writer)?;
278        Ok(sz)
279    }
280
281    fn write_der_header(&self, writer: &mut dyn Write) -> SerializeResult<usize>;
283
284    fn write_der_content(&self, writer: &mut dyn Write) -> SerializeResult<usize>;
286
287    fn write_der_raw(&self, writer: &mut dyn Write) -> SerializeResult<usize> {
290        self.write_der(writer)
291    }
292}
293
294#[cfg(feature = "std")]
295impl<'a, T> ToDer for &'a T
296where
297    T: ToDer,
298    &'a T: DynTagged,
299{
300    fn to_der_len(&self) -> Result<usize> {
301        (*self).to_der_len()
302    }
303
304    fn write_der_header(&self, writer: &mut dyn Write) -> SerializeResult<usize> {
305        (*self).write_der_header(writer)
306    }
307
308    fn write_der_content(&self, writer: &mut dyn Write) -> SerializeResult<usize> {
309        (*self).write_der_content(writer)
310    }
311}
312
313pub trait AsTaggedExplicit<'a, E = Error>: Sized {
324    fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E> {
325        TaggedParser::new_explicit(class, tag, self)
326    }
327}
328
329impl<'a, T, E> AsTaggedExplicit<'a, E> for T where T: Sized + 'a {}
330
331pub trait AsTaggedImplicit<'a, E = Error>: Sized {
342    fn implicit(
343        self,
344        class: Class,
345        constructed: bool,
346        tag: u32,
347    ) -> TaggedParser<'a, Implicit, Self, E> {
348        TaggedParser::new_implicit(class, constructed, tag, self)
349    }
350}
351
352impl<'a, T, E> AsTaggedImplicit<'a, E> for T where T: Sized + 'a {}
353
354pub use crate::tostatic::*;

RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4