1use {GitDirectory, DirectoryEntry, TreeEntryExt};
2use std::cmp::Ordering;
3use git2::Tree;
4
5pub trait TreeExt {
7 fn entry_names(&self) -> Vec<String>;
9
10 fn dir_listing(&self) -> GitDirectory;
13}
14
15impl<'repo> TreeExt for Tree<'repo> {
16 fn entry_names(&self) -> Vec<String> {
17 self.iter()
18 .filter_map(|n|
19 if let Some(s) = n.name() {
20 Some(s.to_owned())
21 } else {
22 None
23 })
24 .collect()
25 }
26
27 fn dir_listing(&self) -> GitDirectory {
28 let mut dirs: Vec<DirectoryEntry> = vec![];
29 let mut files: Vec<DirectoryEntry> = vec![];
30
31 let names = self.entry_names();
32
33 names.into_iter().for_each(|name| {
34 if let Some(node) = self.get_name(&name) {
35 let entry = DirectoryEntry {
36 name,
37 node,
38 };
39
40 if entry.node.is_dir() {
41 dirs.push(entry);
42 } else {
43 files.push(entry);
44 }
45 }
46 });
47
48 let sort_alpha: fn(&DirectoryEntry, &DirectoryEntry) -> Ordering =
49 |a, b| a.name.cmp(&b.name);
50
51 dirs.sort_by(sort_alpha);
52 files.sort_by(sort_alpha);
53
54 GitDirectory {
55 dirs,
56 files,
57 }
58 }
59}