@@ -23,20 +23,27 @@ pub async fn download(
23
23
chip : Option < String > ,
24
24
version : Option < String > ,
25
25
) -> Result < ( ) > {
26
- println ! ( "⛅ Grabbing binaries from the server ..." ) ;
27
-
28
26
let query = client. run_query ( Chips :: build ( ( ) ) ) . await ?;
29
27
let chips = query. current_provisioner . project . chips ;
30
28
29
+ let chips_string =
30
+ chips
31
+ . iter ( )
32
+ . map ( |chip| chip. name . clone ( ) )
33
+ . fold ( String :: new ( ) , |acc, chip| {
34
+ if acc. is_empty ( ) {
35
+ chip. to_string ( )
36
+ } else {
37
+ format ! ( "{acc}, {chip}" )
38
+ }
39
+ } ) ;
40
+
31
41
let chip = if let Some ( chip_name) = chip {
32
42
chips
33
43
. iter ( )
34
44
. find ( |chip| chip. name == chip_name)
35
45
. ok_or_else ( || {
36
- anyhow ! (
37
- "Chip {chip_name} not found. Available chips: {:?}" ,
38
- chips. iter( ) . map( |chip| chip. name. clone( ) )
39
- )
46
+ anyhow ! ( "Chip `{chip_name}` not found. Available chips: [ {chips_string} ]" )
40
47
} ) ?
41
48
} else {
42
49
match chips. len ( ) {
@@ -45,41 +52,57 @@ pub async fn download(
45
52
"No chips have been configured for this project. Add one to the project first."
46
53
) ) )
47
54
}
48
- 1 => chips. iter ( ) . next ( ) . unwrap ( ) ,
49
- _ => return Err ( Error :: Other ( anyhow ! (
50
- "Multiple chips found for this project. Please specify one. Available chips: {:?}" ,
51
- chips. iter( ) . map( |chip| chip. name. clone( ) )
52
- ) ) ) ,
55
+ 1 => chips. first ( ) . unwrap ( ) ,
56
+ _ => {
57
+ return Err ( Error :: Other ( anyhow ! (
58
+ "Multiple chips found for this project. Please specify one. Available chips: [ {chips_string} ]"
59
+ ) ) )
60
+ }
53
61
}
54
62
} ;
55
63
56
64
let binaries = & chip. binaries ;
57
65
let binary = if let Some ( version) = version {
66
+ let version = semver:: Version :: parse ( & version) ?;
58
67
binaries
59
68
. iter ( )
60
69
. find ( |bin| bin. version ( ) == version)
61
70
. ok_or_else ( || {
71
+ let mut versions: Vec < semver:: Version > = binaries. iter ( ) . map ( |bin| bin. version ( ) ) . collect ( ) ;
72
+ versions. sort ( ) ;
73
+ versions. reverse ( ) ;
74
+
62
75
anyhow ! (
63
- "Binary version {version} not found for chip {} . Available versions: {:?} " ,
76
+ "Binary version ` {version}` not found for chip `{}` . Available versions: [ {} ] " ,
64
77
chip. name,
65
- binaries. iter( ) . map( |bin| bin. version( ) )
66
- )
78
+ versions. iter( ) . fold( String :: new( ) , |acc, version| {
79
+ if acc. is_empty( ) {
80
+ version. to_string( )
81
+ } else {
82
+ format!( "{acc}, {version}" )
83
+ }
84
+ }
85
+ ) )
67
86
} ) ?
68
87
} else {
69
- match binaries. len ( ) {
70
- 0 => return Err ( Error :: Other ( anyhow ! (
71
- "No binaries have been configured for chip {}. Add a binary to this chip first." ,
88
+ // Otherwise, find the newest binary.
89
+ let Some ( binary) = binaries. iter ( ) . max_by_key ( |x| x. version ( ) ) else {
90
+ return Err ( Error :: Other ( anyhow ! (
91
+ "No binaries have been uploaded for chip {}" ,
72
92
chip. name
73
- ) ) ) ,
74
- 1 => binaries. iter ( ) . next ( ) . unwrap ( ) ,
75
- _ => return Err ( Error :: Other ( anyhow ! (
76
- "Multiple binaries found for chip {}. Please specify one. Available versions: {:?}" ,
77
- chip. name,
78
- binaries. iter( ) . map( |bin| bin. version( ) )
79
- ) ) ) ,
80
- }
93
+ ) ) ) ;
94
+ } ;
95
+ binary
81
96
} ;
82
97
98
+ println ! (
99
+ " -> Flashing firmware v{} onto {} ({})" ,
100
+ binary. version( ) ,
101
+ chip. name,
102
+ chip. part_number
103
+ ) ;
104
+ println ! ( "⛅ Grabbing binaries from the server ..." ) ;
105
+
83
106
let result = run_flash_download ( client, & chip, binary) . await ;
84
107
85
108
if result. is_err ( ) {
@@ -107,7 +130,7 @@ async fn run_flash_download(
107
130
}
108
131
109
132
// Create a new session
110
- let mut session = probe. attach ( & chip. name , probe_rs:: Permissions :: default ( ) ) ?;
133
+ let mut session = probe. attach ( & chip. part_number , probe_rs:: Permissions :: default ( ) ) ?;
111
134
112
135
let target = session. target ( ) ;
113
136
0 commit comments