# Rust CLI 工具与序列化（clap + Serde）

学 Rust，迟早要写命令行工具。clap 负责解析参数，Serde 负责数据序列化——这两样几乎出现在每个真实项目里。

## clap：解析命令行参数

`Cargo.toml`：

```toml
[dependencies]
clap = { version = "4", features = ["derive"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
```

用 derive 宏定义参数，写起来像普通结构体：

```rust
use clap::Parser;

#[derive(Parser)]
#[command(name = "greet", about = "一个问候程序")]
struct Args {
    /// 要问候的名字
    name: String,
    /// 重复次数
    #[arg(short, long, default_value_t = 1)]
    count: u32,
}

fn main() {
    let args = Args::parse();
    for _ in 0..args.count {
        println!("你好, {}!", args.name);
    }
}
```

运行：`cargo run -- 小明 -c 3`。`-c`/`--count` 是可选参数，默认 1。

## Serde：JSON 读写

```rust
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug)]
struct Config { host: String, port: u16 }

fn main() {
    let c = Config { host: "localhost".into(), port: 8080 };
    let json = serde_json::to_string(&c).unwrap(); // 序列化
    println!("{}", json);

    let back: Config = serde_json::from_str(&json).unwrap(); // 反序列化
    println!("{:?}", back);
}
```

## 小结

- clap 的 `derive` 模式：定义结构体即定义 CLI 接口，自动生成 `--help`。
- Serde 一套 derive 同时支持 JSON / TOML / YAML 等多种格式。
- 两者组合，能快速做出专业、健壮的命令行应用。

🎉 到这里，你已走完 Rust 从入门到框架实战的完整路线。接下来就是多写、多 `cargo run`，把所有权和 async 变成肌肉记忆。

⬅️ 回到 [学习导航 README](/posts/language/rust-00-guide)

