Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ authors = ["OpenAPI Generator team and contributors"]
edition = "2018"

[dependencies]
async-trait = { version = "0.1" }
serde = { version = "^1.0", features = ["derive"] }
serde_json = "^1.0"
url = "2.1"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,41 +1,28 @@
{{>partial_header}}
use async_trait::async_trait;
use std::sync::Arc;
use std::borrow::Borrow;
#[allow(unused_imports)]
use std::option::Option;

use reqwest;

use super::{Error, configuration};

pub struct {{{classname}}}Client {
configuration: Arc<configuration::Configuration>,
pub struct {{{classname}}}Client<'a> {
configuration: &'a configuration::Configuration<'a>,
}

impl {{{classname}}}Client {
pub fn new(configuration: Arc<configuration::Configuration>) -> {{{classname}}}Client {
impl<'a> {{{classname}}}Client<'a> {
pub fn new(configuration: &'a configuration::Configuration) -> {{{classname}}}Client<'a> {
{{{classname}}}Client {
configuration,
}
}
}

#[async_trait]
pub trait {{{classname}}} {
impl<'a> {{{classname}}}Client<'a> {
{{#operations}}
{{#operation}}
async fn {{{operationId}}}(&self, {{#allParams}}{{{paramName}}}: {{^required}}Option<{{/required}}{{#required}}{{#isNullable}}Option<{{/isNullable}}{{/required}}{{#isString}}&str{{/isString}}{{#isUuid}}&str{{/isUuid}}{{^isString}}{{^isUuid}}{{^isPrimitiveType}}{{^isContainer}}crate::models::{{/isContainer}}{{/isPrimitiveType}}{{{dataType}}}{{/isUuid}}{{/isString}}{{^required}}>{{/required}}{{#required}}{{#isNullable}}>{{/isNullable}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) -> Result<{{^returnType}}(){{/returnType}}{{#returnType}}{{{returnType}}}{{/returnType}}, Error>;
{{/operation}}
{{/operations}}
}

#[async_trait]
impl {{{classname}}} for {{{classname}}}Client {
{{#operations}}
{{#operation}}
async fn {{{operationId}}}(&self, {{#allParams}}{{{paramName}}}: {{^required}}Option<{{/required}}{{#required}}{{#isNullable}}Option<{{/isNullable}}{{/required}}{{#isString}}&str{{/isString}}{{#isUuid}}&str{{/isUuid}}{{^isString}}{{^isUuid}}{{^isPrimitiveType}}{{^isContainer}}crate::models::{{/isContainer}}{{/isPrimitiveType}}{{{dataType}}}{{/isUuid}}{{/isString}}{{^required}}>{{/required}}{{#required}}{{#isNullable}}>{{/isNullable}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) -> Result<{{^returnType}}(){{/returnType}}{{#returnType}}{{{returnType}}}{{/returnType}}, Error> {
let configuration: &configuration::Configuration = self.configuration.borrow();
pub async fn {{{operationId}}}(&self, {{#allParams}}{{{paramName}}}: {{^required}}Option<{{/required}}{{#required}}{{#isNullable}}Option<{{/isNullable}}{{/required}}{{#isString}}&str{{/isString}}{{#isUuid}}&str{{/isUuid}}{{^isString}}{{^isUuid}}{{^isPrimitiveType}}{{^isContainer}}crate::models::{{/isContainer}}{{/isPrimitiveType}}{{{dataType}}}{{/isUuid}}{{/isString}}{{^required}}>{{/required}}{{#required}}{{#isNullable}}>{{/isNullable}}{{/required}}{{#hasMore}}, {{/hasMore}}{{/allParams}}) -> Result<{{^returnType}}(){{/returnType}}{{#returnType}}{{{returnType}}}{{/returnType}}, Error> {
let configuration = self.configuration;
let client = &configuration.client;

let uri_str = format!("{}{{{path}}}", configuration.base_path{{#pathParams}}, {{{baseName}}}={{#isString}}crate::apis::urlencode({{/isString}}{{{paramName}}}{{^required}}.unwrap(){{/required}}{{#required}}{{#isNullable}}.unwrap(){{/isNullable}}{{/required}}{{#isListContainer}}.join(",").as_ref(){{/isListContainer}}{{#isString}}){{/isString}}{{/pathParams}});
Expand Down Expand Up @@ -216,6 +203,9 @@ impl {{{classname}}} for {{{classname}}}Client {
req_builder = req_builder.json(&{{{paramName}}});
{{/bodyParams}}
{{/hasBodyParam}}
if let Some(ref custom_auth) = configuration.custom_auth {
req_builder = custom_auth(req_builder);
};

// send request
let req = req_builder.build()?;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,26 @@
use reqwest;
use serde_json;

impl std::error::Error for Error {
}

#[derive(Debug)]
pub enum Error {
Reqwest(reqwest::Error),
Serde(serde_json::Error),
Io(std::io::Error),
}

impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
Error::Reqwest(e) => write!(f, "{}", e),
Error::Serde(e) => write!(f, "{}", e),
Error::Io(e) => write!(f, "{}", e),
}
}
}

impl From<reqwest::Error> for Error {
fn from(e: reqwest::Error) -> Self {
Error::Reqwest(e)
Expand Down Expand Up @@ -36,7 +49,7 @@ mod {{{classFilename}}};
{{#operations}}
{{#operation}}
{{#-last}}
pub use self::{{{classFilename}}}::{ {{{classname}}}, {{{classname}}}Client };
pub use self::{{{classFilename}}}::{ {{{classname}}}Client };
{{/-last}}
{{/operation}}
{{/operations}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,32 +1,29 @@
use std::sync::Arc;

use super::configuration::Configuration;

pub struct APIClient {
pub struct APIClient<'a> {
{{#apiInfo}}
{{#apis}}
{{#operations}}
{{#operation}}
{{#-last}}
{{{classFilename}}}: Box<dyn crate::apis::{{{classname}}}>,
{{{classFilename}}}: crate::apis::{{{classname}}}Client<'a>,
{{/-last}}
{{/operation}}
{{/operations}}
{{/apis}}
{{/apiInfo}}
}

impl APIClient {
pub fn new(configuration: Configuration) -> APIClient {
let rc = Arc::new(configuration);
impl<'a> APIClient<'a> {
pub fn new(configuration: &'a Configuration) -> APIClient<'a> {

APIClient {
{{#apiInfo}}
{{#apis}}
{{#operations}}
{{#operation}}
{{#-last}}
{{{classFilename}}}: Box::new(crate::apis::{{{classname}}}Client::new(rc.clone())),
{{{classFilename}}}: crate::apis::{{{classname}}}Client::new(configuration),
{{/-last}}
{{/operation}}
{{/operations}}
Expand All @@ -40,8 +37,8 @@ impl APIClient {
{{#operations}}
{{#operation}}
{{#-last}}
pub fn {{{classFilename}}}(&self) -> &dyn crate::apis::{{{classname}}}{
self.{{{classFilename}}}.as_ref()
pub fn {{{classFilename}}}(&self) -> &crate::apis::{{{classname}}}Client {
&self.{{{classFilename}}}
}

{{/-last}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,18 @@

use reqwest;

pub struct Configuration {
pub type RequestBuilderClosure<'a> =
dyn Fn(reqwest::RequestBuilder) -> reqwest::RequestBuilder + 'a;

pub struct Configuration<'a> {
pub base_path: String,
pub user_agent: Option<String>,
pub client: reqwest::Client,
pub basic_auth: Option<BasicAuth>,
pub oauth_access_token: Option<String>,
pub bearer_access_token: Option<String>,
pub api_key: Option<ApiKey>,
// TODO: take an oauth2 token source, similar to the go one
pub custom_auth: Option<&'a RequestBuilderClosure<'a>>,
}

pub type BasicAuth = (String, Option<String>);
Expand All @@ -20,13 +23,13 @@ pub struct ApiKey {
pub key: String,
}

impl Configuration {
pub fn new() -> Configuration {
impl<'a> Configuration<'a> {
pub fn new() -> Configuration<'a> {
Configuration::default()
}
}

impl Default for Configuration {
impl<'a> Default for Configuration<'a> {
fn default() -> Self {
Configuration {
base_path: "{{{basePath}}}".to_owned(),
Expand All @@ -36,6 +39,7 @@ impl Default for Configuration {
oauth_access_token: None,
bearer_access_token: None,
api_key: None,
custom_auth: None,
}
}
}