本人前端, 业余时间学了两周rust, 写此文章帮助想学习rust的朋友.第一次写文,各位见谅.
开始之前:
- 看完了the book基础部分
- rust环境
天才第一步
cargo new tree-cli
打开项目添加依赖
clap是一个简单易用、高效且功能齐全的库,用于在编写控制台或终端应用程序时解析命令行参数和子命令。clap - Rustdocs.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 命令行部分结束
稍微测试一下
未入参是当前目录,max_level是usize最大值. 正常
未写DIR默认是当前目录,level10. 正常
传入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);
}