use crate::oss;
use builders::{CreateCnameTokenBuilder, GetCnameTokenBuilder, ListCnameBuilder, PutCnameBuilder};
use self::builders::DeleteCnameBuilder;
pub mod builders {
use crate::oss::{
self,
api::{self, ApiResponseFrom},
entities::cname::{
builders::BucketCnameConfigurationBuilder, BucketCnameConfiguration, Cname, CnameToken,
ListCnameResult,
},
http,
};
pub struct CreateCnameTokenBuilder<'a> {
client: &'a oss::Client<'a>,
cname: &'a str,
}
impl<'a> CreateCnameTokenBuilder<'a> {
pub fn new(client: &'a oss::Client, cname: &'a str) -> Self {
Self { client, cname }
}
fn config(&self) -> String {
let config = BucketCnameConfiguration {
cname: Cname {
domain: self.cname.to_string(),
..Cname::default()
},
};
quick_xml::se::to_string(&config).unwrap()
}
pub async fn execute(&self) -> api::ApiResult<CnameToken> {
let res = format!("/{}/?cname&comp=token", self.client.bucket());
let url = format!("{}/?cname&comp=token", &self.client.base_url());
let data = oss::Bytes::from(self.config());
let resp = self
.client
.request
.task()
.with_url(&url)
.with_method(http::Method::POST)
.with_resource(&res)
.with_body(data)
.execute_timeout(self.client.timeout())
.await?;
Ok(ApiResponseFrom(resp).to_type().await)
}
}
pub struct GetCnameTokenBuilder<'a> {
client: &'a oss::Client<'a>,
cname: &'a str,
}
impl<'a> GetCnameTokenBuilder<'a> {
pub(crate) fn new(client: &'a oss::Client, cname: &'a str) -> Self {
Self { client, cname }
}
pub async fn execute(&self) -> api::ApiResult<CnameToken> {
let res = format!("/{}/?cname={}&comp=token", self.client.bucket(), self.cname);
let url = format!(
"{}/?cname={}&comp=token",
self.client.base_url(),
self.cname
);
let resp = self
.client
.request
.task()
.with_url(&url)
.with_resource(&res)
.execute_timeout(self.client.timeout())
.await?;
Ok(ApiResponseFrom(resp).to_type().await)
}
}
pub struct PutCnameBuilder<'a> {
client: &'a oss::Client<'a>,
bucket_cname_configuration: BucketCnameConfiguration,
}
impl<'a> PutCnameBuilder<'a> {
pub(crate) fn new(client: &'a oss::Client) -> Self {
Self {
client,
bucket_cname_configuration: BucketCnameConfiguration::default(),
}
}
pub fn with_config(mut self, value: BucketCnameConfiguration) -> Self {
self.bucket_cname_configuration = value;
self
}
fn config(&self) -> String {
quick_xml::se::to_string(&self.bucket_cname_configuration).unwrap()
}
pub async fn execute(&self) -> api::ApiResult {
let res = format!("/{}/?cname&comp=add", self.client.bucket());
let url = format!("{}/?cname&comp=add", self.client.base_url());
let data = oss::Bytes::from(self.config());
let resp = self
.client
.request
.task()
.with_url(&url)
.with_method(http::Method::POST)
.with_body(data)
.with_resource(&res)
.execute_timeout(self.client.timeout())
.await?;
Ok(ApiResponseFrom(resp).to_empty().await)
}
}
pub struct ListCnameBuilder<'a> {
client: &'a oss::Client<'a>,
}
impl<'a> ListCnameBuilder<'a> {
pub(crate) fn new(client: &'a oss::Client) -> Self {
Self { client }
}
pub async fn execute(&self) -> api::ApiResult<ListCnameResult> {
let res = format!("/{}/?{}", self.client.bucket(), "cname");
let url = format!("{}/?{}", self.client.base_url(), "cname");
let resp = self
.client
.request
.task()
.with_url(&url)
.with_resource(&res)
.execute_timeout(self.client.timeout())
.await?;
Ok(ApiResponseFrom(resp).to_type().await)
}
}
pub struct DeleteCnameBuilder<'a> {
client: &'a oss::Client<'a>,
cname: &'a str,
}
impl<'a> DeleteCnameBuilder<'a> {
pub(crate) fn new(client: &'a oss::Client, cname: &'a str) -> Self {
Self { client, cname }
}
fn config(&self) -> String {
let config = BucketCnameConfigurationBuilder::new()
.with_domain(self.cname)
.build();
quick_xml::se::to_string(&config).unwrap()
}
pub async fn execute(&self) -> api::ApiResult {
let res = format!("/{}/?cname&comp=delete", self.client.bucket());
let url = format!("{}/?cname&comp=delete", self.client.base_url());
let data = oss::Bytes::from(self.config());
let resp = self
.client
.request
.task()
.with_url(&url)
.with_resource(&res)
.with_method(http::Method::POST)
.with_body(data)
.execute_timeout(self.client.timeout())
.await?;
Ok(ApiResponseFrom(resp).to_empty().await)
}
}
}
#[allow(non_snake_case)]
impl<'a> oss::Client<'a> {
pub fn CreateCnameToken(&self, cname: &'a str) -> CreateCnameTokenBuilder<'_> {
CreateCnameTokenBuilder::new(self, cname)
}
pub fn GetCnameToken(&self, cname: &'a str) -> GetCnameTokenBuilder<'_> {
GetCnameTokenBuilder::new(self, cname)
}
pub fn PutCname(&self) -> PutCnameBuilder<'_> {
PutCnameBuilder::new(self)
}
pub fn ListCname(&self) -> ListCnameBuilder<'_> {
ListCnameBuilder::new(self)
}
pub fn DeleteCname(&self, cname: &'a str) -> DeleteCnameBuilder<'_> {
DeleteCnameBuilder::new(self, cname)
}
}