1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
//! # typesec-macro
//!
//! Procedural macros for the typesec ecosystem.
//!
//! ## `#[derive(TypesecRole)]`
//!
//! Derive the [`Role`][typesec_core::role::Role] trait for a struct, pulling
//! permissions and resource patterns from the `#[role(...)]` attribute:
//!
//! ```rust,ignore
//! use typesec_macro::TypesecRole;
//!
//! #[derive(TypesecRole)]
//! #[role(permissions = "read,write", resources = "code/*,infra/*")]
//! pub struct Engineer;
//! ```
//!
//! Expands to:
//!
//! ```rust,ignore
//! impl typesec_core::role::Role for Engineer {
//! fn name() -> &'static str { "engineer" }
//! fn permission_names() -> &'static [&'static str] { &["read", "write"] }
//! fn resource_patterns() -> &'static [&'static str] { &["code/*", "infra/*"] }
//! }
//! ```
//!
//! ## `policy!` macro
//!
//! Inline role definitions without a YAML file:
//!
//! ```rust,ignore
//! use typesec_macro::policy;
//!
//! policy! {
//! role Analyst {
//! can [read, read_sensitive] on ["reports/*", "metrics/*"];
//! }
//! role LeadAnalyst extends Analyst {
//! can [write] on ["reports/drafts/*"];
//! }
//! }
//! ```
//!
//! The macro internals are split across [`shared`] (permission validation and
//! name casing), [`role_derive`] (the derive expansion), and [`policy_dsl`] (the
//! `policy!` parser and codegen).
use TokenStream;
use ;
/// Derive the `typesec_core::role::Role` trait.
///
/// Requires a `#[role(permissions = "...", resources = "...")]` attribute.
/// Inline policy macro.
///
/// ```rust,ignore
/// policy! {
/// role Analyst {
/// can [read, read_sensitive] on ["reports/*"];
/// }
/// role Engineer extends Analyst {
/// can [write, execute] on ["code/*"];
/// }
/// }
/// ```
///
/// Expands each `role X { ... }` block to a struct + `Role` impl.