@@ -118,7 +118,9 @@ impl Display for ResponseFormat {
118
118
}
119
119
120
120
impl ImageResponse {
121
- pub async fn save < P : AsRef < Path > > ( & self , dir : P ) -> Result < ( ) , OpenAIError > {
121
+ /// Save each image in a dedicated Tokio task and return paths to saved files.
122
+ /// For [ResponseFormat::Url] each file is downloaded in dedicated Tokio task.
123
+ pub async fn save < P : AsRef < Path > > ( & self , dir : P ) -> Result < Vec < PathBuf > , OpenAIError > {
122
124
let exists = match Path :: try_exists ( dir. as_ref ( ) ) {
123
125
Ok ( exists) => exists,
124
126
Err ( e) => return Err ( OpenAIError :: FileSaveError ( e. to_string ( ) ) ) ,
@@ -135,38 +137,40 @@ impl ImageResponse {
135
137
handles. push ( tokio:: spawn ( async move { id. save ( dir_buf) . await } ) ) ;
136
138
}
137
139
138
- let result = futures:: future:: join_all ( handles) . await ;
139
-
140
- let errors: Vec < OpenAIError > = result
141
- . into_iter ( )
142
- . filter ( |r| r. is_err ( ) || r. as_ref ( ) . ok ( ) . unwrap ( ) . is_err ( ) )
143
- . map ( |r| match r {
144
- Err ( e) => OpenAIError :: FileSaveError ( e. to_string ( ) ) ,
145
- Ok ( inner) => inner. err ( ) . unwrap ( ) ,
146
- } )
147
- . collect ( ) ;
140
+ let results = futures:: future:: join_all ( handles) . await ;
141
+ let mut errors = vec ! [ ] ;
142
+ let mut paths = vec ! [ ] ;
143
+
144
+ for result in results {
145
+ match result {
146
+ Ok ( inner) => match inner {
147
+ Ok ( path) => paths. push ( path) ,
148
+ Err ( e) => errors. push ( e) ,
149
+ } ,
150
+ Err ( e) => errors. push ( OpenAIError :: FileSaveError ( e. to_string ( ) ) ) ,
151
+ }
152
+ }
148
153
149
- if errors. len ( ) > 0 {
154
+ if errors. is_empty ( ) {
155
+ Ok ( paths)
156
+ } else {
150
157
Err ( OpenAIError :: FileSaveError (
151
158
errors
152
159
. into_iter ( )
153
160
. map ( |e| e. to_string ( ) )
154
161
. collect :: < Vec < String > > ( )
155
162
. join ( "; " ) ,
156
163
) )
157
- } else {
158
- Ok ( ( ) )
159
164
}
160
165
}
161
166
}
162
167
163
168
impl ImageData {
164
- async fn save < P : AsRef < Path > > ( & self , dir : P ) -> Result < ( ) , OpenAIError > {
169
+ async fn save < P : AsRef < Path > > ( & self , dir : P ) -> Result < PathBuf , OpenAIError > {
165
170
match self {
166
- ImageData :: Url ( url) => download_url ( url, dir) . await ? ,
167
- ImageData :: B64Json ( b64_json) => save_b64 ( b64_json, dir) . await ? ,
171
+ ImageData :: Url ( url) => download_url ( url, dir) . await ,
172
+ ImageData :: B64Json ( b64_json) => save_b64 ( b64_json, dir) . await ,
168
173
}
169
- Ok ( ( ) )
170
174
}
171
175
}
172
176
0 commit comments