From fa5964208078015d736b721f9864176fd5bea341 Mon Sep 17 00:00:00 2001 From: Lorenz Leitner Date: Fri, 15 Oct 2021 09:32:28 +0200 Subject: Add UrlShortener trait --- src/util/web.rs | 49 ++++++++++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 19 deletions(-) (limited to 'src/util/web.rs') diff --git a/src/util/web.rs b/src/util/web.rs index bfa7003..fec7bb0 100644 --- a/src/util/web.rs +++ b/src/util/web.rs @@ -1,32 +1,43 @@ use anyhow::{Context, Error, Result}; +use async_trait::async_trait; use reqwest::{get, Url}; use urlparse::quote_plus as urlparse_quote_plus; -pub(crate) fn quote_plus(text: &str) -> Result { - Ok(urlparse_quote_plus(text, b"")?) +#[async_trait] +pub(crate) trait UrlShortener { + fn new() -> Self; + async fn shorten(&self, url: &str) -> Result; +} + +pub(crate) struct IsgdUrlShortener {} + +#[async_trait] +impl UrlShortener for IsgdUrlShortener { + fn new() -> Self { + Self {} + } + + async fn shorten(&self, url: &str) -> Result { + Ok(get(Url::parse(&format!( + "https://is.gd/create.php?format=simple&url={}", + url + )) + .context("Failed to parse url")?) + .await + .context("Failed to make request")? + .text() + .await + .context("failed to get request response text")?) + } } -// TODO: Either catinator should have a URL shortening utility module, -// or we should start our own service -pub(crate) async fn shorten_url(url: &str) -> Result { - // This just uses the first service gonzobot uses too - let short_url = get(Url::parse(&format!( - "https://is.gd/create.php?format=simple&url={}", - url - )) - .context("Failed to parse url")?) - .await - .context("Failed to make request")? - .text() - .await - .context("failed to get request response text")?; - - Ok(short_url) +pub(crate) fn quote_plus(text: &str) -> Result { + Ok(urlparse_quote_plus(text, b"")?) } #[cfg(test)] mod tests { - use super::{quote_plus}; + use super::quote_plus; use anyhow::{Error, Result}; #[test] -- cgit v1.2.3