summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2018-10-02 10:01:11 +0300
committerLars Wirzenius <liw@liw.fi>2018-10-02 10:01:11 +0300
commitfb431a9bab7f6642df50af4e37c4b89eea17b98e (patch)
treef0e2591e46f89a57c817cb814848510a70ad5c0a
parent8610949aaee93771065661e77a75bb25d02b80b1 (diff)
downloadsummainrs-fb431a9bab7f6642df50af4e37c4b89eea17b98e.tar.gz
Change: move formatting to its own module
-rw-r--r--src/main.rs155
1 files changed, 26 insertions, 129 deletions
diff --git a/src/main.rs b/src/main.rs
index 7412799..925f300 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -1,152 +1,49 @@
use std::env;
use std::io;
-use std::fs;
-use std::os::unix::fs::PermissionsExt;
-use std::os::linux::fs::MetadataExt;
-use std::io::prelude::*;
extern crate walkdir;
use walkdir::{WalkDir, DirEntry};
-extern crate users;
-
extern crate chrono;
-use chrono::prelude::DateTime;
-use chrono::{Utc};
-
extern crate crypto_hash;
-use crypto_hash::{Algorithm, Hasher};
-extern crate hex;
+mod format;
+
fn main() -> io::Result<()> {
for dirname in env::args().skip(1) {
for e in WalkDir::new(&dirname).into_iter().filter_map(|e| e.ok()) {
- write_info(&e);
+ println!("{}", format_rfc822(&e));
}
}
Ok(())
}
-fn write_info(e: &DirEntry) {
- println!("Name: {}", format_name(e));
- println!("Mtime: {}", format_mtime(e));
- println!("Mode: {}", format_mode(e));
- println!("Ino: {}", format_inode(e));
- println!("Dev: {}", format_dev(e));
- println!("Nlink: {}", format_nlink(e));
- println!("Size: {}", format_size(e));
- println!("Uid: {}", format_uid(e));
- println!("Username: {}", format_username(e));
- println!("Gid: {}", format_gid(e));
- println!("Group: {}", format_group(e));
- println!("SHA256: {}", format_sha256(e));
- println!("");
-}
-
-
-fn format_name(e: &DirEntry) -> String {
- e.path().to_string_lossy().to_string()
-}
-
-
-fn format_mtime(e: &DirEntry) -> String {
- let meta = e.metadata().unwrap();
- let mtime = meta.modified().unwrap();
- let datetime = DateTime::<Utc>::from(mtime);
- datetime.format("%Y-%m-%d %H:%M:%S.%f %z").to_string()
-}
-
-
-fn format_mode(e: &DirEntry) -> String {
- let meta = e.metadata().unwrap();
- let mode = meta.permissions().mode();
- format!("{:06o}", mode)
-}
-
-
-fn format_inode(e: &DirEntry) -> String {
- let meta = e.metadata().unwrap();
- format!("{}", meta.st_ino())
-}
-
-
-fn format_dev(e: &DirEntry) -> String {
- let meta = e.metadata().unwrap();
- format!("{}", meta.st_dev())
-}
-
-
-fn format_nlink(e: &DirEntry) -> String {
- let meta = e.metadata().unwrap();
- format!("{}", meta.st_nlink())
-}
-
-
-fn format_size(e: &DirEntry) -> String {
- let meta = e.metadata().unwrap();
- format!("{}", meta.len())
-}
-
-
-fn format_uid(e: &DirEntry) -> String {
- let meta = e.metadata().unwrap();
- format!("{}", meta.st_uid())
-}
-
-
-fn format_gid(e: &DirEntry) -> String {
- let meta = e.metadata().unwrap();
- format!("{}", meta.st_gid())
-}
-
-
-fn format_username(e: &DirEntry) -> String {
- let meta = e.metadata().unwrap();
- if let Some(u) = users::get_user_by_uid(meta.st_uid()) {
- format!("{}", u.name())
- } else {
- format!("unknown user")
- }
-}
-
-
-fn format_group(e: &DirEntry) -> String {
- let meta = e.metadata().unwrap();
- if let Some(g) = users::get_group_by_gid(meta.st_gid()) {
- format!("{}", g.name())
- } else {
- format!("unknown group")
- }
-}
-
-
-fn format_sha256(e: &DirEntry) -> String {
- let mut ok = true;
- let mut hasher = Hasher::new(Algorithm::SHA256);
- if let Ok(file) = fs::File::open(e.path()) {
- let mut reader = io::BufReader::new(file);
- let mut buf = [0; 1024 * 1024];
- let mut done = false;
- while ok && !done{
- if let Ok(n) = reader.read(&mut buf) {
- if n == 0 {
- done = true;
- } else if let Err(_) = hasher.write(&buf[0..n]) {
- ok = false;
- }
- } else {
- ok = false;
- }
+fn format_rfc822(e: &DirEntry) -> String {
+ let mut s = String::new();
+ let mut fields = vec![
+ ("Name", format::name(e)),
+ ("Mtime", format::mtime(e)),
+ ("Mode", format::mode(e)),
+ ("Ino", format::inode(e)),
+ ("Dev", format::dev(e)),
+ ("Nlink", format::nlink(e)),
+ ("Size", format::size(e)),
+ ("Uid", format::uid(e)),
+ ("Username", format::username(e)),
+ ("Gid", format::gid(e)),
+ ("Group", format::group(e)),
+ ];
+
+ if let Ok(m) = e.metadata() {
+ if m.is_file() {
+ fields.push(("SHA256", format::sha256(e)))
}
- } else {
- ok = false;
}
- if ok {
- let digest = hasher.finish();
- hex::encode(digest)
- } else {
- format!("can't read file")
+
+ for (name, value) in fields.iter() {
+ s.push_str(&format!("{}: {}\n", name, value));
}
+ s
}