1use sha256::{digest};
2use std::error::Error;
3use std::process;
4
5pub struct Config {
6 pub query: String,
7}
8
9pub fn print_type_of<T>(_: &T) -> String {
10 format!("{}", std::any::type_name::<T>())
11}
12
13impl Config {
14
15 pub fn build(args: &[String]) -> Result<Config, &'static str> {
16
17 if args.len() == 1 {
18
19 println!("{}", digest("".to_string()));
20 process::exit(0);
21
22 }
23
24 let query = args[1].clone();
25 Ok(Config { query })
26 }
27}
28pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
29 println!("{}", digest(config.query));
30 Ok(())
31}
32pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
33let mut results = Vec::new();
34 for line in contents.lines() {
35 println!("{}", line);
37 if line.contains(query) {
38 let val = digest(query);
40 println!("{}", val);
41 results.push(line);
42 }
43 }
44 results
45}
46
47#[cfg(test)]
48mod tests {
49 use super::*;
50
51 #[test]
52 fn one_result() {
53 let query = "duct";
54 let contents = "\
55Rust:
56safe, fast, productive.
57Pick three.";
58
59 assert_eq!(vec!["safe, fast, productive."], search(query, contents));
60 }
61 #[test]
62 fn one_query() {
63 let query = digest("");
64 let contents = "\
65e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
66
67 assert_eq!(vec!["e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"], search(&query, contents));
68 }
69 #[test]
70 #[should_panic]
71 fn panic_query() {
72 let query = digest("");
73 let contents = "\
74e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 ";
75
76 assert_eq!(vec!["e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"], search(&query, contents));
77 }
78}
79
80