exa.rs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #![feature(phase)]
  2. extern crate regex;
  3. #[phase(syntax)] extern crate regex_macros;
  4. use std::os;
  5. use std::io::fs;
  6. use file::File;
  7. use column::defaultColumns;
  8. use options::Options;
  9. pub mod colours;
  10. pub mod column;
  11. pub mod format;
  12. pub mod file;
  13. pub mod unix;
  14. pub mod options;
  15. fn main() {
  16. let args = os::args().iter()
  17. .map(|x| x.to_strbuf())
  18. .collect();
  19. match Options::getopts(args) {
  20. Err(err) => println!("Invalid options:\n{}", err.to_err_msg()),
  21. Ok(opts) => {
  22. let strs = if opts.dirs.is_empty() {
  23. vec!("./".to_strbuf())
  24. }
  25. else {
  26. opts.dirs.clone()
  27. };
  28. for dir in strs.move_iter() {
  29. exa(&opts, Path::new(dir))
  30. }
  31. }
  32. };
  33. }
  34. fn exa(options: &Options, path: Path) {
  35. let paths = match fs::readdir(&path) {
  36. Ok(paths) => paths,
  37. Err(e) => fail!("readdir: {}", e),
  38. };
  39. let mut files = paths.iter().map(|path| File::from_path(path)).collect();
  40. options.sort(&mut files);
  41. if options.reverse {
  42. files.reverse();
  43. }
  44. let columns = defaultColumns();
  45. let table: Vec<Vec<StrBuf>> = files.iter()
  46. .filter(|&f| options.show(f))
  47. .map(|f| columns.iter().map(|c| f.display(c)).collect())
  48. .collect();
  49. let lengths: Vec<Vec<uint>> = table.iter()
  50. .map(|row| row.iter().map( |col| colours::strip_formatting(col).len() ).collect())
  51. .collect();
  52. let maxes: Vec<uint> = range(0, columns.len())
  53. .map(|n| lengths.iter().map(|row| *row.get(n)).max().unwrap())
  54. .collect();
  55. for (field_lengths, row) in lengths.iter().zip(table.iter()) {
  56. let mut first = true;
  57. for ((column_length, cell), field_length) in maxes.iter().zip(row.iter()).zip(field_lengths.iter()) {
  58. if first {
  59. first = false;
  60. } else {
  61. print!(" ");
  62. }
  63. print!("{}", cell.as_slice());
  64. for _ in range(*field_length, *column_length) {
  65. print!(" ");
  66. }
  67. }
  68. print!("\n");
  69. }
  70. }