rust 用steamcmd命令_用rust写一个简单tree命令(1)

382534ec455de00624a4bbee72b1be2a.png
本人前端, 业余时间学了两周rust, 写此文章帮助想学习rust的朋友.第一次写文,各位见谅.

开始之前:

  1. 看完了the book基础部分
  2. rust环境

天才第一步

cargo new tree-cli

打开项目添加依赖

b534c0b115dbf77ed727150979103733.png
clap是一个简单易用、高效且功能齐全的库,用于在编写控制台或终端应用程序时解析命令行参数和子命令。
clap - Rust​docs.rs

打开main.rs开始撸

读取cargo配置,来设置tree命令基本信息

use clap::{App, Arg};

fn main() {
  //env! 可以读取的环境变量
  //for (key, value) in std::env::vars_os() {
  //  println!("{:?}: {:?}", key, value);
  //}
  let name = env!("CARGO_PKG_NAME");
  let author = env!("CARGO_PKG_AUTHORS");
  let version = env!("CARGO_PKG_VERSION");
  App::new(name).version(version).author(author);
}

开始丰富tree命令

只加一个目录深度的命令 -l,后期可以自己添加其他命令
let matches = App::new(name)
    .version(version)
    .author(author)
    .args(&[
      Arg::with_name("DIR").index(1).help("要tree的目录"), //第一个参数   eg: tree ~/Desktop  ~/Desktop就是index1的位置 DIR值
      Arg::with_name("Level") // tree  ~/Desktop --level 2  两层目录  -l 2
        .short("l")
        .long("level")
        .help("目录深度")
        .takes_value(true),
    ])
    .get_matches();

获取tree入参

  // max_level最大深度 默认是usize最大值
  let max_level: usize = if let Some(max_level) = matches.value_of("Level") {
    max_level.parse().expect("转int错误")
  } else {
    usize::max_value()
  };
  //需要tree的dir 不传默认是当前目录
  let target_dir: String = if let Some(dir) = matches.value_of("DIR") {
    dir.to_string()
  } else {
    std::env::current_dir()
      .expect("当前目录解析错误")
      .to_str()
      .unwrap()
      .to_string()
  };
  //把tree命令入参存到struct里
  let cli_config = CliConfig { max_level, target_dir };
  println!("{:?}",cli_config);

OK 命令行部分结束

稍微测试一下

5715beabdfc4c78d8d09828aab0bdd61.png

未入参是当前目录,max_level是usize最大值. 正常

94c070360167970795eb25e45a72b194.png

未写DIR默认是当前目录,level10. 正常

fe6af77f259e45530748a0d59980fa0b.png

传入DIR. 正常

下一节开始实现tree的逻辑部分

最后贴一下main.rs代码

use clap::{App, Arg};

#[derive(Debug, Clone)]
struct CliConfig {
  pub target_dir: String,
  pub max_level: usize,
}
fn main() {
  //env! 可以读取的环境变量
  // for (key, value) in std::env::vars_os() {
  //   println!("{:?}: {:?}", key, value);
  // }
  let name = env!("CARGO_PKG_NAME");
  let author = env!("CARGO_PKG_AUTHORS");
  let version = env!("CARGO_PKG_VERSION");
  let matches = App::new(name)
    .version(version)
    .author(author)
    .args(&[
      Arg::with_name("DIR").index(1).help("要tree的目录"), //第一个参数   eg: tree ~/Desktop  ~/Desktop就是index1的位置 DIR值
      Arg::with_name("Level") // tree  ~/Desktop --level 2  两层目录  -l 2
        .short("l")
        .long("level")
        .help("目录深度")
        .takes_value(true),
    ])
    .get_matches();
  // max_level最大深度 默认是usize最大值
  let max_level: usize = if let Some(max_level) = matches.value_of("Level") {
    max_level.parse().expect("转int错误")
  } else {
    usize::max_value()
  };
  //需要打印tree的dir 不传默认是当前目录
  let target_dir: String = if let Some(dir) = matches.value_of("DIR") {
    dir.to_string()
  } else {
    std::env::current_dir()
      .expect("当前目录解析错误")
      .to_str()
      .unwrap()
      .to_string()
  };
  //把tree命令入参存到struct里
  let cli_config = CliConfig { max_level, target_dir };
  println!("{:?}",cli_config);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值