1use std::{env::Args, error::Error, fs};
2
3#[derive(Debug)]
4pub struct Config {
5 pub query: String,
6 pub filename: String,
7}
8impl Config {
9 pub fn new(mut args: Args) -> Result<Config, &'static str> {
10 if args.len() < 3 {
11 return Err("参数不能小于三个");
12 }
13 args.next();
14 let query = match args.next() {
15 Some(_query) => _query,
16 None => return Err("没有获取到查询的参数"),
17 };
18 let filename = match args.next() {
19 Some(_query) => _query,
20 None => return Err("没有获取到文件"),
21 };
22 Ok(Config { query, filename })
23 }
24}
25pub fn search<'a>(query: &str, content: &'a str) -> Vec<&'a str> {
31 content
32 .lines()
33 .filter(|line| line.contains(query))
34 .collect()
35}
36pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
37 let content = fs::read_to_string(config.filename)?;
38 for line in search(&config.query, &content) {
39 println!("{}", line)
40 }
41 Ok(())
42}