1
1
use colored:: * ;
2
2
use std:: env;
3
3
use std:: fs;
4
+ use std:: io;
4
5
use std:: path:: PathBuf ;
5
6
use std:: process:: { Command , Stdio } ;
6
7
use thiserror:: Error ;
@@ -43,35 +44,52 @@ pub fn list() {
43
44
. for_each ( |formatted_command| println ! ( "{}" , formatted_command) ) ;
44
45
}
45
46
47
+ fn get_development_binaries_dir ( ) -> Result < std:: path:: PathBuf , io:: Error > {
48
+ let current_exe = env:: current_exe ( ) ?;
49
+
50
+ let build_type = if cfg ! ( debug_assertions) {
51
+ "debug"
52
+ } else {
53
+ "release"
54
+ } ;
55
+
56
+ let build_path = current_exe
57
+ . parent ( )
58
+ . and_then ( |p| p. parent ( ) )
59
+ . map ( |p| p. join ( build_type) )
60
+ . ok_or_else ( || {
61
+ io:: Error :: new (
62
+ io:: ErrorKind :: Other ,
63
+ "Failed to construct path of development dir" ,
64
+ )
65
+ } ) ?;
66
+
67
+ Ok ( build_path)
68
+ }
69
+
70
+ fn get_installed_binaries_dirs ( ) -> impl Iterator < Item = std:: path:: PathBuf > {
71
+ env:: var ( "PATH" )
72
+ . ok ( )
73
+ . into_iter ( )
74
+ . flat_map ( |path_var| env:: split_paths ( & path_var) . collect :: < Vec < _ > > ( ) )
75
+ }
76
+
46
77
fn find ( ) -> Vec < CommandInfo > {
47
- let development_commands = find_command_binaries_in_development_dirs ( ) ;
48
- let installed_commands = find_command_binaries_in_system_path ( ) ;
78
+ let development_commands = find_development_command_binaries ( ) ;
79
+ let installed_commands = find_installed_command_binaries ( ) ;
49
80
50
81
let mut all_commands = development_commands;
51
82
all_commands. extend ( installed_commands. iter ( ) . cloned ( ) ) ;
52
83
all_commands
53
84
}
54
85
55
- fn find_command_binaries_in_development_dirs ( ) -> Vec < CommandInfo > {
56
- let current_exe = match env :: current_exe ( ) {
57
- Ok ( exe ) => exe ,
86
+ fn find_development_command_binaries ( ) -> Vec < CommandInfo > {
87
+ let development_binaries_dir = match get_development_binaries_dir ( ) {
88
+ Ok ( location ) => location ,
58
89
Err ( _) => return Vec :: new ( ) ,
59
90
} ;
60
- let build_type = if cfg ! ( debug_assertions) {
61
- "debug"
62
- } else {
63
- "release"
64
- } ;
65
91
66
- // Get the location of the binary directory for the build
67
- let binary_dir = current_exe
68
- . parent ( )
69
- . unwrap ( )
70
- . parent ( )
71
- . unwrap ( )
72
- . join ( build_type) ;
73
-
74
- fs:: read_dir ( binary_dir)
92
+ fs:: read_dir ( development_binaries_dir)
75
93
. ok ( )
76
94
. into_iter ( )
77
95
. flat_map ( |entries| entries. filter_map ( Result :: ok) )
@@ -92,11 +110,9 @@ fn find_command_binaries_in_development_dirs() -> Vec<CommandInfo> {
92
110
. collect ( )
93
111
}
94
112
95
- fn find_command_binaries_in_system_path ( ) -> Vec < CommandInfo > {
96
- env:: var ( "PATH" )
97
- . ok ( )
113
+ fn find_installed_command_binaries ( ) -> Vec < CommandInfo > {
114
+ get_installed_binaries_dirs ( )
98
115
. into_iter ( )
99
- . flat_map ( |path_var| env:: split_paths ( & path_var) . collect :: < Vec < _ > > ( ) )
100
116
. flat_map ( |path : PathBuf | {
101
117
fs:: read_dir ( path)
102
118
. into_iter ( )
@@ -130,6 +146,26 @@ fn is_valid_command_binary(path: &PathBuf) -> bool {
130
146
&& path. extension ( ) . is_none ( ) // Exclude files with extensions (e.g. '.d')
131
147
}
132
148
149
+ pub fn paths ( ) {
150
+ let mut development_binaries_dirs = Vec :: new ( ) ;
151
+ development_binaries_dirs. extend ( get_development_binaries_dir ( ) . ok ( ) ) ;
152
+
153
+ let mut installed_binaries_dirs = Vec :: new ( ) ;
154
+ installed_binaries_dirs. extend ( get_installed_binaries_dirs ( ) ) ;
155
+
156
+ println ! ( "{}" , "Development Binary Paths:" . bright_green( ) . bold( ) ) ;
157
+ for dir in & development_binaries_dirs {
158
+ println ! ( " {}" , dir. display( ) . to_string( ) . bold( ) ) ;
159
+ }
160
+
161
+ println ! ( ) ;
162
+
163
+ println ! ( "{}" , "Installed Binary Paths:" . bright_green( ) . bold( ) ) ;
164
+ for dir in & installed_binaries_dirs {
165
+ println ! ( " {}" , dir. display( ) . to_string( ) . bold( ) ) ;
166
+ }
167
+ }
168
+
133
169
pub fn execute_external_command (
134
170
command_name : & str ,
135
171
args : & [ String ] ,
0 commit comments