aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLorenz Leitner <lrnz.ltnr@gmail.com>2021-10-15 09:32:28 +0200
committerLorenz Leitner <lrnz.ltnr@gmail.com>2021-10-15 09:32:28 +0200
commitfa5964208078015d736b721f9864176fd5bea341 (patch)
treee743b6dfbf316b4ed24ccdd569de8385c11d7620
parentRemove whitespace in result text (diff)
Add UrlShortener trait
Diffstat (limited to '')
-rw-r--r--Cargo.lock12
-rw-r--r--Cargo.toml1
-rw-r--r--src/hooks/wolfram_alpha.rs7
-rw-r--r--src/util/web.rs49
4 files changed, 46 insertions, 23 deletions
diff --git a/Cargo.lock b/Cargo.lock
index a87d120..914a422 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -56,6 +56,17 @@ dependencies = [
]
[[package]]
+name = "async-trait"
+version = "0.1.51"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "44318e776df68115a881de9a8fd1b9e53368d7a4a5ce4cc48517da3393233a5e"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
name = "atty"
version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -116,6 +127,7 @@ name = "catinator"
version = "1.5.0"
dependencies = [
"anyhow",
+ "async-trait",
"base64",
"catinator_macros",
"futures",
diff --git a/Cargo.toml b/Cargo.toml
index 6477100..8c652f9 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -32,6 +32,7 @@ rand = "0.8.3"
reqwest = { version = "0.11", default-features = false, features = ["rustls-tls", "gzip"] }
urlparse = "0.7.3"
+async-trait = "0.1.51"
[dev-dependencies]
mockito = "0.30.0"
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(&quote_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]