rust_main_abel_test/
lib.rs

1//! #rust_main
2//!
3//!
4use std::{error::Error, fs, vec};
5
6#[derive(Debug)]
7pub struct Config {
8    pub query: String,
9    pub filename: String,
10}
11
12///
13/// # Examples
14/// ```
15/// let str = read_staring(path);
16/// prinln!("{:?}",str);
17/// ```
18///
19
20pub fn read_string(path: &str) -> Result<String, std::io::Error> {
21    let str = fs::read_to_string(path)?;
22    Ok(str)
23}
24
25pub fn parse_config(args: &Vec<String>) -> Result<Config, &'static str> {
26    if args.len() < 3 {
27        return Err("not enough arguments");
28    }
29    let query = args[1].clone();
30    let filename = args[2].clone();
31    Ok(Config { query, filename })
32}
33
34pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
35    let content = read_string(&config.filename)?;
36    for line in search(&config.query, &content) {
37        println!("{}", line)
38    }
39    Ok(())
40}
41
42pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
43    let mut results = vec![];
44    for line in contents.lines() {
45        if line.contains(query) {
46            results.push(line);
47        }
48    }
49    results
50}
51
52#[cfg(test)]
53mod tests {
54    use super::*;
55    #[test]
56
57    fn case_sensitive() {
58        let query = "rust";
59        let contents = "
60Rust
61safe, fast, productive.
62Pick three.
63";
64        let res = search(query, contents);
65        assert_eq!(vec!["Rust"], res);
66    }
67}