From b1ac9fb8ed90699474e911674f1a60b139563858 Mon Sep 17 00:00:00 2001
From: 魏曹先生 <1992414357@qq.com>
Date: Wed, 27 May 2026 12:48:54 +0800
Subject: Add Chinese tutorial for Step 1 of Mingling framework
---
docs/_zh_CN/pages/1-intro.md | 68 +++++++++++++++++++++
docs/_zh_CN/pages/2-step1.md | 140 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 208 insertions(+)
create mode 100644 docs/_zh_CN/pages/1-intro.md
create mode 100644 docs/_zh_CN/pages/2-step1.md
(limited to 'docs/_zh_CN/pages')
diff --git a/docs/_zh_CN/pages/1-intro.md b/docs/_zh_CN/pages/1-intro.md
new file mode 100644
index 0000000..4e3106c
--- /dev/null
+++ b/docs/_zh_CN/pages/1-intro.md
@@ -0,0 +1,68 @@
+
介绍
+
+ Mingling 能做什么?
+
+
+## 前言
+
+ 首先,非常感谢您愿意尝试和体验 **Mingling**
+
+ 因为这是一个早期框架,所以尚不成熟。
+
+ 若您在使用过程中遇到任何问题,欢迎提交 [Issue](https://github.com/catilgrass/mingling/issues),我们乐意解决。
+
+
+
+
+
+
+ A Rust CLI framework for many subcmds & complex workflows, reduces boilerplate via proc macros, focus on biz logic
+
+
+
+
+## Mingling 是什么?
+
+ **Mingling** 是一款 Rust 命令行开发框架,更准确地说,它是一款在调度、执行、渲染等方面提供高度抽象的框架。
+
+ 它的核心逻辑是 **"转换"** —— 您输入的命令行参数(`Vec`)会经过一系列的类型转换,最终变成您想要的结果。用一张图来说明:
+
+
+
+
+
+ **这意味着**,您的执行逻辑和渲染逻辑是完全分离的:所有的状态、数据和结构都是类型,它们都只是转换过程中的一个环节,清晰又灵活。
+
+## 它适合什么样的项目?
+
+ 如果您正在开发一个**子命令多、嵌套层次深、横切关注点多**,并且对**执行效率和动态补全**有要求的命令行工具,那么 **Mingling** 会是一个很好的选择。
+
+ 这些能力得益于它高度抽象的宏系统,以及几乎全部在编译期完成的构建逻辑,让您在运行时能获得出色的性能。
+
+## Mingling 能做些什么?
+
+ **Mingling** 专注于命令行流程的调度与编排,为您提供以下能力:
+
+ 1. **核心调度** — 通过类型转换优雅地编排业务逻辑
+ 2. **纯函数设计** — 所有行为都是纯函数,可以直接测试
+ 3. **无限嵌套** — 支持无限嵌套的子命令系统,再复杂的结构也能驾驭
+ 4. **动态补全** — 为任意子命令插入完全动态的补全逻辑 **\[`comp`\]**
+ 5. **帮助文档** — 为任意子命令插入帮助文档,让用户轻松上手
+
+## Mingling 不做些什么?
+
+ **Mingling** 专注于命令行**流程的调度与编排**,因此它不会提供以下功能(您可以自由搭配其他库来实现):
+
+ 1. ❌ 彩色文字、进度条等外观功能
+ 2. ❌ 国际化、本地化功能
+ 3. ❌ TUI 界面功能
+
+
+ Written by @Weicao-CatilGrass
+
diff --git a/docs/_zh_CN/pages/2-step1.md b/docs/_zh_CN/pages/2-step1.md
new file mode 100644
index 0000000..56f4b3c
--- /dev/null
+++ b/docs/_zh_CN/pages/2-step1.md
@@ -0,0 +1,140 @@
+初次上手!
+
+ 使用 Mingling 开发简易水果名搜索命令行程序
+
+
+## 前言
+
+在本篇示例中,我将介绍如何使用 **Mingling** 开发基本的命令行程序,它包括:
+
+1. `fruit-mgr list` 命令
+2. `fruit-mgr list --help` 帮助页面
+
+
+
+## 一、导入依赖
+
+首先,请确保您的项目依赖 **Mingling**
+
+若未导入依赖,您可以在 `Cargo.toml` 添加如下内容:
+
+```toml
+[dependencies.mingling]
+version = "0.1.9"
+features = [""]
+```
+
+## 二、编写 `main.rs`,创建基本的项目
+
+在 `src/main.rs` 中,我们将编写程序的入口函数:
+
+
+
+## 三、注册 `list` 子命令
+
+
+
+## 四、实现 `EntryList` 行为
+
+
+
+
+ Written by @Weicao-CatilGrass
+
+
+## 五、渲染 `ResultFruits`
+
+在上一步中,`handle_entry_list` 链接收 `EntryList`,并输出了 `ResultFruits`。
+
+接下来我们就要为 `ResultFruits` 渲染出最终的结果,使整个程序像下图这样排列:
+
+
+
+
+
+让我们开始编写代码吧:
+
+
+
+### 💡 关于 `r_println!` 宏
+
+`r_println!` 宏并不是对 `println!` 的包装
+
+它是为 `#[renderer]` 宏中 **隐式注入** 的 `&mut RenderResult` 值提供。
+
+在 `r_println!` 调用时,不会立刻向 stdout 输出信息,而是会被累计到 `&mut RenderResult` 中,在程序结束时整体输出。
+
+
+## 六、编译并运行
+
+现在您已经完成了 `list` 命令,现在可以使用 `cargo run` 运行您的程序:
+
+```bash
+cargo run -- list
+```
+
+您将会看到如下输出:
+
+```
+Apple
+Banana
+Orange
+```
+
+
+完整代码
+
+```rust
+use mingling::prelude::*;
+
+dispatcher!("list", CMDList => EntryList);
+
+fn main() {
+ let mut program = ThisProgram::new();
+ program.with_dispatcher(CMDList);
+ program.exec_and_exit();
+}
+
+pack!(ResultFruits = Vec);
+
+#[chain]
+fn handle_entry_list(_prev: EntryList) -> Next {
+ let fruits = vec![
+ "Apple".to_string(),
+ "Banana".to_string(),
+ "Orange".to_string(),
+ ];
+ ResultFruits::new(fruits)
+}
+
+#[renderer]
+fn render_fruits(result: ResultFruits) {
+ let vec: &Vec = &*result;
+ for fruit in vec {
+ r_println!("{}", fruit)
+ }
+}
+
+gen_program!();
+
+```
+
+
+
+ Written by @Weicao-CatilGrass
+
--
cgit