BO_rs_minigrep/
lib.rs

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<输入配置, String> {
13    //     let 命令行参数: Vec<String> = env::args().skip(1).collect();
14    //     if 命令行参数.len() < 2 { return Err(format!("命令行参数过少 :{:?}", 命令行参数)); }
15    //     if 命令行参数.len() > 2 { return Err(format!("命令行参数过多 :{:?}", 命令行参数)); }
16    //     if 命令行参数[1] == "-all" { return Ok(输入配置 { 查询字段: None, 文件地址: 命令行参数[0].clone(), 打印全部吗: true }); }
17    //     let 查询字段 = 命令行参数[0].clone();
18    //     let 文件地址 = 命令行参数[1].clone();
19    //     Ok(输入配置 { 查询字段: Some(查询字段), 文件地址, 打印全部吗: false })
20    // }
21    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 mut v = Vec::new();
63    // for 行 in 内容.lines() {
64    //     if 行.contains(&字段.clone().unwrap()) { v.push(行); }
65    // }
66    // if v.is_empty() { return None; }
67    // Some(v)
68    let 字段 = 字段.clone().unwrap();
69    Some(内容.lines()
70        .filter(|行| 行.contains(&字段))
71        .collect())
72}
73
74#[cfg(test)]
75mod tests {
76    use super::*;
77
78    // #[test]
79    // fn 获取配置_test() {
80    //     let 配置 = 获取配置();
81    //     assert_eq!(配置, Ok(输入配置 { 查询字段: "to".to_string(), 文件地址: "poem.txt".to_string() }));
82    // }
83}