|
|
@@ -1,7 +1,8 @@
|
|
|
use file::File;
|
|
|
+use std::cmp::lexical_ordering;
|
|
|
|
|
|
pub enum SortField {
|
|
|
- Name, Size
|
|
|
+ Name, Extension, Size
|
|
|
}
|
|
|
|
|
|
pub struct Options {
|
|
|
@@ -14,6 +15,7 @@ impl SortField {
|
|
|
match word.as_slice() {
|
|
|
"name" => Name,
|
|
|
"size" => Size,
|
|
|
+ "ext" => Extension,
|
|
|
_ => fail!("Invalid sorting order"),
|
|
|
}
|
|
|
}
|
|
|
@@ -22,6 +24,11 @@ impl SortField {
|
|
|
match *self {
|
|
|
Name => files.sort_by(|a, b| a.name.cmp(&b.name)),
|
|
|
Size => files.sort_by(|a, b| a.stat.size.cmp(&b.stat.size)),
|
|
|
+ Extension => files.sort_by(|a, b| {
|
|
|
+ let exts = a.ext().cmp(&b.ext());
|
|
|
+ let names = a.name.cmp(&b.name);
|
|
|
+ lexical_ordering(exts, names)
|
|
|
+ }),
|
|
|
}
|
|
|
}
|
|
|
}
|