use ffsend_api::{
api::request::{ensure_success, ResponseError},
client::Client,
reqwest,
url::{self, Url},
};
use urlshortener::{
providers::{self, Provider},
request::{Method, Request},
};
type Result<T> = ::std::result::Result<T, Error>;
pub fn shorten(client: &Client, url: &str) -> Result<String> {
request(client, providers::request(url, &Provider::IsGd))
}
pub fn shorten_url(client: &Client, url: &Url) -> Result<Url> {
Url::parse(&shorten(client, url.as_str())?).map_err(|err| err.into())
}
fn request(client: &Client, req: Request) -> Result<String> {
let mut builder = match req.method {
Method::Get => client.get(&req.url),
Method::Post => client.post(&req.url),
};
if let Some(_agent) = req.user_agent.clone() {
panic!("Custom UserAgent for URL shortener not yet implemented");
}
if let Some(_content_type) = req.content_type {
panic!("Custom UserAgent for URL shortener not yet implemented");
}
if let Some(body) = req.body.clone() {
builder = builder.body(body);
}
let response = builder.send().map_err(Error::Request)?;
ensure_success(&response)?;
response.text().map_err(Error::Malformed)
}
#[derive(Debug, Fail)]
pub enum Error {
#[fail(display = "failed to send URL shorten request")]
Request(#[cause] reqwest::Error),
#[fail(display = "failed to shorten URL, got bad response")]
Response(#[cause] ResponseError),
#[fail(display = "failed to shorten URL, got malformed response")]
Malformed(#[cause] reqwest::Error),
#[fail(display = "failed to shorten URL, could not parse URL")]
Url(#[cause] url::ParseError),
}
impl From<url::ParseError> for Error {
fn from(err: url::ParseError) -> Self {
Error::Url(err)
}
}
impl From<ResponseError> for Error {
fn from(err: ResponseError) -> Self {
Error::Response(err)
}
}