my_lib/
lib.rs

1use std::fs;
2use std::error::Error;
3use colored::*;
4
5pub struct Config{
6    pub query : String,
7    pub filename : String
8}
9
10impl Config {
11    pub fn new (args : &[String]) -> Result<Config, &str> {
12        if args.len() < 2 {
13            return Err("not enough arguments");
14        }
15        let query = args[1].clone();
16        if query == "cat" {
17            if args.len() < 3 {
18                return Err("not enough arguments");
19            }
20            let filename = args[2].clone();
21            return Ok(Config { query, filename});
22        } else if query == "echo" {
23            if args.len() < 3 {
24                return Err("not enough arguments");
25            }
26            let words = &args[2..];
27            let sentence = words.join(" ");
28            return Ok(Config {query , filename : sentence });
29        }else if query == "ls" {
30            let dir;
31            if args.len() == 2 {
32                dir = String::from(".");
33            }else {
34                dir = args[2].clone();
35            }
36            println!("{}", dir);
37            return Ok(Config { query, filename : dir});
38        }
39        return Ok(Config {query , filename : String::from("Error!")});
40    }
41}
42
43pub fn echo(x : &str) {
44    println!("{}", x);
45}
46
47pub fn cat(config : Config ) -> Result<(), Box<dyn Error>> {
48    let content = fs::read_to_string(config.filename)?;
49    println!("{}", content );
50    Ok(())
51}
52
53pub fn ls(config : Config ) -> Result<(), Box<dyn Error>> {
54    let files = fs::read_dir(config.filename)?;
55    for file in files{
56        let file_name = file.unwrap().file_name().into_string();
57        let file_name = match file_name {
58            Ok(x) => x,
59            Err(e) => String::from("Error")
60        };
61        println!("{}", file_name.green());
62    }
63    Ok(())
64}