app_macro_usage/
app_macro_usage.rs

1//! app! 宏使用示例
2//!
3//! 这个文件展示了如何使用 app! 宏来简化应用程序的创建和配置
4
5use pipeline_script::app;
6use pipeline_script::plugin::builtin::BuiltinPlugin;
7use pipeline_script::plugin::format_string::FormatStringPlugin;
8use pipeline_script::plugin::map::MapPlugin;
9use pipeline_script::plugin::math::MathPlugin;
10
11/// 基本使用示例 - 创建一个简单的应用程序
12fn basic_usage_example() {
13    println!("=== 基本使用示例 ===");
14
15    // 使用 app! 宏创建应用程序,指定入口文件和插件
16    let mut my_app = app!("main.ppl", [BuiltinPlugin, MathPlugin]);
17
18    // 运行应用程序
19    // my_app.run(); // 注释掉避免实际执行
20
21    println!("应用程序创建成功:入口文件 'main.ppl',插件:BuiltinPlugin, MathPlugin");
22}
23
24/// 链式调用示例 - 结合其他配置方法
25fn chaining_example() {
26    println!("\n=== 链式调用示例 ===");
27
28    // 使用 app! 宏创建应用程序,然后链式调用其他配置方法
29    let _configured_app = app!(
30        "complex.ppl",
31        [BuiltinPlugin, FormatStringPlugin, MathPlugin, MapPlugin]
32    )
33    .set_test_llvm(true)
34    .add_test_llvm_file("test.ll");
35
36    // .run(); // 注释掉避免实际执行
37
38    println!("配置完成的应用程序:");
39    println!("  - 入口文件: 'complex.ppl'");
40    println!("  - 插件: BuiltinPlugin, FormatStringPlugin, MathPlugin, MapPlugin");
41    println!("  - LLVM测试: 已启用");
42    println!("  - 测试文件: 'test.ll'");
43}
44
45/// 空插件列表示例
46fn empty_plugins_example() {
47    println!("\n=== 空插件列表示例 ===");
48
49    // 创建不包含任何插件的应用程序
50    let _minimal_app = app!("minimal.ppl", []);
51
52    println!("最小应用程序创建成功:入口文件 'minimal.ppl',无插件");
53}
54
55/// 使用变量作为参数的示例
56fn variable_parameters_example() {
57    println!("\n=== 变量参数示例 ===");
58
59    let entry_file = "dynamic.ppl";
60    let _dynamic_app = app!(entry_file, [BuiltinPlugin]);
61
62    println!("动态参数应用程序创建成功:入口文件 '{}'", entry_file);
63}
64
65/// 插件列表末尾带逗号的示例
66fn trailing_comma_example() {
67    println!("\n=== 插件列表末尾逗号示例 ===");
68
69    // 插件列表末尾可以有逗号(可选)
70    let _app_with_comma = app!(
71        "trailing.ppl",
72        [
73            BuiltinPlugin,
74            MathPlugin,
75            FormatStringPlugin, // 末尾逗号是允许的
76        ]
77    );
78
79    println!("带末尾逗号的应用程序创建成功");
80}
81
82/// 与传统方式的对比示例
83fn comparison_example() {
84    println!("\n=== 传统方式 vs app! 宏对比 ===");
85
86    println!("传统方式(较冗长):");
87    println!("App::new()");
88    println!("    .set_entry_file(\"main.ppl\")");
89    println!("    .add_plugin(BuiltinPlugin)");
90    println!("    .add_plugin(MathPlugin)");
91    println!("    .add_plugin(FormatStringPlugin)");
92    println!("    .run();");
93
94    println!("\n使用 app! 宏(简洁):");
95    println!("app!(\"main.ppl\", [BuiltinPlugin, MathPlugin, FormatStringPlugin])");
96    println!("    .run();");
97
98    // 实际创建两个等效的应用程序进行对比
99    use pipeline_script::core::app::App;
100
101    // 传统方式
102    let _traditional_app = App::new()
103        .set_entry_file("compare.ppl")
104        .add_plugin(BuiltinPlugin)
105        .add_plugin(MathPlugin);
106
107    // 使用宏
108    let _macro_app = app!("compare.ppl", [BuiltinPlugin, MathPlugin]);
109
110    println!("\n两种方式创建的应用程序功能完全相同!");
111}
112
113fn main() {
114    println!("Pipeline Script app! 宏使用示例");
115    println!("==================================");
116
117    basic_usage_example();
118    chaining_example();
119    empty_plugins_example();
120    variable_parameters_example();
121    trailing_comma_example();
122    comparison_example();
123
124    println!("\n所有示例执行完成!");
125}
126
127#[cfg(test)]
128mod tests {
129    use super::*;
130
131    /// 测试所有示例函数可以正常调用
132    #[test]
133    fn test_all_examples() {
134        // 这些函数应该能够正常执行而不出现恐慌
135        basic_usage_example();
136        chaining_example();
137        empty_plugins_example();
138        variable_parameters_example();
139        trailing_comma_example();
140        comparison_example();
141    }
142
143    /// 测试宏生成的应用程序类型正确
144    #[test]
145    fn test_macro_return_type() {
146        use pipeline_script::core::app::App;
147
148        let app: App = app!("test.ppl", [BuiltinPlugin]);
149        // 如果类型不匹配,这里会编译失败
150        drop(app);
151    }
152}