secure_gate/macros/dynamic_generic_alias.rs
1/// Creates a generic type alias `Name<T>` for [`Dynamic<T>`](crate::Dynamic).
2///
3/// Useful when you need a single reusable name for heap-allocated secrets of varying types.
4///
5/// *Requires feature `alloc`.*
6///
7/// # Syntax
8///
9/// ```text
10/// dynamic_generic_alias!(pub Name, "doc string"); // public with custom doc
11/// dynamic_generic_alias!(pub(crate) Name); // crate-visible, auto-generated doc
12/// ```
13///
14/// # Examples
15///
16/// ```rust
17/// use secure_gate::{dynamic_generic_alias, RevealSecret};
18///
19/// dynamic_generic_alias!(pub SecureBox, "Generic heap-allocated secret wrapper.");
20///
21/// let key: SecureBox<Vec<u8>> = vec![0u8; 32].into();
22/// key.with_secret(|b| assert_eq!(b.len(), 32));
23/// ```
24///
25/// # Implementation Notes
26///
27/// Macro-generated generic aliases lack runtime size checks. Validate expected
28/// inner types and sizes in unit tests.
29/// As with `dynamic_alias!`, zero-sized or empty inner types are permitted
30/// (no compile-time size check is possible); validate non-zero size in tests.
31#[cfg(feature = "alloc")]
32#[macro_export]
33macro_rules! dynamic_generic_alias {
34 ($vis:vis $name:ident, $doc:literal) => {
35 #[doc = $doc]
36 $vis type $name<T> = $crate::Dynamic<T>;
37 };
38 ($vis:vis $name:ident) => {
39 #[doc = "Generic secure heap wrapper"]
40 $vis type $name<T> = $crate::Dynamic<T>;
41 };
42}