tpm2_protocol/macro/
enum.rs1#[macro_export]
10macro_rules! tpm_enum {
11 (@impl $(#[$enum_meta:meta])* $vis:vis enum $name:ident($wrapper:ty, $repr:ty) {
12 $(
13 $(#[$variant_meta:meta])*
14 ($variant:ident, $value:expr, $display:literal)
15 ),* $(,)?
16 }) => {
17 $(#[$enum_meta])*
18 #[repr($repr)]
19 $vis enum $name {
20 $(
21 $(#[$variant_meta])*
22 $variant = $value
23 ),*
24 }
25
26 impl TryFrom<$repr> for $name {
27 type Error = $crate::TpmProtocolError;
28
29 fn try_from(value: $repr) -> Result<Self, $crate::TpmProtocolError> {
30 match value {
31 $(
32 _ if value == $value => Ok(Self::$variant),
33 )*
34 _ => Err($crate::TpmProtocolError::VariantNotAvailable),
35 }
36 }
37 }
38
39 impl core::fmt::Display for $name {
40 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
41 let s = match self {
42 $(Self::$variant => $display),*
43 };
44 write!(f, "{}", s)
45 }
46 }
47
48 impl $crate::TpmSized for $name {
49 const SIZE: usize = core::mem::size_of::<$repr>();
50
51 fn len(&self) -> usize {
52 Self::SIZE
53 }
54 }
55
56 impl $crate::TpmMarshal for $name {
57 fn marshal(&self, writer: &mut $crate::TpmWriter) -> $crate::TpmResult<()> {
58 let value = <$wrapper>::from(*self as $repr);
59 $crate::TpmMarshal::marshal(&value, writer)
60 }
61 }
62
63 impl $crate::TpmUnmarshal for $name {
64 fn unmarshal(buf: &[u8]) -> $crate::TpmResult<(Self, &[u8])> {
65 let (val, buf) = <$wrapper as $crate::TpmUnmarshal>::unmarshal(buf)?;
66 let raw: $repr = val.into();
67 let enum_val = Self::try_from(raw)?;
68 Ok((enum_val, buf))
69 }
70 }
71 };
72
73 ($(#[$meta:meta])* $vis:vis enum $name:ident(TpmUint8) { $($rest:tt)* }) => {
74 tpm_enum!(@impl $(#[$meta])* $vis enum $name($crate::basic::TpmUint8, u8) { $($rest)* });
75 };
76 ($(#[$meta:meta])* $vis:vis enum $name:ident(TpmInt8) { $($rest:tt)* }) => {
77 tpm_enum!(@impl $(#[$meta])* $vis enum $name($crate::basic::TpmInt8, i8) { $($rest)* });
78 };
79 ($(#[$meta:meta])* $vis:vis enum $name:ident(TpmUint16) { $($rest:tt)* }) => {
80 tpm_enum!(@impl $(#[$meta])* $vis enum $name($crate::basic::TpmUint16, u16) { $($rest)* });
81 };
82 ($(#[$meta:meta])* $vis:vis enum $name:ident(TpmUint32) { $($rest:tt)* }) => {
83 tpm_enum!(@impl $(#[$meta])* $vis enum $name($crate::basic::TpmUint32, u32) { $($rest)* });
84 };
85 ($(#[$meta:meta])* $vis:vis enum $name:ident(TpmInt32) { $($rest:tt)* }) => {
86 tpm_enum!(@impl $(#[$meta])* $vis enum $name($crate::basic::TpmInt32, i32) { $($rest)* });
87 };
88 ($(#[$meta:meta])* $vis:vis enum $name:ident(TpmUint64) { $($rest:tt)* }) => {
89 tpm_enum!(@impl $(#[$meta])* $vis enum $name($crate::basic::TpmUint64, u64) { $($rest)* });
90 };
91}