diff src/libpam/memory.rs @ 180:a1bb1d013567

Remove `syn` from the dependency tree by implementing our own num_enum.
author Paul Fisher <paul@pfish.zone>
date Wed, 30 Jul 2025 18:22:16 -0400
parents 634cd5f2ac8b
children
line wrap: on
line diff
--- a/src/libpam/memory.rs	Wed Jul 30 18:07:51 2025 -0400
+++ b/src/libpam/memory.rs	Wed Jul 30 18:22:16 2025 -0400
@@ -9,6 +9,52 @@
 use std::ptr::NonNull;
 use std::{mem, ptr, slice};
 
+/// Like the num_enum crate, but with no dependency on `syn`.
+macro_rules! num_enum {
+    (
+        $(#[$m:meta])*
+        $viz:vis enum $name:ident($repr:ty) {
+            $(
+                $(#[$im:meta])*
+                $item_name:ident = $item_value:path,
+            )*
+        }
+    ) => {
+        $(#[$m])*
+        #[derive(Clone, Copy, Debug, Eq, PartialEq)]
+        #[repr($repr)]
+        $viz enum $name {
+            $(
+                $(#[$im])*
+                $item_name = $item_value,
+            )*
+        }
+
+        impl TryFrom<$repr> for $name {
+            type Error = crate::constants::ErrorCode;
+
+            #[allow(unused_doc_comments)]
+            fn try_from(value: $repr) -> crate::constants::Result<$name> {
+                match value {
+                    $(
+                        $(#[$im])*
+                        $item_value => Ok(Self::$item_name),
+                    )*
+                    _ => Err(crate::constants::ErrorCode::BAD_CONST),
+                }
+            }
+        }
+
+        impl From<$name> for $repr {
+            fn from(value: $name) -> $repr {
+                value as $repr
+            }
+        }
+    }
+}
+
+pub(crate) use num_enum;
+
 /// Allocates `count` elements to hold `T`.
 #[inline]
 pub fn calloc<T>(count: usize) -> NonNull<T> {