1
- use anyhow:: Result ;
1
+ use anyhow:: { bail , Result } ;
2
2
use std:: path:: PathBuf ;
3
3
use std:: process:: Command ;
4
4
5
- #[ derive( Clone , Debug ) ]
5
+ use crate :: devices:: adb:: Adb ;
6
+
7
+ #[ derive( Debug ) ]
6
8
pub struct Doctor {
7
9
groups : Vec < Group > ,
8
10
}
@@ -35,7 +37,11 @@ impl Default for Doctor {
35
37
Group {
36
38
name: "android" ,
37
39
checks: vec![
38
- Check :: new( "adb" , Some ( VersionCheck :: new( "--version" , 0 , 4 ) ) ) ,
40
+ Check :: with_path(
41
+ "adb" ,
42
+ Adb :: which( ) ,
43
+ Some ( VersionCheck :: new( "--version" , 0 , 4 ) ) ,
44
+ ) ,
39
45
Check :: new( "javac" , Some ( VersionCheck :: new( "--version" , 0 , 1 ) ) ) ,
40
46
Check :: new( "java" , Some ( VersionCheck :: new( "--version" , 0 , 1 ) ) ) ,
41
47
Check :: new( "kotlin" , Some ( VersionCheck :: new( "-version" , 0 , 2 ) ) ) ,
@@ -77,7 +83,7 @@ impl std::fmt::Display for Doctor {
77
83
}
78
84
}
79
85
80
- #[ derive( Clone , Debug ) ]
86
+ #[ derive( Debug ) ]
81
87
struct Group {
82
88
name : & ' static str ,
83
89
checks : Vec < Check > ,
@@ -105,15 +111,32 @@ impl std::fmt::Display for Group {
105
111
}
106
112
}
107
113
108
- #[ derive( Clone , Copy , Debug ) ]
114
+ #[ derive( Debug ) ]
109
115
struct Check {
110
116
name : & ' static str ,
117
+ location : Option < Result < PathBuf > > ,
111
118
version : Option < VersionCheck > ,
112
119
}
113
120
114
121
impl Check {
115
122
pub const fn new ( name : & ' static str , version : Option < VersionCheck > ) -> Self {
116
- Self { name, version }
123
+ Self {
124
+ name,
125
+ location : None ,
126
+ version,
127
+ }
128
+ }
129
+
130
+ pub const fn with_path (
131
+ name : & ' static str ,
132
+ path : Result < PathBuf > ,
133
+ version : Option < VersionCheck > ,
134
+ ) -> Self {
135
+ Self {
136
+ name,
137
+ location : Some ( path) ,
138
+ version,
139
+ }
117
140
}
118
141
}
119
142
@@ -131,17 +154,22 @@ impl VersionCheck {
131
154
}
132
155
133
156
impl Check {
134
- fn name ( self ) -> & ' static str {
157
+ fn name ( & self ) -> & ' static str {
135
158
self . name
136
159
}
137
160
138
- fn path ( self ) -> Result < PathBuf > {
139
- Ok ( which:: which ( self . name ) ?)
161
+ fn path ( & self ) -> Result < PathBuf > {
162
+ Ok ( match & self . location {
163
+ Some ( Ok ( path) ) => path. clone ( ) ,
164
+ // Cannot clone the error:
165
+ Some ( Err ( e) ) => bail ! ( "{:?}" , e) ,
166
+ None => which:: which ( self . name ) ?,
167
+ } )
140
168
}
141
169
142
- fn version ( self ) -> Result < Option < String > > {
170
+ fn version ( & self ) -> Result < Option < String > > {
143
171
if let Some ( version) = self . version {
144
- let output = Command :: new ( self . name )
172
+ let output = Command :: new ( self . path ( ) ? )
145
173
. args ( version. arg . split ( ' ' ) )
146
174
. output ( ) ?;
147
175
anyhow:: ensure!( output. status. success( ) , "failed to run {}" , self . name) ;
0 commit comments