rust_ls/
lib.rs

1use std::fs;
2use std::time;
3use std::process;
4
5pub struct Config {
6    pub path: String,
7}
8
9impl Config {
10    pub fn build(args: &[String]) -> Result<Config, &'static str> {
11        let mut path = String::from("./");
12
13        if args.len() > 1 {
14            path = args[1].clone();
15        } 
16
17        Ok(Config { path })
18    }
19}
20
21
22pub fn run(path: String) {
23    let dir = fs::read_dir(path.clone()).unwrap_or_else(|err| {
24            eprintln!("Error getting file/folder metadata `{err}`");
25            process::exit(1);
26        });
27
28    for i in dir {
29        let f_name = i.unwrap_or_else(|err| {
30            eprintln!("Error getting file/folder metadata `{err}`");
31            process::exit(1);
32        }).path().display().to_string().replace(&path, "").replace("/", "");
33
34        let f_path = format!("{path}/{f_name}");
35
36        let mut f_type = "Folder";
37
38        if fs::metadata(f_path.clone()).unwrap_or_else(|err| {
39            eprintln!("Error getting file/folder metadata `{err}`");
40            process::exit(1);
41        }).is_file() {
42            f_type = "File";
43        }
44
45        let mut f_created = time::SystemTime::elapsed(&fs::metadata(f_path.clone()).unwrap_or_else(|err| {
46            eprintln!("Error getting file/folder metadata `{err}`");
47            process::exit(1);
48        }).created().unwrap_or_else(|err| {
49            eprintln!("Error getting file/folder creation time `{err}`");
50            process::exit(1);
51        })).unwrap_or_else(|err| {
52            eprintln!("Error getting file/folder creation time `{err}`");
53            process::exit(1);
54        }).as_secs_f64().to_string();
55
56        let mut f_modified = time::SystemTime::elapsed(&fs::metadata(f_path.clone()).unwrap_or_else(|err| {
57            eprintln!("Error getting file/folder metadata `{err}`");
58            process::exit(1);
59        }).modified().unwrap_or_else(|err| {
60            eprintln!("Error getting file/folder modified time `{err}`");
61            process::exit(1);
62        })).unwrap_or_else(|err| {
63            eprintln!("Error getting file/folder modified time `{err}`");
64            process::exit(1);
65        }).as_secs_f64().to_string();
66
67        let mut f_accessed = time::SystemTime::elapsed(&fs::metadata(f_path.clone()).unwrap_or_else(|err| {
68            eprintln!("Error getting file/folder metadata `{err}`");
69            process::exit(1);
70        }).accessed().unwrap_or_else(|err| {
71            eprintln!("Error getting file/folder accessed time `{err}`");
72            process::exit(1);
73        })).unwrap_or_else(|err| {
74            eprintln!("Error getting file/folder accessed time `{err}`");
75            process::exit(1);
76        }).as_secs_f64().to_string();
77
78        f_created = convert_time_to_days(f_created);
79
80        f_modified = convert_time_to_days(f_modified);
81
82        f_accessed = convert_time_to_days(f_accessed);
83
84        print!("{} \t \t {} \t \t {} \t \t {} \t \t {} \n", f_type, f_created, f_modified, f_accessed, f_name);
85    }
86}
87
88
89fn convert_time_to_days(time: String) -> String {
90    ((time.parse::<f64>().unwrap_or_else(|err| {
91            eprintln!("Error parsing data `{err}`");
92            process::exit(1);
93        }) / 86400.0) as i64).to_string()
94}