@@ -7,13 +7,16 @@ use anyhow::bail;
7
7
use cargo_util:: paths:: normalize_path;
8
8
use cargo_util:: ProcessBuilder ;
9
9
use std:: fmt:: Write ;
10
+ use std:: path:: Path ;
10
11
use std:: path:: PathBuf ;
11
12
13
+ const ITEM_INDENT : & str = " " ;
14
+
12
15
fn get_available_targets < ' a > (
13
16
filter_fn : fn ( & Target ) -> bool ,
14
17
ws : & ' a Workspace < ' _ > ,
15
18
options : & ' a CompileOptions ,
16
- ) -> CargoResult < Vec < & ' a str > > {
19
+ ) -> CargoResult < Vec < ( & ' a str , & ' a Path ) > > {
17
20
let packages = options. spec . get_packages ( ws) ?;
18
21
19
22
let mut targets: Vec < _ > = packages
@@ -24,7 +27,12 @@ fn get_available_targets<'a>(
24
27
. iter ( )
25
28
. filter ( |target| filter_fn ( target) )
26
29
} )
27
- . map ( Target :: name)
30
+ . map ( |target| {
31
+ (
32
+ target. name ( ) ,
33
+ target. src_path ( ) . path ( ) . expect ( "Target is not a `Metabuild` but one of `Bin` | `Test` | `Bench` | `ExampleBin`" )
34
+ )
35
+ } )
28
36
. collect ( ) ;
29
37
30
38
targets. sort ( ) ;
@@ -48,8 +56,10 @@ fn print_available_targets(
48
56
writeln ! ( output, "No {} available." , plural_name) ?;
49
57
} else {
50
58
writeln ! ( output, "Available {}:" , plural_name) ?;
51
- for target in targets {
52
- writeln ! ( output, " {}" , target) ?;
59
+ let mut shell = ws. gctx ( ) . shell ( ) ;
60
+ for ( name, src_path) in targets {
61
+ let link = shell. err_file_hyperlink ( src_path) ;
62
+ writeln ! ( output, "{ITEM_INDENT}{link}{}{link:#}" , name) ?;
53
63
}
54
64
}
55
65
bail ! ( "{}" , output)
@@ -58,7 +68,7 @@ fn print_available_targets(
58
68
pub fn print_available_packages ( ws : & Workspace < ' _ > ) -> CargoResult < ( ) > {
59
69
let packages = ws
60
70
. members ( )
61
- . map ( |pkg| pkg. name ( ) . as_str ( ) )
71
+ . map ( |pkg| ( pkg. name ( ) . as_str ( ) , pkg . manifest_path ( ) ) )
62
72
. collect :: < Vec < _ > > ( ) ;
63
73
64
74
let mut output = "\" --package <SPEC>\" requires a SPEC format value, \
@@ -72,8 +82,10 @@ pub fn print_available_packages(ws: &Workspace<'_>) -> CargoResult<()> {
72
82
writeln ! ( output, "No packages available." ) ?;
73
83
} else {
74
84
writeln ! ( output, "Possible packages/workspace members:" ) ?;
75
- for package in packages {
76
- writeln ! ( output, " {}" , package) ?;
85
+ let mut shell = ws. gctx ( ) . shell ( ) ;
86
+ for ( name, manifest_path) in packages {
87
+ let link = shell. err_file_hyperlink ( manifest_path) ;
88
+ writeln ! ( output, "{ITEM_INDENT}{link}{}{link:#}" , name) ?;
77
89
}
78
90
}
79
91
bail ! ( "{}" , output)
0 commit comments