vacro_trace_macro/
lib.rs

1use proc_macro::TokenStream;
2use vacro_doc_i18n::doc_i18n;
3pub(crate) mod impls;
4pub(crate) mod utils;
5
6#[proc_macro]
7#[doc_i18n]
8/// <div class="doc-cn"> 捕获 TokenStream 快照。</div>
9/// <div class="doc-en"> Capture a TokenStream snapshot. </div>
10///
11/// <div class="doc-cn">
12///
13/// 将当前的 Token 状态记录下来,以便在 `vacro-cli` 中查看。
14/// 如果使用相同的 tag 调用多次,会自动展示 Diff。
15///
16/// 用法:`snapshot!("tag", tokens)`
17/// </div>
18///
19/// <div class="doc-en">
20///
21/// Records the current token state for inspection in `vacro-cli`.
22/// If called multiple times with the same tag, it will automatically show a Diff.
23///
24/// Usage: `snapshot!("tag", tokens)`
25/// </div>
26pub fn snapshot(input: TokenStream) -> TokenStream {
27    impls::snapshot::snapshot_impl(input.into())
28        .unwrap_or_else(|e| e.to_compile_error())
29        .into()
30}
31
32#[proc_macro]
33#[doc_i18n]
34/// <div class="doc-cn"> 通用日志宏。</div>
35/// <div class="doc-en"> Generic log macro. </div>
36///
37/// <div class="doc-cn">
38///
39/// 记录一条指定级别的日志消息。
40/// </div>
41///
42/// <div class="doc-cn">
43///
44/// Logs a message at the specified level.
45/// </div>
46pub fn log(input: TokenStream) -> TokenStream {
47    impls::log::log_impl(input.into())
48        .unwrap_or_else(|e| e.to_compile_error())
49        .into()
50}
51
52#[proc_macro]
53#[doc_i18n]
54/// <div class="doc-cn"> 记录错误 (Error) 级别的日志。 </div>
55/// <div class="doc-en"> Logs an Error level message. </div>
56pub fn error(input: TokenStream) -> TokenStream {
57    impls::log::shortcut_impl("Error", input.into())
58        .unwrap_or_else(|e| e.to_compile_error())
59        .into()
60}
61
62#[proc_macro]
63#[doc_i18n]
64/// <div class="doc-cn"> 记录警告 (Warn) 级别的日志。 </div>
65/// <div class="doc-en"> Logs a Warn level message. </div>
66pub fn warn(input: TokenStream) -> TokenStream {
67    impls::log::shortcut_impl("Warn", input.into())
68        .unwrap_or_else(|e| e.to_compile_error())
69        .into()
70}
71
72#[proc_macro]
73#[doc_i18n]
74/// <div class="doc-cn"> 记录信息 (Info) 级别的日志。 </div>
75/// <div class="doc-en"> Logs an Info level message. </div>
76pub fn info(input: TokenStream) -> TokenStream {
77    impls::log::shortcut_impl("Info", input.into())
78        .unwrap_or_else(|e| e.to_compile_error())
79        .into()
80}
81
82#[proc_macro]
83#[doc_i18n]
84/// <div class="doc-cn"> 记录调试 (Debug) 级别的日志。 </div>
85/// <div class="doc-en"> Logs a Debug level message. </div>
86pub fn debug(input: TokenStream) -> TokenStream {
87    impls::log::shortcut_impl("Debug", input.into())
88        .unwrap_or_else(|e| e.to_compile_error())
89        .into()
90}
91
92#[proc_macro]
93#[doc_i18n]
94/// <div class="doc-cn"> 记录追踪 (Trace) 级别的日志。 </div>
95/// <div class="doc-en"> Logs a Trace level message. </div>
96pub fn trace(input: TokenStream) -> TokenStream {
97    impls::log::shortcut_impl("Trace", input.into())
98        .unwrap_or_else(|e| e.to_compile_error())
99        .into()
100}
101
102#[proc_macro_attribute]
103#[doc_i18n]
104/// <div class="doc-cn"> 函数仪表化属性。</div>
105/// <div class="doc-en"> Function instrumentation attribute. </div>
106///
107/// <div class="doc-cn">
108///
109/// 自动追踪函数的进入和退出,并记录参数信息。
110/// </div>
111/// <div class="doc-en">
112///
113/// Automatically traces function entry and exit, and logs argument information.
114/// </div>
115pub fn instrument(attr: TokenStream, input: TokenStream) -> TokenStream {
116    impls::instrument::instrument_impl(attr.into(), input.into())
117        .unwrap_or_else(|e| e.to_compile_error())
118        .into()
119}