coreutils_rs/
runner.rs

1use crate::config;
2use crate::search::string_search_funcs::{search_case_insensitive, search_case_sensitive};
3use std::error::Error;
4use std::fs;
5
6pub fn run_grep(config: &config::GrepCli) -> Result<(), Box<dyn Error>> {
7    let contents = fs::read_to_string(&config.file)?;
8
9    let search_results: Vec<&str> = match config.ignore_case {
10        true => search_case_insensitive(&config.query, &contents),
11        false => search_case_sensitive(&config.query, &contents),
12    };
13
14    let _: Vec<_> = search_results
15        .into_iter()
16        .map(|x| println!("{}", x))
17        .collect();
18
19    Ok(())
20}
21
22pub fn run_cp(config: &config::CpCli) -> Result<(), Box<dyn Error>> {
23    let contents = fs::read_to_string(&config.source)?;
24    fs::write(&config.dest, contents)?;
25    Ok(())
26}
27
28pub fn run_mv(config: &config::CpCli) -> Result<(), Box<dyn Error>> {
29    let contents = fs::read_to_string(&config.source)?;
30    fs::write(&config.dest, contents)?;
31    fs::remove_file(&config.source)?;
32    Ok(())
33}
34
35pub fn run_ls(config: &config::LsCli) -> Result<(), Box<dyn Error>> {
36    if let Ok(entries) = fs::read_dir(&config.dir) {
37        for entry in entries {
38            if let Ok(entry) = entry {
39                if let Ok(metadata) = entry.metadata() {
40                    println!("{:?}: {:?}", entry.path(), metadata.permissions());
41                } else {
42                    println!("Couldn't get metadata for {:?}", entry.path());
43                }
44            }
45        }
46    }
47    Ok(())
48}
49
50pub fn run_head(config: &config::HeadCli) -> Result<(), Box<dyn Error>> {
51    let contents = fs::read_to_string(&config.file)?;
52
53    for (item, idx) in contents.lines().zip(0u32..) {
54        if &idx < &config.num_lines {
55            println!("{}", item);
56        } else {
57            break;
58        }
59    }
60    Ok(())
61}