Skip to content

Commit 93ad73d

Browse files
committed
Add our changes to the templates
1 parent 229e709 commit 93ad73d

File tree

7 files changed

+70
-117
lines changed

7 files changed

+70
-117
lines changed

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}}

support/openapi-template/reqwest-trait/api.mustache

Lines changed: 20 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{{>partial_header}}
22

3-
use async_trait::async_trait;
3+
//use async_trait::async_trait;
44
{{#mockall}}
55
#[cfg(feature = "mockall")]
66
use mockall::automock;
@@ -12,6 +12,7 @@ use crate::{apis::ResponseContent, models};
1212
use super::{Error, configuration};
1313
use crate::apis::ContentType;
1414

15+
/*
1516
{{#mockall}}
1617
#[cfg_attr(feature = "mockall", automock)]
1718
{{/mockall}}
@@ -34,20 +35,18 @@ pub trait {{{classname}}}: Send + Sync {
3435
### Regular return type
3536
}}{{^supportMultipleResponses}}{{^returnType}}(){{/returnType}}{{{returnType}}}{{/supportMultipleResponses}}{{!
3637
### Error Type
37-
}}, Error<{{{operationIdCamelCase}}}Error>>;
38+
}}, Error>;
3839
{{/vendorExtensions.x-group-parameters}}
3940
{{^vendorExtensions.x-group-parameters}}
4041
async fn {{{operationId}}}{{!
41-
### Lifetimes
42-
}}<{{#allParams}}'{{#lambda.lifetimeName}}{{{paramName}}}{{/lambda.lifetimeName}}{{^-last}}, {{/-last}}{{/allParams}}>{{!
4342
### Function parameter names
4443
}}(&self, {{#allParams}}{{{paramName}}}: {{!
4544
### Option Start
4645
}}{{^required}}Option<{{/required}}{{#required}}{{#isNullable}}Option<{{/isNullable}}{{/required}}{{!
4746
### &str and Vec<&str>
48-
}}{{#isString}}{{#isArray}}Vec<{{/isArray}}{{^isUuid}}&'{{#lambda.lifetimeName}}{{{paramName}}}{{/lambda.lifetimeName}} str{{/isUuid}}{{#isArray}}>{{/isArray}}{{/isString}}{{!
47+
}}{{#isString}}{{#isArray}}Vec<{{/isArray}}{{^isUuid}}&str{{/isUuid}}{{#isArray}}>{{/isArray}}{{/isString}}{{!
4948
### UUIDs
50-
}}{{#isUuid}}{{#isArray}}Vec<{{/isArray}}&str{{#isArray}}>{{/isArray}}{{/isUuid}}{{!
49+
}}{{#isUuid}}{{#isArray}}Vec<{{/isArray}}uuid::Uuid{{#isArray}}>{{/isArray}}{{/isUuid}}{{!
5150
### Models and primative types
5251
}}{{^isString}}{{^isUuid}}{{^isPrimitiveType}}{{^isContainer}}models::{{/isContainer}}{{/isPrimitiveType}}{{{dataType}}}{{/isUuid}}{{/isString}}{{!
5352
### Option End
@@ -61,11 +60,12 @@ pub trait {{{classname}}}: Send + Sync {
6160
### Regular return type
6261
}}{{^supportMultipleResponses}}{{^returnType}}(){{/returnType}}{{{returnType}}}{{/supportMultipleResponses}}{{!
6362
### Error Type
64-
}}, Error<{{{operationIdCamelCase}}}Error>>;
63+
}}, Error>;
6564
{{/vendorExtensions.x-group-parameters}}
6665
{{/operation}}
6766
{{/operations}}
6867
}
68+
*/
6969

7070
pub struct {{{classname}}}Client {
7171
configuration: Arc<configuration::Configuration>
@@ -99,7 +99,7 @@ pub struct {{{operationIdCamelCase}}}Params {
9999
### &str and Vec<&str>
100100
}}{{^isUuid}}{{#isString}}{{#isArray}}Vec<{{/isArray}}String{{#isArray}}>{{/isArray}}{{/isString}}{{/isUuid}}{{!
101101
### UUIDs
102-
}}{{#isUuid}}{{#isArray}}Vec<{{/isArray}}String{{#isArray}}>{{/isArray}}{{/isUuid}}{{!
102+
}}{{#isUuid}}{{#isArray}}Vec<{{/isArray}}uuid::Uuid{{#isArray}}>{{/isArray}}{{/isUuid}}{{!
103103
### Models and primative types
104104
}}{{^isString}}{{^isUuid}}{{^isPrimitiveType}}{{^isContainer}}models::{{/isContainer}}{{/isPrimitiveType}}{{{dataType}}}{{/isUuid}}{{/isString}}{{!
105105
### Option End
@@ -115,8 +115,8 @@ pub struct {{{operationIdCamelCase}}}Params {
115115
{{/operation}}
116116
{{/operations}}
117117

118-
#[async_trait]
119-
impl {{classname}} for {{classname}}Client {
118+
// #[async_trait]
119+
impl {{classname}}Client {
120120
{{#operations}}
121121
{{#operation}}
122122
{{#description}}
@@ -126,15 +126,15 @@ impl {{classname}} for {{classname}}Client {
126126
/// {{{.}}}
127127
{{/notes}}
128128
{{#vendorExtensions.x-group-parameters}}
129-
async fn {{{operationId}}}(&self, {{#allParams}}{{#-first}} params: {{{operationIdCamelCase}}}Params {{/-first}}{{/allParams}}{{!
129+
pub async fn {{{operationId}}}(&self, {{#allParams}}{{#-first}} params: {{{operationIdCamelCase}}}Params {{/-first}}{{/allParams}}{{!
130130
### Function return type
131131
}}) -> Result<{{!
132132
### Multi response support
133133
}}{{#supportMultipleResponses}}ResponseContent<{{{operationIdCamelCase}}}Success>{{/supportMultipleResponses}}{{!
134134
### Regular return type
135135
}}{{^supportMultipleResponses}}{{^returnType}}(){{/returnType}}{{{returnType}}}{{/supportMultipleResponses}}{{!
136136
### Error Type
137-
}}, Error<{{{operationIdCamelCase}}}Error>> {
137+
}}, Error> {
138138
{{#allParams}}{{#-first}}
139139
let {{{operationIdCamelCase}}}Params {
140140
{{#allParams}}
@@ -145,17 +145,15 @@ impl {{classname}} for {{classname}}Client {
145145

146146
{{/vendorExtensions.x-group-parameters}}
147147
{{^vendorExtensions.x-group-parameters}}
148-
async fn {{{operationId}}}{{!
149-
### Lifetimes
150-
}}<{{#allParams}}'{{#lambda.lifetimeName}}{{{paramName}}}{{/lambda.lifetimeName}}{{^-last}}, {{/-last}}{{/allParams}}>{{!
148+
pub async fn {{{operationId}}}{{!
151149
### Function parameter names
152150
}}(&self, {{#allParams}}{{{paramName}}}: {{!
153151
### Option Start
154152
}}{{^required}}Option<{{/required}}{{#required}}{{#isNullable}}Option<{{/isNullable}}{{/required}}{{!
155153
### &str and Vec<&str>
156-
}}{{#isString}}{{#isArray}}Vec<{{/isArray}}{{^isUuid}}&'{{#lambda.lifetimeName}}{{{paramName}}}{{/lambda.lifetimeName}} str{{/isUuid}}{{#isArray}}>{{/isArray}}{{/isString}}{{!
154+
}}{{#isString}}{{#isArray}}Vec<{{/isArray}}{{^isUuid}}&str{{/isUuid}}{{#isArray}}>{{/isArray}}{{/isString}}{{!
157155
### UUIDs
158-
}}{{#isUuid}}{{#isArray}}Vec<{{/isArray}}&str{{#isArray}}>{{/isArray}}{{/isUuid}}{{!
156+
}}{{#isUuid}}{{#isArray}}Vec<{{/isArray}}uuid::Uuid{{#isArray}}>{{/isArray}}{{/isUuid}}{{!
159157
### Models and primative types
160158
}}{{^isString}}{{^isUuid}}{{^isPrimitiveType}}{{^isContainer}}models::{{/isContainer}}{{/isPrimitiveType}}{{{dataType}}}{{/isUuid}}{{/isString}}{{!
161159
### Option End
@@ -169,13 +167,12 @@ impl {{classname}} for {{classname}}Client {
169167
### Regular return type
170168
}}{{^supportMultipleResponses}}{{^returnType}}(){{/returnType}}{{{returnType}}}{{/supportMultipleResponses}}{{!
171169
### Regular return type
172-
}}, Error<{{{operationIdCamelCase}}}Error>> {
170+
}}, Error> {
173171
{{/vendorExtensions.x-group-parameters}}
174172
let local_var_configuration = &self.configuration;
175173

176174
let local_var_client = &local_var_configuration.client;
177-
178-
let local_var_uri_str = format!("{}{{{path}}}", local_var_configuration.base_path{{#pathParams}}, {{{baseName}}}={{#isString}}crate::apis::urlencode({{/isString}}{{{paramName}}}{{^required}}.unwrap(){{/required}}{{#required}}{{#isNullable}}.unwrap(){{/isNullable}}{{/required}}{{#isArray}}.join(",").as_ref(){{/isArray}}{{^isString}}{{^isUuid}}{{^isPrimitiveType}}{{^isContainer}}.to_string(){{/isContainer}}{{/isPrimitiveType}}{{/isUuid}}{{/isString}}{{#isString}}){{/isString}}{{/pathParams}});
175+
let local_var_uri_str = format!("{}{{{path}}}", local_var_configuration.base_path{{#pathParams}}, {{{baseName}}}={{#isString}}{{^isUuid}}crate::apis::urlencode({{/isUuid}}{{/isString}}{{{paramName}}}{{^required}}.unwrap(){{/required}}{{#required}}{{#isNullable}}.unwrap(){{/isNullable}}{{/required}}{{#isArray}}.join(",").as_ref(){{/isArray}}{{^isString}}{{^isUuid}}{{^isPrimitiveType}}{{^isContainer}}.to_string(){{/isContainer}}{{/isPrimitiveType}}{{/isUuid}}{{/isString}}{{#isString}}{{^isUuid}}){{/isUuid}}{{/isString}}{{/pathParams}});
179176
let mut local_var_req_builder = local_var_client.request(reqwest::Method::{{{httpMethod}}}, local_var_uri_str.as_str());
180177

181178
{{#queryParams}}
@@ -321,9 +318,10 @@ impl {{classname}} for {{classname}}Client {
321318
}
322319
{{/withAWSV4Signature}}
323320
{{/hasAuthMethods}}
321+
{{! We set the user-agent to the reqwest client by default
324322
if let Some(ref local_var_user_agent) = local_var_configuration.user_agent {
325323
local_var_req_builder = local_var_req_builder.header(reqwest::header::USER_AGENT, local_var_user_agent.clone());
326-
}
324+
} }}
327325
{{#hasHeaderParams}}
328326
{{#headerParams}}
329327
{{#required}}
@@ -505,7 +503,7 @@ impl {{classname}} for {{classname}}Client {
505503
Ok(local_var_result)
506504
{{/supportMultipleResponses}}
507505
} else {
508-
let local_var_entity: Option<{{{operationIdCamelCase}}}Error> = serde_json::from_str(&local_var_content).ok();
506+
let local_var_entity: Option<serde_json::Value> = serde_json::from_str(&local_var_content).ok();
509507
let local_var_error = ResponseContent { status: local_var_status, content: local_var_content, entity: local_var_entity };
510508
Err(Error::ResponseError(local_var_error))
511509
}
@@ -536,25 +534,3 @@ pub enum {{{operationIdCamelCase}}}Success {
536534
{{/operation}}
537535
{{/operations}}
538536
{{/supportMultipleResponses}}
539-
{{#operations}}
540-
{{#operation}}
541-
/// struct for typed errors of method [`{{{classname}}}::{{operationId}}`]
542-
#[derive(Debug, Clone, Serialize, Deserialize)]
543-
#[serde(untagged)]
544-
pub enum {{{operationIdCamelCase}}}Error {
545-
{{#responses}}
546-
{{#is4xx}}
547-
Status{{code}}({{#isEnum}}{{{enumName}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}),
548-
{{/is4xx}}
549-
{{#is5xx}}
550-
Status{{code}}({{#isEnum}}{{{enumName}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}),
551-
{{/is5xx}}
552-
{{#isDefault}}
553-
DefaultResponse({{#isEnum}}{{{enumName}}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}),
554-
{{/isDefault}}
555-
{{/responses}}
556-
UnknownValue(serde_json::Value),
557-
}
558-
559-
{{/operation}}
560-
{{/operations}}

0 commit comments

Comments
 (0)