grep_in_file/
lib.rs

1use std::error::Error;
2use std::fs;
3
4pub struct Config {
5    pub query: String,
6    pub filename: String,
7}
8
9impl Config {
10    pub fn new(args: &[String]) -> Result<Config, &str> {
11        if args.len() < 3 {
12            return Err("请携带参数");
13        }
14        let query = &args[1];
15        let filename = &args[2];
16        Ok(Config {
17            query: query.to_string(),
18            filename: filename.to_string(),
19        })
20    }
21}
22
23pub fn run(config: &Config) -> Result<(), Box<dyn Error>> {
24    let contents = fs::read_to_string(&config.filename)?;
25    for line in search(&config.query, &contents) {
26        println!("{}", line);
27    }
28    Ok(())
29}
30
31pub fn search<'a>(query: &str, content: &'a str) -> Vec<&'a str> {
32    let mut results = Vec::new();
33    let lines = content.lines();
34    for line in lines {
35        if line.contains(query) {
36            results.push(line);
37        }
38    }
39    results
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn one_result() {
48        let query = "你好";
49        let content = "你好,世界!";
50        assert_eq!(vec!["你好,世界!"], search(query, content));
51    }
52}