#[derive(Debug)]
pub struct Config {
pub file_name: String,
pub target: String,
pub show_help: bool,
}
pub mod config {
use super::Config;
use std::env;
use std::fs;
use std::path::Path;
pub fn build(args: &[String]) -> Result<Config, &str> {
if args.len() < 3 {
if args.len() == 2 {
let target_name = args[1].clone();
if target_name == "--help" {
return Ok(Config {
target: target_name,
file_name: "".to_string(),
show_help: true,
});
}
}
return Err("必须有两个参数");
}
println!("rust返回的程序路径:{}", args[0]);
let target_name = args[1].clone();
let file_path = args[2].clone();
if !file_exists(&file_path) {
let exec_path = get_current_exec_path();
println!("当前执行路径:{}", exec_path);
let mut tmp_path = exec_path.clone() + &file_path;
if !file_exists(&tmp_path) {
tmp_path = exec_path.clone().replace("\\target\\debug\\", "\\src\\") + &file_path;
if !file_exists(&tmp_path) {
tmp_path =
exec_path.clone().replace("\\target\\release\\", "\\src\\") + &file_path;
if !file_exists(&tmp_path) {
return Err("文件不存在");
}
}
Ok(Config {
target: target_name,
file_name: tmp_path,
show_help: false,
})
} else {
Ok(Config {
target: target_name,
file_name: tmp_path,
show_help: false,
})
}
} else {
println!("{}", file_path);
Ok(Config {
target: target_name,
file_name: file_path,
show_help: false,
})
}
}
fn file_exists(file_name: &String) -> bool {
Path::new(&file_name).exists()
}
fn get_current_exec_path() -> String {
let cur_dir = match env::current_exe() {
Ok(exe_path) => exe_path.display().to_string(),
Err(e) => panic!("获取当前路径失败:{}", e),
};
let path = Path::new(&cur_dir);
let result = path.parent().unwrap().to_str().unwrap().to_string() + "\\";
result
}
pub fn is_too_big(file_name: &String) -> bool {
let file_size = fs::metadata(file_name).unwrap().len();
if file_size > 1 * 1024 * 1024 {
return true;
} else {
false
}
}
pub fn show_help() {
println!("用法:minigrep target path");
println!(" minigrep --help");
println!("参数:");
println!(" target 需要查找的目标字符串");
println!(" path 包含target的文件,可以是全路径,也可以是文件名");
println!(" 如果是文件名,则会尝试在当前目录下,或者是在相对路径..\\..\\src");
println!(" --help 查看帮助");
println!("示例:");
println!(" minigrep 宋 E:\\learning\\gitee\\rust-org\\test-1\\minigrep\\src\\古诗.txt ");
println!(" minigrep 宋 古诗.txt");
println!("版本 1.0 for windows, 作者->lzfto");
}
}
pub mod search {
use super::Config;
use std::fs;
use std::fs::File;
use std::io::{BufRead, BufReader};
use std::path::Path;
pub fn search_small_file(con: &Config) -> Vec<String> {
let contents = fs::read_to_string(con.file_name.clone()).expect("文件不存在");
println!("文章内容:\n{}", contents);
let mut result: Vec<String> = vec![];
let lines = contents.lines();
for line in lines {
if line.find(&con.target).is_some() {
result.push(line.to_string());
}
}
return result;
}
pub fn searh_big_file(file_name: &String, target: &String) -> std::io::Result<()> {
let path = Path::new(file_name);
let file = File::open(&path)?;
let reader = BufReader::new(file);
for line in reader.lines() {
match line {
Ok(line) => {
if line.find(target).is_some() {
println!("{}", line);
}
}
Err(e) => println!("Error reading line: {}", e),
}
}
Ok(())
}
}