1use std::{env, fs, process};
2use std::error::Error;
3
4#[derive(Debug, PartialEq)]
5pub struct 输入配置 {
6 pub 查询字段: Option<String>,
7 pub 文件地址: String,
8 打印全部吗: bool,
9}
10
11impl 输入配置 {
12 pub fn 获取配置() -> Result<输入配置, &'static str> {
22 let mut 命令行输入 = env::args();
23 命令行输入.next();
24 let 查询字段 = match 命令行输入.next() {
25 None => { return Err("未能获取查询字段"); }
26 Some(s) => { s }
27 };
28 let 文件地址 = match 命令行输入.next() {
29 None => { return Err("未能获取文件地址"); }
30 Some(s) => { s }
31 };
32 return if 文件地址 == "-all" { Ok(输入配置 { 查询字段: None, 文件地址: 查询字段, 打印全部吗: true }) } else { Ok(输入配置 { 查询字段: Some(查询字段), 文件地址, 打印全部吗: false }) }
33 }
34}
35
36fn 打印全部(内容: &String) {
37 for line in 内容.lines() {
38 if !line.is_empty() { println!("{line}"); }
39 }
40}
41
42pub fn run(配置: &输入配置) -> Result<(), Box<dyn Error>> {
43 let 内容 = fs::read_to_string(&配置.文件地址)?;
44 if 配置.打印全部吗 {
45 打印全部(&内容);
46 return Ok(());
47 }
48 let 结果 = 查找(&配置.查询字段, &内容).unwrap_or_else(
49 || {
50 eprintln!("未找到该字段");
51 process::exit(2);
52 }
53 );
54 for 行 in 结果 {
55 println!("{}", 行);
56 }
57 Ok(())
58}
59
60
61fn 查找<'a>(字段: &Option<String>, 内容: &'a String) -> Option<Vec<&'a str>> {
62 let 字段 = 字段.clone().unwrap();
69 Some(内容.lines()
70 .filter(|行| 行.contains(&字段))
71 .collect())
72}
73
74#[cfg(test)]
75mod tests {
76 use super::*;
77
78 }