use std::error::Error;
use async_trait::async_trait;
use bytes::Bytes;
use http::request::Builder as RequestBuilder;
use http::{HeaderMap, Response};
use crate::api::ApiError;
use crate::catalog::ServiceEndpoint;
use crate::types::{identity::v3::Project, ApiVersion, BoxedAsyncRead, ServiceType};
pub trait RestClient {
type Error: Error + Send + Sync + 'static;
fn get_current_project(&self) -> Option<Project>;
fn get_service_endpoint(
&self,
service_type: &ServiceType,
version: Option<&ApiVersion>,
) -> Result<&ServiceEndpoint, ApiError<Self::Error>>;
}
#[cfg(feature = "sync")]
pub trait Client: RestClient {
fn rest(
&self,
request: RequestBuilder,
body: Vec<u8>,
) -> Result<Response<Bytes>, ApiError<Self::Error>>;
}
#[cfg(feature = "async")]
#[async_trait]
pub trait AsyncClient: RestClient {
async fn rest_async(
&self,
request: RequestBuilder,
body: Vec<u8>,
) -> Result<Response<Bytes>, ApiError<Self::Error>>;
async fn rest_read_body_async(
&self,
request: RequestBuilder,
body: BoxedAsyncRead,
) -> Result<Response<Bytes>, ApiError<Self::Error>>;
async fn download_async(
&self,
request: RequestBuilder,
body: Vec<u8>,
) -> Result<(HeaderMap, BoxedAsyncRead), ApiError<Self::Error>>;
}