pub mod meta;
pub mod requests;
pub mod responses;
use crate::{
errors::ApolloClientResult,
meta::{handle_url, validate_response, PerformResponse, DEFAULT_TIMEOUT},
open::{
requests::{
OpenAppRequest, OpenClusterRequest, OpenCreateItemRequest, OpenEnvClusterRequest,
OpenNamespaceRequest, OpenPublishNamespaceRequest, OpenUpdateItemRequest,
PerformOpenRequest,
},
responses::{
OpenAppResponse, OpenClusterResponse, OpenEnvClusterResponse, OpenItemResponse,
OpenNamespaceResponse, OpenPublishResponse,
},
},
};
use http::{header::AUTHORIZATION, HeaderMap, HeaderValue};
use reqwest::{Client, ClientBuilder};
use url::Url;
pub struct OpenApiClientBuilder {
portal_url: Url,
token: String,
client_builder: ClientBuilder,
}
impl OpenApiClientBuilder {
pub fn new(portal_url: Url, token: impl ToString) -> ApolloClientResult<Self> {
let mut builder = Self {
portal_url,
token: token.to_string(),
client_builder: Default::default(),
};
let default_headers = builder.default_headers()?;
builder.client_builder = builder
.client_builder
.timeout(DEFAULT_TIMEOUT)
.default_headers(default_headers);
Ok(builder)
}
pub fn with_client_builder(mut self, f: impl FnOnce(ClientBuilder) -> ClientBuilder) -> Self {
self.client_builder = f(self.client_builder);
self
}
pub fn build(self) -> ApolloClientResult<OpenApiClient> {
Ok(OpenApiClient {
portal_url: self.portal_url,
client: self.client_builder.build()?,
})
}
fn default_headers(&self) -> Result<HeaderMap, http::Error> {
let mut map = HeaderMap::new();
map.insert(AUTHORIZATION, HeaderValue::from_str(&self.token)?);
Ok(map)
}
}
pub struct OpenApiClient {
portal_url: Url,
client: Client,
}
impl OpenApiClient {
pub async fn env_cluster(
&self,
request: OpenEnvClusterRequest,
) -> ApolloClientResult<Vec<OpenEnvClusterResponse>> {
self.execute(request).await
}
pub async fn app(&self, request: OpenAppRequest) -> ApolloClientResult<Vec<OpenAppResponse>> {
self.execute(request).await
}
pub async fn cluster(
&self,
request: OpenClusterRequest,
) -> ApolloClientResult<OpenClusterResponse> {
self.execute(request).await
}
pub async fn namespace(
&self,
request: OpenNamespaceRequest,
) -> ApolloClientResult<Vec<OpenNamespaceResponse>> {
self.execute(request).await
}
pub async fn create_item(
&self,
request: OpenCreateItemRequest,
) -> ApolloClientResult<OpenItemResponse> {
self.execute(request).await
}
pub async fn update_item(&self, request: OpenUpdateItemRequest) -> ApolloClientResult<()> {
self.execute(request).await
}
pub async fn publish_namespace(
&self,
request: OpenPublishNamespaceRequest,
) -> ApolloClientResult<OpenPublishResponse> {
self.execute(request).await
}
async fn execute<R: PerformResponse>(
&self,
request: impl PerformOpenRequest<Response = R>,
) -> ApolloClientResult<R> {
let url = handle_url(&request, self.portal_url.clone())?;
let mut request_builder = self.client.request(request.method(), url);
request_builder = request.request_builder(request_builder);
let response = request_builder.send().await?;
let response = validate_response(response).await?;
<R>::from_response(response).await
}
}