diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/hooks/wolfram_alpha.rs | 7 | ||||
| -rw-r--r-- | src/util/web.rs | 49 |
2 files changed, 33 insertions, 23 deletions
diff --git a/src/hooks/wolfram_alpha.rs b/src/hooks/wolfram_alpha.rs index 1e7b6d8..24e6318 100644 --- a/src/hooks/wolfram_alpha.rs +++ b/src/hooks/wolfram_alpha.rs @@ -1,6 +1,6 @@ use crate::util::{ formatting::truncate, - web::{quote_plus, shorten_url}, + web::{quote_plus, IsgdUrlShortener, UrlShortener}, }; use anyhow::{bail, Context, Error, Result}; use futures::try_join; @@ -99,8 +99,7 @@ async fn get_wa_user_short_url(input: &str) -> Result<String, Error> { // Maybe only with is.gd though. quote_plus("e_plus(input)?)? ); - - shorten_url(&user_url).await + IsgdUrlShortener::new().shorten(&user_url).await } /// Sends a request to the Wolfram Alpha API, returns a plain text response. @@ -183,7 +182,7 @@ mod tests { Ok(()) } - // These tests must be updated if a service other than is.gd is used + // These tests must be updated if UrlShortener other than IsgdUrlShortener is used #[tokio::test] async fn test_wa_user_short_url_1() -> Result<(), Error> { let input = "5/10"; 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<String, Error> { - Ok(urlparse_quote_plus(text, b"")?) +#[async_trait] +pub(crate) trait UrlShortener { + fn new() -> Self; + async fn shorten(&self, url: &str) -> Result<String, Error>; +} + +pub(crate) struct IsgdUrlShortener {} + +#[async_trait] +impl UrlShortener for IsgdUrlShortener { + fn new() -> Self { + Self {} + } + + async fn shorten(&self, url: &str) -> Result<String, Error> { + 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<String, Error> { - // 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<String, Error> { + Ok(urlparse_quote_plus(text, b"")?) } #[cfg(test)] mod tests { - use super::{quote_plus}; + use super::quote_plus; use anyhow::{Error, Result}; #[test] |
