demo_minigrep 0.1.0

A funny demo about how to use commandtools.
Documentation
//! My crate 
//! # get_vec()是一个获取 命令行参数的工具。
use std::env;
use std::fs;
use std::process;
pub fn get_vec() {
    //获取一个 输入参数的动态数组
    let args:Vec<String> = env::args().collect();
    println!("{:?}",args);
    // let query = &args[1];
    // let file_name =&args[2];
    // println!("query is {}",query);
    // println!("fileName is {}",file_name);
    //通过构造器 重构方法,获取结构体数据, 通过闭包-匿名函数,执行返回错误的对应代码
    let config =Config::new(&args).unwrap_or_else(|err| {
        println!("problem is {}",err);
        process::exit(1);
    });
    //读取文件内容
    let content = fs::read_to_string(config.file_name).expect("读取文件错误");
    println!("the content is: \n {}",content);
    //将查询结果,进行匹配行,然后输出
    let result = get_result_collect(&config.query,&content);
    println!("result is {:#?}",result)
}
//创建一个config结构体,并创建构造函数
struct Config{
    query:String,
    file_name:String,
}
impl Config {
    fn new(args:&[String]) ->Result<Config,&'static str> {
        if args.len() < 3 {
        //    panic!("当前命令行数量缺乏!")
            return Err("当前命令行数量缺乏!");
        }
        let query =args[1].clone();
        let file_name =args[2].clone();
        Ok(Config{
            query,
            file_name,
        })
    }
}
///
/// '''
//声明周期是泛型的一种,需要添加泛型标志。同时此处添加,忽视大小写区分
pub fn get_result_collect<'a >(query:&str,contents:&'a str) ->Vec<&'a str>{
    // let mut result =Vec::new();
    // let query = query.to_lowercase();
    // for line in contents.lines() {
    //     if line.to_lowercase().contains(&query) {
    //         result.push(line);
    //     }
    // }
    //使用闭包的更简洁的写法
    contents.lines().filter(|line| line.contains(query)).collect()
}
#[cfg(test)]
mod test{
  use super::*;
  #[test]
  fn test_demo() {
      
  }
}