1    let load_directory (path : String) (directory : FileItem) : Unit =
2        let files = List<FileItem>.new
3        if directory.items.is_not_empty then
4            for file in directory.items do
5                assert file.is_crate
6                files.add file
7    
8            directory.items.clear
9    
10       let names = fs/list_files path
11       let mut order_file_exists = false
12       for name in names do
13           if name.starts_with '.' then
14               if name == ".order" then
15                   order_file_exists = true
16   
17               continue
18   
19           let file_path = "$path/$name"
20           let file = FileItem
21               is_root = false
22               =name
23               actual_name = name
24               path = file_path
25               actual_path = file_path
26               directory_path = path
27               actual_directory_path = path
28               modified = fs/modified_time file_path
29               foreground = Colors.tree_foreground
30               parent = directory
31               actual_parent = directory
32   
33           if fs/is_directory file_path then
34               file.is_directory = true
35               load_directory file_path file
36   
37           files.add file
38   
39       if order_file_exists then
40           let order_path = "$path/.order"
41           let order_text = fs/read_text order_path
42           let map = Map<String, i32>.new
43           let mut index = 0
44           for line in order_text.lines do
45               map.add line index
46               index += 1
47   
48           files.sort_by_key { x -> map.try_get x.name |> unwrap_or i32.max }
49           directory.order_text = order_text
50   
51       for file in files do
52           directory.items.add file
53   
54   def load_crate (name : String) (editor : Editor) : Unit =
55       let crates_path = editor.crates_path
56       let path = "$crates_path/$name"
57       let file_path = "$path/.crate"
58   
59       let data = editor.data
60       let crates = editor.crates
61       let crate_names = fs/read_text file_path
62           |> lines
63           |> filter { _.starts_with "use " }
64           |> map { line -> let parts = line.split ' '
65                            assert parts.size == 2
66                            parts[1] }
67   
68       for crate_name in crate_names do
69           if not crates.any { _.name == crate_name } then
70               load_crate crate_name editor
71   
72       let crate = FileItem
73           is_root = false
74           =name
75           actual_name = name
76           =path
77           actual_path = path
78           directory_path = crates_path
79           actual_directory_path = crates_path
80           is_directory = true
81           is_crate = true
82           parent = data
83           actual_parent = data
84   
85       load_directory path crate
86   
87       data.items.add crate
88       crates.add crate
89