Skip to content

Commit e9bc44b

Browse files
authored
[Rust] Implement support for multipart file uploads for reqwest-async and reqwest-trait (#22454)
* feat(Rust): Add support for multipart file uploads in reqwest generators * chore: Regen relevant samples affected by the updated multipart support
1 parent 7a48bd8 commit e9bc44b

File tree

23 files changed

+66
-20
lines changed

23 files changed

+66
-20
lines changed

bin/configs/rust-reqwest-petstore-async-middleware.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ inputSpec: modules/openapi-generator/src/test/resources/3_0/rust/petstore.yaml
55
templateDir: modules/openapi-generator/src/main/resources/rust
66
additionalProperties:
77
supportAsync: true
8+
useAsyncFileStream: true
89
supportMiddleware: true
910
supportMultipleResponses: true
1011
packageName: petstore-reqwest-async-middleware

bin/configs/rust-reqwest-petstore-async-tokensource.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ inputSpec: modules/openapi-generator/src/test/resources/3_0/rust/petstore.yaml
55
templateDir: modules/openapi-generator/src/main/resources/rust
66
additionalProperties:
77
supportAsync: true
8+
useAsyncFileStream: true
89
supportTokenSource: true
910
supportMultipleResponses: true
1011
packageName: petstore-reqwest-async-tokensource

bin/configs/rust-reqwest-petstore-async.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ inputSpec: modules/openapi-generator/src/test/resources/3_0/rust/petstore.yaml
55
templateDir: modules/openapi-generator/src/main/resources/rust
66
additionalProperties:
77
supportAsync: true
8+
useAsyncFileStream: true
89
supportMultipleResponses: true
910
packageName: petstore-reqwest-async
1011
useSingleRequestParameter: true

bin/configs/rust-reqwest-petstore-avoid-box.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ inputSpec: modules/openapi-generator/src/test/resources/3_0/rust/petstore.yaml
55
templateDir: modules/openapi-generator/src/main/resources/rust
66
additionalProperties:
77
supportAsync: true
8+
useAsyncFileStream: true
89
supportMultipleResponses: true
910
avoidBoxedModels: true
1011
packageName: petstore-reqwest-avoid-box

bin/configs/rust-reqwest-petstore-serde-path-to-error.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ inputSpec: modules/openapi-generator/src/test/resources/3_0/rust/petstore.yaml
55
templateDir: modules/openapi-generator/src/main/resources/rust
66
additionalProperties:
77
packageName: petstore-reqwest-serde-path-to-error
8+
useAsyncFileStream: true
89
useSerdePathToError: true
910
enumNameMappings:
1011
delivered: shipped

modules/openapi-generator/src/main/resources/rust/Cargo.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ rustls-tls = ["reqwest/rustls-tls"]
9797
{{/reqwest}}
9898
{{#reqwestTrait}}
9999
async-trait = "^0.1"
100-
reqwest = { version = "^0.12", default-features = false, features = ["json", "multipart"] }
100+
reqwest = { version = "^0.12", default-features = false, features = ["json", "multipart", "stream"] }
101101
{{#supportMiddleware}}
102102
reqwest-middleware = { version = "^0.4", features = ["json", "multipart"] }
103103
{{/supportMiddleware}}

modules/openapi-generator/src/main/resources/rust/reqwest-trait/api.mustache

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,14 @@ impl {{classname}} for {{classname}}Client {
391391
let mut local_var_form = reqwest::multipart::Form::new();
392392
{{#formParams}}
393393
{{#isFile}}
394-
// TODO: support file upload for '{{{baseName}}}' parameter
394+
{{^isRequired}}
395+
if let Some(ref path) = {{{baseName}}} {
396+
local_var_form = local_var_form.file("{{{baseName}}}", path.as_os_str()).await?;
397+
}
398+
{{/isRequired}}
399+
{{#isRequired}}
400+
local_var_form = local_var_form.file("{{{baseName}}}", {{{baseName}}}.as_os_str()).await?;
401+
{{/isRequired}}
395402
{{/isFile}}
396403
{{^isFile}}
397404
{{#required}}

modules/openapi-generator/src/main/resources/rust/reqwest/api.mustache

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -397,13 +397,20 @@ pub {{#supportAsync}}async {{/supportAsync}}fn {{{operationId}}}(configuration:
397397
{{/isNullable}}
398398
{{/required}}
399399
{{^required}}
400-
if let Some(param_value) = {{{vendorExtensions.x-rust-param-identifier}}} {
400+
if let Some(ref param_value) = {{{vendorExtensions.x-rust-param-identifier}}} {
401401
multipart_form = multipart_form.file("{{{baseName}}}", param_value)?;
402402
}
403403
{{/required}}
404404
{{/supportAsync}}
405405
{{#supportAsync}}
406-
// TODO: support file upload for '{{{baseName}}}' parameter
406+
{{^required}}
407+
if let Some(ref param_value) = {{{vendorExtensions.x-rust-param-identifier}}} {
408+
multipart_form = multipart_form.file("{{{baseName}}}", param_value.as_os_str()).await?;
409+
}
410+
{{/required}}
411+
{{#required}}
412+
multipart_form = multipart_form.file("{{{baseName}}}", {{{vendorExtensions.x-rust-param-identifier}}}.as_os_str()).await?;
413+
{{/required}}
407414
{{/supportAsync}}
408415
{{/isFile}}
409416
{{^isFile}}
@@ -420,7 +427,12 @@ pub {{#supportAsync}}async {{/supportAsync}}fn {{{operationId}}}(configuration:
420427
{{/required}}
421428
{{^required}}
422429
if let Some(param_value) = {{{vendorExtensions.x-rust-param-identifier}}} {
423-
multipart_form = multipart_form.text("{{{baseName}}}", param_value{{#isArray}}.into_iter().map(|p| p.to_string()).collect::<Vec<String>>().join(","){{/isArray}}.to_string());
430+
{{#isPrimitiveType}}
431+
multipart_form = multipart_form.text("{{{baseName}}}", param_value.to_string());
432+
{{/isPrimitiveType}}
433+
{{^isPrimitiveType}}
434+
multipart_form = multipart_form.text("{{{baseName}}}", serde_json::to_string(&param_value)?);
435+
{{/isPrimitiveType}}
424436
}
425437
{{/required}}
426438
{{/isFile}}

samples/client/petstore/rust/reqwest-trait/petstore/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ serde_repr = "^0.1"
1414
url = "^2.5"
1515
uuid = { version = "^1.8", features = ["serde", "v4"] }
1616
async-trait = "^0.1"
17-
reqwest = { version = "^0.12", default-features = false, features = ["json", "multipart"] }
17+
reqwest = { version = "^0.12", default-features = false, features = ["json", "multipart", "stream"] }
1818
mockall = { version = "^0.13", optional = true}
1919
[features]
2020
default = ["native-tls"]

samples/client/petstore/rust/reqwest-trait/petstore/src/apis/pet_api.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,9 @@ impl PetApi for PetApiClient {
480480
if let Some(local_var_param_value) = additional_metadata {
481481
local_var_form = local_var_form.text("additionalMetadata", local_var_param_value.to_string());
482482
}
483-
// TODO: support file upload for 'file' parameter
483+
if let Some(ref path) = file {
484+
local_var_form = local_var_form.file("file", path.as_os_str()).await?;
485+
}
484486
local_var_req_builder = local_var_req_builder.multipart(local_var_form);
485487

486488
let local_var_req = local_var_req_builder.build()?;

0 commit comments

Comments
 (0)