#[doc(inline)]
pub use openapi_trait_axum::openapi_trait as axum;
#[doc(inline)]
pub use openapi_trait_client::openapi_trait as client;
#[cfg(feature = "reqwest-client")]
#[doc(inline)]
pub use openapi_trait_client::ReqwestClient;
#[cfg(feature = "reqwest-client")]
pub trait ReqwestClientCore {
fn reqwest_client(&self) -> &reqwest::Client;
fn base_url(&self) -> &str;
}
#[derive(Debug, Clone, Default)]
pub struct RequestOptions {
headers: Vec<(String, String)>,
bearer_token: Option<String>,
basic_auth: Option<(String, Option<String>)>,
}
impl RequestOptions {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn header(mut self, name: impl Into<String>, value: impl Into<String>) -> Self {
self.headers.push((name.into(), value.into()));
self
}
#[must_use]
pub fn bearer_auth(mut self, token: impl Into<String>) -> Self {
self.bearer_token = Some(token.into());
self.basic_auth = None;
self
}
#[must_use]
pub fn basic_auth(mut self, username: impl Into<String>, password: Option<String>) -> Self {
self.basic_auth = Some((username.into(), password));
self.bearer_token = None;
self
}
#[cfg(feature = "reqwest-client")]
pub fn apply(self, mut request: reqwest::RequestBuilder) -> reqwest::RequestBuilder {
for (name, value) in self.headers {
request = request.header(name.as_str(), value.as_str());
}
if let Some(token) = self.bearer_token {
match reqwest::header::HeaderValue::try_from(format!("Bearer {token}")) {
Ok(mut value) => {
value.set_sensitive(true);
request = replace_authorization(request, value);
}
Err(_) => request = request.bearer_auth(token),
}
} else if let Some((username, password)) = self.basic_auth {
use base64::Engine as _;
let credentials = password.as_ref().map_or_else(
|| format!("{username}:"),
|password| format!("{username}:{password}"),
);
let encoded = base64::engine::general_purpose::STANDARD.encode(credentials);
match reqwest::header::HeaderValue::try_from(format!("Basic {encoded}")) {
Ok(mut value) => {
value.set_sensitive(true);
request = replace_authorization(request, value);
}
Err(_) => request = request.basic_auth(username, password),
}
}
request
}
}
#[cfg(feature = "reqwest-client")]
fn replace_authorization(
request: reqwest::RequestBuilder,
value: reqwest::header::HeaderValue,
) -> reqwest::RequestBuilder {
let mut headers = reqwest::header::HeaderMap::with_capacity(1);
headers.insert(reqwest::header::AUTHORIZATION, value);
request.headers(headers)
}
#[cfg(feature = "reqwest-client")]
pub trait ReqwestClientAuth<A> {
fn auth_state(&self) -> &A;
}
#[cfg(feature = "reqwest-client")]
pub use percent_encoding;
#[cfg(feature = "reqwest-client")]
pub use reqwest;
pub use base64;