tinyurl_rs/
api.rs

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}