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}