Skip to content

Commit af28d71

Browse files
committed
first take at form data
1 parent 3a5fe99 commit af28d71

File tree

10 files changed

+272
-37
lines changed

10 files changed

+272
-37
lines changed

Cargo.lock

Lines changed: 39 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ You'll need to add the following to `Cargo.toml`:
3636
[dependencies]
3737
+futures = "0.3"
3838
+progenitor = { git = "https://github.com/oxidecomputer/progenitor" }
39-
+reqwest = { version = "0.11", features = ["json", "stream"] }
39+
+reqwest = { version = "0.11", features = ["json", "stream", "multipart"] }
4040
+serde = { version = "1.0", features = ["derive"] }
4141
```
4242

@@ -123,7 +123,7 @@ You'll need to add the following to `Cargo.toml`:
123123
[dependencies]
124124
+futures = "0.3"
125125
+progenitor-client = { git = "https://github.com/oxidecomputer/progenitor" }
126-
+reqwest = { version = "0.11", features = ["json", "stream"] }
126+
+reqwest = { version = "0.11", features = ["json", "stream", "multipart"] }
127127
+serde = { version = "1.0", features = ["derive"] }
128128

129129
[build-dependencies]
@@ -180,7 +180,7 @@ bytes = "1.3.0"
180180
chrono = { version = "0.4.23", default-features=false, features = ["serde"] }
181181
futures-core = "0.3.25"
182182
percent-encoding = "2.2.0"
183-
reqwest = { version = "0.11.13", default-features=false, features = ["json", "stream"] }
183+
reqwest = { version = "0.11.13", default-features=false, features = ["json", "stream", "multipart"] }
184184
serde = { version = "1.0.152", features = ["derive"] }
185185
serde_urlencoded = "0.7.1"
186186

example-build/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ edition = "2021"
77
[dependencies]
88
chrono = { version = "0.4", features = ["serde"] }
99
progenitor-client = { path = "../progenitor-client" }
10-
reqwest = { version = "0.11.16", features = ["json", "stream"] }
10+
reqwest = { version = "0.11.16", features = ["json", "stream", "multipart"] }
1111
base64 = "0.21"
1212
rand = "0.8"
1313
serde = { version = "1.0", features = ["derive"] }

example-macro/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ edition = "2021"
77
[dependencies]
88
chrono = { version = "0.4", features = ["serde"] }
99
progenitor = { path = "../progenitor" }
10-
reqwest = { version = "0.11.16", features = ["json", "stream"] }
10+
reqwest = { version = "0.11.16", features = ["json", "stream", "multipart"] }
1111
schemars = { version = "0.8.12", features = ["uuid1"] }
1212
serde = { version = "1.0", features = ["derive"] }
1313
uuid = { version = "1.3", features = ["serde", "v4"] }

progenitor-client/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ description = "An OpenAPI client generator - client support"
1010
bytes = "1.4.0"
1111
futures-core = "0.3.27"
1212
percent-encoding = "2.2"
13-
reqwest = { version = "0.11.16", default-features = false, features = ["json", "stream"] }
13+
reqwest = { version = "0.11.16", default-features = false, features = ["json", "stream", "multipart"] }
1414
serde = "1.0"
1515
serde_json = "1.0"
1616
serde_urlencoded = "0.7.1"

progenitor-client/src/progenitor_client.rs

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -386,11 +386,23 @@ pub fn encode_path(pc: &str) -> String {
386386
}
387387

388388
#[doc(hidden)]
389-
pub trait RequestBuilderExt<E> {
389+
pub trait RequestBuilderExt<E>
390+
where
391+
Self: Sized,
392+
{
390393
fn form_urlencoded<T: Serialize + ?Sized>(
391394
self,
392395
body: &T,
393396
) -> Result<RequestBuilder, Error<E>>;
397+
398+
fn form_from_raw<
399+
S: AsRef<str>,
400+
T: AsRef<[u8]>,
401+
I: Sized + IntoIterator<Item = (S, T)>,
402+
>(
403+
self,
404+
iter: I,
405+
) -> Result<Self, Error<E>>;
394406
}
395407

396408
impl<E> RequestBuilderExt<E> for RequestBuilder {
@@ -405,8 +417,37 @@ impl<E> RequestBuilderExt<E> for RequestBuilder {
405417
"application/x-www-form-urlencoded",
406418
),
407419
)
408-
.body(serde_urlencoded::to_string(body).map_err(|_| {
409-
Error::InvalidRequest("failed to serialize body".to_string())
420+
.body(serde_urlencoded::to_string(body).map_err(|e| {
421+
Error::InvalidRequest(format!(
422+
"failed to serialize body: {e:?}"
423+
))
410424
})?))
411425
}
426+
427+
fn form_from_raw<
428+
S: AsRef<str>,
429+
T: AsRef<[u8]>,
430+
I: Sized + IntoIterator<Item = (S, T)>,
431+
>(
432+
self,
433+
mut iter: I,
434+
) -> Result<Self, Error<E>> {
435+
use reqwest::multipart::{Form, Part};
436+
437+
let mut form = Form::new();
438+
for (name, value) in iter {
439+
form = form.part(
440+
name.as_ref().to_owned(),
441+
Part::stream(Vec::from(value.as_ref())),
442+
);
443+
}
444+
Ok(self
445+
.header(
446+
reqwest::header::CONTENT_TYPE,
447+
reqwest::header::HeaderValue::from_static(
448+
"multipart/form-data",
449+
),
450+
)
451+
.multipart(form))
452+
}
412453
}

progenitor-impl/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ readme = "../README.md"
1111
heck = "0.4.1"
1212
getopts = "0.2"
1313
indexmap = "1.9"
14+
itertools = "0.10"
1415
openapiv3 = "1.0.0"
1516
proc-macro2 = "1.0"
1617
quote = "1.0"

0 commit comments

Comments
 (0)