From 31f1d3d18566d1ae97daaedbd17132a11a7ab5aa Mon Sep 17 00:00:00 2001 From: Bryan Newbold Date: Sun, 31 May 2020 16:29:40 -0700 Subject: start aft-ls --- Cargo.lock | 47 +++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + src/bin/aft-ls.rs | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 src/bin/aft-ls.rs diff --git a/Cargo.lock b/Cargo.lock index e998284..fef5899 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7,6 +7,7 @@ dependencies = [ "anyhow", "assert_cmd", "atty", + "chrono", "colored", "serde_json", "structopt", @@ -43,12 +44,29 @@ dependencies = [ "winapi", ] +[[package]] +name = "autocfg" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" + [[package]] name = "bitflags" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" +[[package]] +name = "chrono" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2" +dependencies = [ + "num-integer", + "num-traits", + "time", +] + [[package]] name = "clap" version = "2.33.1" @@ -119,6 +137,25 @@ version = "0.2.71" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49" +[[package]] +name = "num-integer" +version = "0.1.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" +dependencies = [ + "autocfg", +] + [[package]] name = "predicates" version = "1.0.4" @@ -293,6 +330,16 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "time" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" +dependencies = [ + "libc", + "winapi", +] + [[package]] name = "treeline" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index e2937b8..a6d0c8c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,6 +12,7 @@ anyhow = "1.0" colored = "1.9" atty = "0.2" tabwriter = { version = "1.2", features = ["ansi_formatting"] } +chrono = "*" [dev-dependencies] assert_cmd = "1" diff --git a/src/bin/aft-ls.rs b/src/bin/aft-ls.rs new file mode 100644 index 0000000..3118c08 --- /dev/null +++ b/src/bin/aft-ls.rs @@ -0,0 +1,36 @@ + +use std::{fs,env,path}; +use std::error::Error; +use std::os::unix::fs::MetadataExt; + +fn main() -> Result<(), Box> { + + let args: Vec = env::args().collect(); + let dir = match args.len() { + 0 | 1 => path::Path::new("."), + _other => path::Path::new(&args[2]), + }; + + // header is basically a constant + print!("\x01"); + println!("{}\x1D", ["file_name", "size", "mtime"].join("\x1E")); + println!("{}\x1D", ["string", "integer+bytes", "datetime"].join("\x1E")); + print!("\x02"); + + for entry in fs::read_dir(dir)? { + let entry = entry?; + let metadata = entry.metadata()?; + let filename: String = entry.file_name() + .into_string() + .or_else(|_| Err(format!("Invalid entry")))?; + let mtime = chrono::DateTime::::from_utc( + chrono::NaiveDateTime::from_timestamp(metadata.mtime(), 0), chrono::Utc); + println!("{}\x1D", + [ + filename, + metadata.size().to_string(), + mtime.to_rfc3339_opts(chrono::SecondsFormat::AutoSi, true), + ].join("\x1E")); + } + Ok(()) +} -- cgit v1.2.3