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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
//! SZ-Rust Macros — 过程宏包
//!
//! 提供 3 个过程宏:
//!
//! | 宏 | 类型 | 对齐 PHP | 实现阶段 |
//! |----|------|---------|---------|
//! | `#[controller]` | 属性宏 | 控制器声明 | Phase 2 |
//! | `#[model]` | 属性宏 | 模型声明 | Phase 2 |
//! | `compact!` | 函数式宏 | `compact()` | Phase 2.6 ✅ |
//!
//! Phase 0.3:骨架实现,属性宏原样透传 TokenStream,`compact!` 生成空 `serde_json::Map`。
//! Phase 2.6:`compact!` 完整实现,对齐 PHP `compact()`。
use TokenStream;
use quote;
use Punctuated;
use ;
/// `#[controller]` 属性宏骨架
///
/// Phase 0.3:原样透传 TokenStream(合法的属性宏最小实现)。
/// Phase 2 将实现:自动实现 `SzController` trait、注册路由、生成 `postData`/`renderJson` 方法。
///
/// # 示例
///
/// ```ignore
/// #[controller]
/// pub struct UserController;
/// ```
/// `#[model]` 属性宏骨架
///
/// Phase 0.3:原样透传 TokenStream(合法的属性宏最小实现)。
/// Phase 2 将实现:自动实现 `BaseModel` trait、生成 `name`/`pk`/`append`/`fillable`/`guarded`/`hidden`。
///
/// # 示例
///
/// ```ignore
/// #[model(table = "sz_user", pk = "user_id")]
/// pub struct User {
/// pub user_id: i64,
/// pub username: String,
/// }
/// ```
/// `compact!` 函数式宏
///
/// 将变量名 → 值按声明顺序插入 `serde_json::Map<String, serde_json::Value>`,
/// 严格对齐 PHP `compact()` 函数行为:
///
/// ## PHP `compact()` 行为
///
/// ```php
/// $code = 1;
/// $msg = "ok";
/// $data = ["id" => 1];
/// return compact('code', 'msg', 'data');
/// // 等价于:['code' => 1, 'msg' => "ok", 'data' => ["id" => 1]]
/// ```
///
/// ## Rust `compact!` 等价
///
/// ```
/// use sz_rust_macros::compact;
/// use serde_json::json;
///
/// let code = 1i32;
/// let msg = "ok".to_string();
/// let data = json!({"id": 1});
/// let result = compact!(code, msg, data);
/// assert_eq!(result.len(), 3);
/// assert_eq!(result["code"], 1);
/// assert_eq!(result["msg"], "ok");
/// assert_eq!(result["data"]["id"], 1);
/// ```
///
/// ## 字段顺序
///
/// 字段顺序严格按宏参数顺序保序(对齐 PHP `compact()` 参数顺序),
/// 依赖 `serde_json::Map` 的 `preserve_order` feature(默认启用)。
///
/// ## 类型转换
///
/// 使用 `serde_json::to_value()` 将变量值转换为 `serde_json::Value`,
/// 支持所有实现 `serde::Serialize` 的类型。
///
/// # 示例
///
/// ```
/// use sz_rust_macros::compact;
///
/// let name = "alice";
/// let age = 30i32;
/// let map = compact!(name, age);
/// assert_eq!(map["name"], "alice");
/// assert_eq!(map["age"], 30);
/// ```