secure_gate/macros/fixed_alias.rs
1/// Creates a type alias for a fixed-size stack-allocated secure secret.
2///
3/// This macro generates a type alias to `Fixed<[u8; N]>` with optional visibility and custom documentation.
4/// The generated type inherits all methods from `Fixed`, including `.expose_secret()`.
5///
6/// # Syntax
7///
8/// - `fixed_alias!(vis Name, size);` — visibility required (e.g., `pub`, `pub(crate)`, or omit for private)
9/// - `fixed_alias!(vis Name, size, doc);` — with optional custom doc string
10///
11/// # Examples
12///
13/// Public alias:
14/// ```
15/// use secure_gate::{fixed_alias, ExposeSecret};
16/// fixed_alias!(pub Aes256Key, 32);
17/// let key: Aes256Key = [42u8; 32].into();
18/// assert_eq!(key.expose_secret(), &[42u8; 32]);
19/// ```
20///
21/// Private alias:
22/// ```
23/// use secure_gate::{fixed_alias, ExposeSecret};
24/// fixed_alias!(private_key, 32); // No visibility modifier = private
25/// let key: private_key = [0u8; 32].into();
26/// assert_eq!(key.expose_secret(), &[0u8; 32]);
27/// ```
28///
29/// With custom visibility:
30/// ```
31/// use secure_gate::fixed_alias;
32/// fixed_alias!(pub(crate) InternalKey, 64); // Crate-visible
33/// ```
34///
35/// With custom documentation:
36/// ```
37/// use secure_gate::{fixed_alias, ExposeSecret};
38/// fixed_alias!(pub ApiKey, 32, "API key for external service");
39/// let key: ApiKey = [0u8; 32].into();
40/// assert_eq!(key.expose_secret(), &[0u8; 32]);
41/// ```
42#[macro_export]
43macro_rules! fixed_alias {
44 ($vis:vis $name:ident, $size:literal, $doc:literal) => {
45 #[doc = $doc]
46 const _: () = { let _ = [(); $size][0]; };
47 $vis type $name = $crate::Fixed<[u8; $size]>;
48 };
49 ($vis:vis $name:ident, $size:literal) => {
50 #[doc = concat!("Fixed-size secure secret (", stringify!($size), " bytes)")]
51 const _: () = { let _ = [(); $size][0]; };
52 $vis type $name = $crate::Fixed<[u8; $size]>;
53 };
54 ($name:ident, $size:literal, $doc:literal) => {
55 #[doc = $doc]
56 const _: () = { let _ = [(); $size][0]; };
57 type $name = $crate::Fixed<[u8; $size]>;
58 };
59 ($name:ident, $size:literal) => {
60 #[doc = concat!("Fixed-size secure secret (", stringify!($size), " bytes)")]
61 const _: () = { let _ = [(); $size][0]; };
62 type $name = $crate::Fixed<[u8; $size]>;
63 };
64}