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}