1use crate::{
2 error::Result,
3 types::{CreateRequest, CreateResponse},
4};
5use async_trait::async_trait;
6use reqwest::Url;
7
8#[async_trait]
9pub trait TinyUrlOpenAPI {
10 async fn create(&self, request: CreateRequest) -> Result<CreateResponse>;
11}
12
13#[derive(Default, Debug)]
14pub struct TinyUrlAPI {
15 pub token: String,
16}
17
18const BASE_URL: &str = "https://api.tinyurl.com";
19
20#[async_trait]
21impl TinyUrlOpenAPI for TinyUrlAPI {
22 async fn create(&self, request: CreateRequest) -> Result<CreateResponse> {
23 let url = format!("{}/create?api_token={}", BASE_URL, self.token);
24
25 let url: Url = url.parse()?;
26 let client = reqwest::Client::new();
27
28 let resp = client
29 .post(url)
30 .json(&request)
31 .send()
32 .await?
33 .json::<CreateResponse>()
34 .await?;
35
36 Ok(resp)
37 }
38}