Advertisement
Guest User

Untitled

a guest
Sep 15th, 2019
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.99 KB | None | 0 0
  1. use std::fs;
  2. use std::error::Error;
  3.  
  4.  
  5. pub struct Config {
  6.     pub query: String,
  7.     pub filename: String,
  8.     pub case_sensitive: bool,
  9. }
  10.  
  11. impl Config {
  12.     pub fn new(args: &[String]) -> Result<Config, &'static str> {
  13.        if args.len() < 3 {
  14.            return Err("not enough arguments");
  15.        }
  16.        let query = args[1].clone();
  17.        let filename = args[2].clone();
  18.  
  19.        Ok(Config {query, filename})
  20.    }
  21. }
  22.  
  23. pub fn run(config: Config) -> Result<(), Box<dyn Error>> {
  24.    let contents = fs::read_to_string(config.filename)?;
  25.  
  26.    let results = if config.case_sensitive {
  27.        search(&config.query, &contents)
  28.    } else {
  29.        search_case_insensitive(&config.query, &contents)
  30.    };
  31.  
  32.    for line in results {
  33.        println!("{}", line);
  34.    }
  35.  
  36.    Ok(())
  37. }
  38.  
  39. pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
  40.     let mut result: Vec<& str> = Vec::new();
  41.  
  42.     for line in contents.lines() {
  43.         if line.contains(query) {
  44.             result.push(line);
  45.         }
  46.     }
  47.     result
  48. }
  49.  
  50. pub fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
  51.    let mut result: Vec<& str> = Vec::new();
  52.    let query = query.to_lowercase();
  53.  
  54.    for line in contents.lines() {
  55.        if line.to_lowercase().contains(&query) {
  56.            result.push(line);
  57.        }
  58.    }
  59.    result
  60. }
  61.  
  62.  
  63. #[cfg(test)]
  64. mod tests {
  65.    use super::*;
  66.  
  67.    #[test]
  68.    fn case_sensitive() {
  69.        let query = "duct";
  70.        let contents = "\
  71. Rust:
  72. safe, fast, productive.
  73. Pick three.
  74. Duct tape.";
  75.  
  76.        assert_eq!(
  77.            vec!["safe, fast, productive."],
  78.            search(query, contents)
  79.        );
  80.    }
  81.  
  82.    #[test]
  83.    fn case_insensitive() {
  84.        let query = "rUsT";
  85.        let contents = "\
  86. Rust:
  87. safe, fast, productive.
  88. Pick three.
  89. Trust me.";
  90.  
  91.        assert_eq!(
  92.            vec!["Rust:", "Trust me."],
  93.            search_case_insensitive(query, contents)
  94.        );
  95.    }
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement