1use crate::buffer::Buffer;
7use paste::paste;
8
9macro_rules! generated_encodings {
10 ($($name:ident),*) => { paste! {
11 use core::fmt::{Debug, Error, Formatter};
12 use core::ops::Deref;
13 mod buffer_type {
14 $(
15 pub struct [<$name Type>] {
16 _priv: (),
17 }
18 )*
19 }
20 $(
21 pub struct $name<'a>(Buffer<'a, buffer_type::[<$name Type>]>);
23
24 impl<'a> Deref for $name<'a> {
25 type Target = Buffer<'a, buffer_type::[<$name Type>]>;
26
27 fn deref(&self) -> &Self::Target {
28 &self.0
29 }
30 }
31
32 impl $name<'static> {
33 #[allow(dead_code)]
34 pub(crate) fn new(owned: Vec<u8>) -> Self {
35 Self(Buffer::new(owned))
36 }
37 #[allow(dead_code)]
38 pub(crate) fn take_from_slice(owned: &mut [u8]) -> Self {
39 Self(Buffer::take_from_slice(owned))
40 }
41 }
42
43 impl Debug for $name<'_> {
44 fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
45 f.debug_struct(stringify!($name)).finish()
46 }
47 }
48
49 impl<'a> From<Buffer<'a, buffer_type::[<$name Type>]>> for $name<'a> {
50 fn from(value: Buffer<'a, buffer_type::[<$name Type>]>) -> Self {
51 Self(value)
52 }
53 }
54 )*
55 }}
56}
57pub(crate) use generated_encodings;
58generated_encodings!(
59 EcPrivateKeyBin,
60 EcPrivateKeyRfc5915Der,
61 EcPublicKeyUncompressedBin,
62 EcPublicKeyCompressedBin,
63 PublicKeyX509Der,
64 Curve25519SeedBin,
65 Pkcs8V1Der,
66 Pkcs8V2Der
67);
68
69pub trait AsDer<T> {
71 fn as_der(&self) -> Result<T, crate::error::Unspecified>;
76}
77
78pub trait AsBigEndian<T> {
80 fn as_be_bytes(&self) -> Result<T, crate::error::Unspecified>;
85}