BO_rs_minigrep/
lib.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
use std::{env, fs, process};
use std::error::Error;

#[derive(Debug, PartialEq)]
pub struct 输入配置 {
    pub 查询字段: Option<String>,
    pub 文件地址: String,
    打印全部吗: bool,
}

impl 输入配置 {
    // pub fn 获取配置() -> Result<输入配置, String> {
    //     let 命令行参数: Vec<String> = env::args().skip(1).collect();
    //     if 命令行参数.len() < 2 { return Err(format!("命令行参数过少 :{:?}", 命令行参数)); }
    //     if 命令行参数.len() > 2 { return Err(format!("命令行参数过多 :{:?}", 命令行参数)); }
    //     if 命令行参数[1] == "-all" { return Ok(输入配置 { 查询字段: None, 文件地址: 命令行参数[0].clone(), 打印全部吗: true }); }
    //     let 查询字段 = 命令行参数[0].clone();
    //     let 文件地址 = 命令行参数[1].clone();
    //     Ok(输入配置 { 查询字段: Some(查询字段), 文件地址, 打印全部吗: false })
    // }
    pub fn 获取配置() -> Result<输入配置, &'static str> {
        let mut 命令行输入 = env::args();
        命令行输入.next();
        let 查询字段 = match 命令行输入.next() {
            None => { return Err("未能获取查询字段"); }
            Some(s) => { s }
        };
        let 文件地址 = match 命令行输入.next() {
            None => { return Err("未能获取文件地址"); }
            Some(s) => { s }
        };
        return if 文件地址 == "-all" { Ok(输入配置 { 查询字段: None, 文件地址: 查询字段, 打印全部吗: true }) } else { Ok(输入配置 { 查询字段: Some(查询字段), 文件地址, 打印全部吗: false }) }
    }
}

fn 打印全部(内容: &String) {
    for line in 内容.lines() {
        if !line.is_empty() { println!("{line}"); }
    }
}

pub fn run(配置: &输入配置) -> Result<(), Box<dyn Error>> {
    let 内容 = fs::read_to_string(&配置.文件地址)?;
    if 配置.打印全部吗 {
        打印全部(&内容);
        return Ok(());
    }
    let 结果 = 查找(&配置.查询字段, &内容).unwrap_or_else(
        || {
            eprintln!("未找到该字段");
            process::exit(2);
        }
    );
    for in 结果 {
        println!("{}", 行);
    }
    Ok(())
}


fn 查找<'a>(字段: &Option<String>, 内容: &'a String) -> Option<Vec<&'a str>> {
    // let mut v = Vec::new();
    // for 行 in 内容.lines() {
    //     if 行.contains(&字段.clone().unwrap()) { v.push(行); }
    // }
    // if v.is_empty() { return None; }
    // Some(v)
    let 字段 = 字段.clone().unwrap();
    Some(内容.lines()
        .filter(|行| 行.contains(&字段))
        .collect())
}

#[cfg(test)]
mod tests {
    use super::*;

    // #[test]
    // fn 获取配置_test() {
    //     let 配置 = 获取配置();
    //     assert_eq!(配置, Ok(输入配置 { 查询字段: "to".to_string(), 文件地址: "poem.txt".to_string() }));
    // }
}