Skip to content

Commit 401c720

Browse files
committed
Add our changes to the templates
1 parent edc7ace commit 401c720

File tree

10 files changed

+153
-116
lines changed

10 files changed

+153
-116
lines changed

Cargo.lock

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

crates/bitwarden-api-api/Cargo.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@ repository.workspace = true
1212
license-file.workspace = true
1313
keywords.workspace = true
1414

15+
[features]
16+
mockall = ["dep:mockall"]
17+
1518
[dependencies]
19+
async-trait = { workspace = true }
20+
mockall = { version = ">=0.13, <0.14", optional = true }
1621
reqwest = { workspace = true }
1722
serde = { workspace = true }
1823
serde_json = { workspace = true }

crates/bitwarden-api-identity/Cargo.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@ repository.workspace = true
1212
license-file.workspace = true
1313
keywords.workspace = true
1414

15+
[features]
16+
mockall = ["dep:mockall"]
17+
1518
[dependencies]
19+
async-trait = { workspace = true }
20+
mockall = { version = ">=0.13, <0.14", optional = true }
1621
reqwest = { workspace = true }
1722
serde = { workspace = true }
1823
serde_json = { workspace = true }

crates/bitwarden-core/src/client/client.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,15 @@ impl Client {
6666
HeaderValue::from_str(&(settings.device_type as u8).to_string())
6767
.expect("All numbers are valid ASCII"),
6868
);
69-
let client_builder = new_client_builder().default_headers(headers);
69+
let client_builder = new_client_builder()
70+
.default_headers(headers)
71+
.user_agent(settings.user_agent);
7072

7173
let client = client_builder.build().expect("Build should not fail");
7274

7375
let identity = bitwarden_api_identity::apis::configuration::Configuration {
7476
base_path: settings.identity_url,
75-
user_agent: Some(settings.user_agent.clone()),
77+
user_agent: None,
7678
client: client.clone(),
7779
basic_auth: None,
7880
oauth_access_token: None,
@@ -82,7 +84,7 @@ impl Client {
8284

8385
let api = bitwarden_api_api::apis::configuration::Configuration {
8486
base_path: settings.api_url,
85-
user_agent: Some(settings.user_agent),
87+
user_agent: None,
8688
client,
8789
basic_auth: None,
8890
oauth_access_token: None,

support/build-api.sh

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ npx openapi-generator-cli generate \
1818
-o crates/bitwarden-api-api \
1919
--package-name bitwarden-api-api \
2020
-t ./support/openapi-template \
21-
--additional-properties=packageVersion=$VERSION,packageDescription=\"Api bindings for the Bitwarden API.\"
21+
--additional-properties=library=reqwest-trait,topLevelApiClient,packageVersion=$VERSION,packageDescription=\"Api bindings for the Bitwarden API.\"
2222

2323
# Delete old directory to ensure all files are updated
2424
rm -rf crates/bitwarden-api-identity/src
@@ -30,8 +30,23 @@ npx openapi-generator-cli generate \
3030
-o crates/bitwarden-api-identity \
3131
--package-name bitwarden-api-identity \
3232
-t ./support/openapi-template \
33-
--additional-properties=packageVersion=$VERSION,packageDescription=\"Api bindings for the Bitwarden Identity API.\"
33+
--additional-properties=library=reqwest-trait,topLevelApiClient,packageVersion=$VERSION,packageDescription=\"Api bindings for the Bitwarden Identity API.\"
3434

3535
rustup toolchain install nightly
36+
37+
# Rustfmt has what looks like a bug, where it requires multiple passes to format the code.
38+
# For example with code like this:
39+
# ```rust
40+
# /// Test Doc
41+
# ///
42+
# ///
43+
# fn test() {}
44+
# ```
45+
# The first pass will remove one of the empty lines but not the second one, so we need a
46+
# second pass to remove the second empty line. The swagger generated code adds three comment
47+
# lines, for path, description and notes and for us the last two are usually empty, which explains
48+
# the need for these two passes.
49+
cargo +nightly fmt
3650
cargo +nightly fmt
51+
3752
npm run prettier

support/openapi-template/lib.mustache

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1-
#![allow(unused_imports)]
2-
#![allow(clippy::too_many_arguments)]
1+
#![allow(unused_imports, unused_variables, unused_mut, non_camel_case_types)]
2+
#![allow(
3+
clippy::too_many_arguments,
4+
clippy::empty_docs,
5+
clippy::to_string_in_format_args,
6+
clippy::needless_return,
7+
clippy::uninlined_format_args,
8+
clippy::new_without_default
9+
)]
310

411
extern crate serde_repr;
512
extern crate serde;

support/openapi-template/model.mustache

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -129,12 +129,12 @@ pub struct {{{classname}}} {
129129
/// {{{.}}}
130130
{{/description}}
131131
{{#isByteArray}}
132-
{{#vendorExtensions.isMandatory}}#[serde_as(as = "serde_with::base64::Base64")]{{/vendorExtensions.isMandatory}}{{^vendorExtensions.isMandatory}}#[serde_as(as = "{{^serdeAsDoubleOption}}Option{{/serdeAsDoubleOption}}{{#serdeAsDoubleOption}}super::DoubleOption{{/serdeAsDoubleOption}}<serde_with::base64::Base64>")]{{/vendorExtensions.isMandatory}}
132+
{{#vendorExtensions.isMandatory}}#[serde_as(as = "serde_with::base64::Base64")]{{/vendorExtensions.isMandatory}}{{^vendorExtensions.isMandatory}}#[serde_as(as = "Option<serde_with::base64::Base64>")]{{/vendorExtensions.isMandatory}}
133133
{{/isByteArray}}
134-
#[serde(rename = "{{{baseName}}}"{{^required}}{{#isNullable}}, default{{^isByteArray}}, with = "::serde_with::rust::double_option"{{/isByteArray}}{{/isNullable}}{{/required}}{{^required}}, skip_serializing_if = "Option::is_none"{{/required}}{{#required}}{{#isNullable}}, deserialize_with = "Option::deserialize"{{/isNullable}}{{/required}})]
134+
#[serde(rename = "{{{baseName}}}"{{^required}}, skip_serializing_if = "Option::is_none"{{/required}})]
135135
pub {{{name}}}: {{!
136136
### Option Start
137-
}}{{#isNullable}}Option<{{/isNullable}}{{^required}}Option<{{/required}}{{!
137+
}}{{#isNullable}}Option<{{/isNullable}}{{^required}}{{^isNullable}}Option<{{/isNullable}}{{/required}}{{!
138138
### Enums
139139
}}{{#isEnum}}{{#isArray}}{{#uniqueItems}}std::collections::HashSet<{{/uniqueItems}}{{^uniqueItems}}Vec<{{/uniqueItems}}{{/isArray}}{{{enumName}}}{{#isArray}}>{{/isArray}}{{/isEnum}}{{!
140140
### Non-Enums Start
@@ -146,7 +146,7 @@ pub struct {{{classname}}} {
146146
### Non-Enums End
147147
}}{{/isEnum}}{{!
148148
### Option End (and trailing comma)
149-
}}{{#isNullable}}>{{/isNullable}}{{^required}}>{{/required}},
149+
}}{{#isNullable}}>{{/isNullable}}{{^required}}{{^isNullable}}>{{/isNullable}}{{/required}},
150150
{{/vars}}
151151
}
152152

support/openapi-template/model_mod.mustache

Lines changed: 0 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4,42 +4,3 @@ pub mod {{{classFilename}}};
44
pub use self::{{{classFilename}}}::{{{classname}}};
55
{{/model}}
66
{{/models}}
7-
{{#serdeAsDoubleOption}}
8-
use serde::{Deserialize, Deserializer, Serializer};
9-
use serde_with::{de::DeserializeAsWrap, ser::SerializeAsWrap, DeserializeAs, SerializeAs};
10-
use std::marker::PhantomData;
11-
12-
pub(crate) struct DoubleOption<T>(PhantomData<T>);
13-
14-
impl<T, TAs> SerializeAs<Option<Option<T>>> for DoubleOption<TAs>
15-
where
16-
TAs: SerializeAs<T>,
17-
{
18-
fn serialize_as<S>(values: &Option<Option<T>>, serializer: S) -> Result<S::Ok, S::Error>
19-
where
20-
S: Serializer,
21-
{
22-
match values {
23-
None => serializer.serialize_unit(),
24-
Some(None) => serializer.serialize_none(),
25-
Some(Some(v)) => serializer.serialize_some(&SerializeAsWrap::<T, TAs>::new(v)),
26-
}
27-
}
28-
}
29-
30-
impl<'de, T, TAs> DeserializeAs<'de, Option<Option<T>>> for DoubleOption<TAs>
31-
where
32-
TAs: DeserializeAs<'de, T>,
33-
T: std::fmt::Debug,
34-
{
35-
fn deserialize_as<D>(deserializer: D) -> Result<Option<Option<T>>, D::Error>
36-
where
37-
D: Deserializer<'de>,
38-
{
39-
Ok(Some(
40-
DeserializeAsWrap::<Option<T>, Option<TAs>>::deserialize(deserializer)?
41-
.into_inner(),
42-
))
43-
}
44-
}
45-
{{/serdeAsDoubleOption}}

0 commit comments

Comments
 (0)