likes
comments
collection
share

Rust 写一个简易 CLI 小工具

作者站长头像
站长
· 阅读数 52

Rust 写一个简易 CLI 小工具

关于学习了 Rust 一些基础语法,想写一个 demo 来巩固一下基础的语法知识,想到了可以写一个 CLI 小工具。

大致思路

  1. cli 工具如执行 cli --help 可以打印出命令、参数帮助。
  2. cli 工具的参数可能不止一个 如 cli --hi NAME,打印的结果应该是 hi 你的名字

这就是一个简单的 cli 工具的实现,我们会且仅用到标准库,如果觉得功能不够,可以自行添加,如 执行一个命令 可以往 Windows 的 HOST 添加内容,就需要用到 Rust 的 I/O。

开始实现

  1. 导包

首先我们导入标准库,我们会用到 std::env 下的 Args 结构体,它是 进程参数的迭代器,为每个参数产生 String 值。

use std::env;

fn main() {

}
  1. 定义 Help 内容
let help: &str = r#"
  cli 
      --help 帮助,查看所有参数。
      --version 查看版本。
      --hi NAME 向你打招呼。
"#

// 这里我们使用 r#""# 不仅方便更巩固 Rust 字符串相关的知识点。
  1. 程序参数迭代器的使用
let args: Vec<String> = env::args().collect();

此处我们声明一个名为 agrs ,值为String类型的向量,因为迭代器返回的是一串 String 类型的内容。

.collect() 方法就是去收集这些参数。

  1. 开始匹配参数
for arg: &String in args.iter() {
  match arg.as_str() {
    "--help" => {
      println!("{}", help);
      return;
    },
    "--version" => {
      println!("当前 cli 版本:{}", env!("CARGO_PKG_VERSION"));
      return;
    },
    _ => {
      //
    }
  }
}

println!("未能识别的参数!可以输入 `cli --help` 获取帮助。")

我们来逐一分析一下,

  • for arg: &String in args.iter() ,定义一个 for 循环。
  • match arg.as_str() 让我们 for 循环的 arg 参数开始逐一匹配一下内容,如果是 --help 就打印我们的帮助信息。
  • env!("CARGO_PKG_VERSION") 是一个宏,目的是我们可以打印 关于项目配置里面的版本号。
  • 在 for 循环外打印出错误信息,原因是没有相关匹配的参数。
  1. 两个参数
"--hi" => {
    if let Some(name) = args.get(2) {
        println!("hi {}", name);
        return;
    } else {
        println!("错误:--hi  需要且仅需要一个名字参数");
        return;
    }
}
  • 我们的 if let Some(name) = args.get(2)
    • 是用 Some 这个枚举类型,简单来说就是 声明一个变量,要么有值:Some(T),要么为空:None。这是Rust用来替代空指针不安全性的一个特性,非常好用。
    • args.get(2) 我们的 args 是迭代器返回的所有参数,而如果你把这个 args 全部打印出来的话会发现,第一个参数是程序运行的地址,第二个是 --hi 这个参数,第三个才是 NAME 参数,所以我们使用 .get(2) 方法,让它去获取这个数组的第三个元素,也就是索引 2。

源码展示

use std::env;

fn main() {
    let help: &str = r#"
      cli 
          --help 帮助,查看所有参数。
          --version 查看版本。
          --hi NAME 向你打招呼。
    "#
    // println!("{}", help);

    let args:Vec<String> = env::args().collect();

    for arg in args.iter() {
        match arg.as_str() {
            "--help" => {
                println!("{}", help);
                return;
            },
            "--version" => {
                println!("当前 cli 版本: {}", env!("CARGO_PKG_VERSION"));
                return;
            },
            "--hi" => {
                if let Some(name) = args.get(2) {
                    println!("hi {}", name);
                    return;
                } else {
                    println!("错误:--hi  需要且仅需要一个名字参数");
                    return;
                }
            },
            _ => {
                //
            }
        }
    }
    
    println!("未能识别的参数!可以输入 `cli --help` 来获取帮助。");

}
转载自:https://juejin.cn/post/7370356693593849856
评论
请登录