diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c6f751f --- /dev/null +++ b/Makefile @@ -0,0 +1,5 @@ +PREFIX ?= ~/.local/bin/grutils +file_list != find . -name '*.rs' + +all: + rust diff --git a/ls b/ls new file mode 100755 index 0000000..35e72c0 Binary files /dev/null and b/ls differ diff --git a/src/ls.rs b/src/ls.rs index 07a68ff..573e2cf 100644 --- a/src/ls.rs +++ b/src/ls.rs @@ -1,11 +1,20 @@ use std::env; use std::fs; +use std::io::{stdout, Write}; +use std::path::Path; +use std::os::unix::fs::PermissionsExt; + +/*extern crate chrono; +use chrono::prelude::*;*/ fn main(){ let args: Vec = env::args().collect(); - let pwd = env::current_dir().unwrap(); + // Flags vars let mut show_hidden = false; let mut show_prev_and_current = false; + let mut long_listing = false; + // Directories + let pwd = env::current_dir().unwrap(); let mut dir = pwd.to_str(); for arg in 1..args.len() { match args[arg].as_str() { @@ -19,15 +28,18 @@ fn main(){ "-A" | "--almost-all" => { show_hidden = true; show_prev_and_current = false; - } + }, + "-l" => { + long_listing = true; + }, arg => { dir = Some(arg); }, } } - list_dir(dir.unwrap().to_string(), show_hidden, show_prev_and_current); + list_dir(dir.unwrap().to_string(), show_hidden, show_prev_and_current, long_listing); } -fn list_dir(arg: String, show_hidden: bool, show_prev_and_current: bool) { +fn list_dir(arg: String, show_hidden: bool, show_prev_and_current: bool, long_listing: bool) { let files = fs::read_dir(arg.clone()).unwrap(); if show_hidden && show_prev_and_current { println!("."); @@ -39,6 +51,30 @@ fn list_dir(arg: String, show_hidden: bool, show_prev_and_current: bool) { if file.clone().unwrap().display().to_string().starts_with('.') && !show_hidden { continue; } - println!("{}", file.unwrap().display()); + if long_listing { + long_listing_format(Path::new(&path), file.unwrap().display().to_string()); + } else { + print!("{} ", file.unwrap().display()); + } } + if !long_listing { + print!("\n"); + } + stdout().flush().unwrap(); +} + +fn long_listing_format(path: &Path, file: String) -> std::io::Result<()> { + let metadata = fs::metadata(path)?; + let modified = metadata.modified(); + /*let timestamp = modified.parse::().unwrap(); + let naive = NaiveDateTime::fromtimestamp(timestamp, 0); + let datetime: DateTime = DateTime::from_utc(naive, Utc);*/ + let mut permissions_string = String::new(); + if metadata.is_dir() { + permissions_string.push('d'); + } else { + permissions_string.push('-'); + } + println!("{}{:o} {} {}", permissions_string, metadata.permissions().mode(), metadata.len(), file); + Ok(()) }