exa.rs 2.1 KB

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