startup_to_learn_rust/
lib.rs

1//! # Startup library
2//! blablabla...
3//! 
4//! 
5
6use std::{fs, error::Error};
7use std::env;
8
9///
10/// 这是一份简单的配置结构体,接受两个参数,查询和文件绝对路径。
11pub struct Config {
12    pub query: String,
13    pub filename: String,
14}
15
16impl Config {
17    pub fn new(mut args: env::Args) -> Result<Config, &'static str> {
18        args.next();
19
20        let query = match args.next() {
21            Some(value) => value,
22            None => return Err("Didn`t get a query stringe"),
23        };
24
25        let filename = match args.next() {
26            Some(value) => value,
27            None => return Err("Didn`t get filename"),
28        };
29
30        Ok(Config { query, filename })
31    }
32
33    // pub fn new(args: &[String]) -> Result<Config, &'static str> {
34    //     if args.len() < 3 {
35    //         return Err("not enough arguments!")
36    //     }
37    //     let query = args[1].clone();
38    //     let filename = args[2].clone();
39    //     Ok(Config { query, filename })
40    // }
41}
42
43pub fn run(cfg: Config) -> Result<(), Box<dyn Error>> {
44    let data = fs::read_to_string(&cfg.filename)?;
45    // println!("{}", data);
46    // println!("filename: {}", cfg.filename);
47    for line in search(&cfg.query, &data) {
48        println!("{}", line);
49    }
50
51    Ok(())
52}
53
54pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
55    // let mut result: Vec<&'a str> = Vec::new();
56    contents.lines().filter(|line| line.contains(query)).collect()
57    // for line in contents.lines() {
58    //     if line.contains(query) {
59    //         result.push(line)
60    //     }
61    // }
62
63    // result
64}
65
66#[cfg(test)]
67mod test {
68    use super::*;
69
70    #[test]
71    fn one_result() {
72        let query = "fast";
73        let contents = "\
74        Rust:
75safe, fast, productive.
76        Pick three.";
77
78        assert_eq!(
79            vec!["safe, fast, productive."],
80            search(query, contents),
81        );
82    }
83}