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