Parcourir la source

Add --all command-line option

Also add command-line-option-handling code.
Ben S il y a 11 ans
Parent
commit
e0fc84e869
1 fichiers modifiés avec 32 ajouts et 6 suppressions
  1. 32 6
      exa.rs

+ 32 - 6
exa.rs

@@ -1,3 +1,4 @@
+extern crate getopts;
 use std::io::fs;
 use std::io::fs;
 use std::io;
 use std::io;
 use std::os;
 use std::os;
@@ -5,12 +6,33 @@ use std::os;
 use colours::{Plain, Style, Black, Red, Green, Yellow, Blue, Purple, Cyan};
 use colours::{Plain, Style, Black, Red, Green, Yellow, Blue, Purple, Cyan};
 mod colours;
 mod colours;
 
 
+struct Options {
+    showInvisibles: bool,
+}
+
 fn main() {
 fn main() {
-    match os::args().as_slice() {
-        [] => unreachable!(),
-        [_] => { list(Path::new(".")) },
-        [_, ref p] => { list(Path::new(p.as_slice())) },
-        _ => { fail!("args?") },
+    let args = os::args();
+    let program = args[0].as_slice();
+    let opts = ~[
+        getopts::optflag("a", "all", "show dot-files")
+    ];
+
+    let matches = match getopts::getopts(args.tail(), opts) {
+        Ok(m) => m,
+        Err(f) => {
+            fail!("Invalid options\n{}", f.to_err_msg());
+            return
+        }
+    };
+
+    let opts = Options {
+        showInvisibles: matches.opt_present("all")
+    };
+
+    let strs = if matches.free.is_empty() {vec!(~"./")} else {matches.free.clone()};
+
+    for dir in strs.move_iter() {
+        list(opts, Path::new(dir))
     }
     }
 }
 }
 
 
@@ -105,7 +127,7 @@ impl<'a> File<'a> {
     }
     }
 }
 }
 
 
-fn list(path: Path) {
+fn list(opts: Options, path: Path) {
     let mut files = match fs::readdir(&path) {
     let mut files = match fs::readdir(&path) {
         Ok(files) => files,
         Ok(files) => files,
         Err(e) => fail!("readdir: {}", e),
         Err(e) => fail!("readdir: {}", e),
@@ -114,6 +136,10 @@ fn list(path: Path) {
     for subpath in files.iter() {
     for subpath in files.iter() {
         let file = File::from_path(subpath);
         let file = File::from_path(subpath);
 
 
+        if file.name.starts_with(".") && !opts.showInvisibles {
+            continue;
+        }
+
         let columns = ~[
         let columns = ~[
             ~Permissions as ~Column,
             ~Permissions as ~Column,
             ~FileSize { useSIPrefixes: false } as ~Column,
             ~FileSize { useSIPrefixes: false } as ~Column,