Mercurial > crates > nonstick
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> {