use super::Link;
use crate::utils::{RequestBuilder, ResponseExt};
use crate::{Result, constants, error::Error};
use serde::{Deserialize, Serialize};
use tracing::debug;
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct ShortLink {
link: String,
}
#[derive(Debug, Deserialize, Serialize)]
pub struct ShortLinkArgs {
#[serde(rename = "page_url")]
path: String,
#[serde(skip_serializing_if = "Option::is_none")]
page_title: Option<String>,
is_permanent: bool,
}
#[derive(Debug, Deserialize)]
pub struct ShortLinkArgsBuilder {
path: Option<String>,
page_title: Option<String>,
is_permanent: Option<bool>,
}
impl ShortLinkArgs {
pub fn builder() -> ShortLinkArgsBuilder {
ShortLinkArgsBuilder::new()
}
pub fn path(&self) -> String {
self.path.clone()
}
pub fn page_title(&self) -> Option<String> {
self.page_title.clone()
}
pub fn is_permanent(&self) -> bool {
self.is_permanent
}
}
impl ShortLinkArgsBuilder {
pub fn new() -> Self {
ShortLinkArgsBuilder {
path: None,
page_title: None,
is_permanent: None,
}
}
pub fn path(mut self, path: impl Into<String>) -> Self {
self.path = Some(path.into());
self
}
pub fn page_title(mut self, title: impl Into<String>) -> Self {
self.page_title = Some(title.into());
self
}
pub fn with_permanent(mut self) -> Self {
self.is_permanent = Some(true);
self
}
pub fn build(self) -> Result<ShortLinkArgs> {
let path = self.path.map_or_else(
|| {
Err(Error::InvalidParameter(
"小程序页面路径不能为空".to_string(),
))
},
|v| {
if v.len() > 1024 {
return Err(Error::InvalidParameter(
"页面路径最大长度 1024 个字符".to_string(),
));
}
Ok(v)
},
)?;
Ok(ShortLinkArgs {
path,
page_title: self.page_title,
is_permanent: self.is_permanent.unwrap_or(false),
})
}
}
impl Default for ShortLinkArgsBuilder {
fn default() -> Self {
Self::new()
}
}
impl Link {
pub async fn short_link(&self, args: ShortLinkArgs) -> Result<ShortLink> {
debug!("get qr code args {:?}", &args);
let query = serde_json::json!({
"access_token":self.client.token().await?
});
let body = serde_json::to_value(ShortLinkArgs {
path: args.path.clone(),
page_title: args.page_title,
is_permanent: args.is_permanent,
})?;
let request = RequestBuilder::new(constants::SHORT_LINK_END_POINT)
.query(query)
.body(body)
.build()?;
let client = &self.client.client;
let response = client.execute(request).await?;
debug!("response: {:#?}", response);
response.to_json::<ShortLink>()
}
}