startup_to_learn_rust/
lib.rs1use std::{fs, error::Error};
7use std::env;
8
9pub 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 }
42
43pub fn run(cfg: Config) -> Result<(), Box<dyn Error>> {
44 let data = fs::read_to_string(&cfg.filename)?;
45 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 contents.lines().filter(|line| line.contains(query)).collect()
57 }
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}