aboutsummaryrefslogtreecommitdiff
path: root/src/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/util')
-rw-r--r--src/util/formatting/color.rs1
-rw-r--r--src/util/formatting/mod.rs57
-rw-r--r--src/util/formatting/truncate.rs1
-rw-r--r--src/util/mod.rs9
-rw-r--r--src/util/web/mod.rs (renamed from src/util/web.rs)34
-rw-r--r--src/util/web/url_shorteners.rs21
6 files changed, 90 insertions, 33 deletions
diff --git a/src/util/formatting/color.rs b/src/util/formatting/color.rs
index 6907805..ac78b9c 100644
--- a/src/util/formatting/color.rs
+++ b/src/util/formatting/color.rs
@@ -1,3 +1,4 @@
+/// The basic 16 IRC color codes
pub enum Color {
White = 00,
Black = 01,
diff --git a/src/util/formatting/mod.rs b/src/util/formatting/mod.rs
index 5cfdfa8..a20b48f 100644
--- a/src/util/formatting/mod.rs
+++ b/src/util/formatting/mod.rs
@@ -1,9 +1,31 @@
+//! Tools for formatting irc messages
+
mod truncate;
mod color;
pub use truncate::*;
pub use color::*;
+/// Turn strings bold, italic,underline, strikethrough, and monospace.
+///
+/// The Formatting trait is implemented on `String` and `&str` for your convenience
+///
+/// # Format a string
+/// ```
+/// use catinator::util::Formatting;
+///
+/// let text = "this should be bold";
+/// assert_eq!("\x02this should be bold\x02", text.bold())
+/// ```
+///
+/// # Use raw formatting code
+/// ```
+/// use catinator::util::Formatting;
+///
+/// let text = "this should be bold";
+/// let result = format!("{}{}", String::BOLD, text);
+/// assert_eq!("\x02this should be bold", result)
+/// ```
pub trait Formatting<'r> {
const BOLD: &'r str = "\x02";
const ITALIC: &'r str = "\x1D";
@@ -12,11 +34,11 @@ pub trait Formatting<'r> {
const MONOSPACE: &'r str = "\x11";
const COLOR: &'r str = "\x03";
- fn bold(self) -> Self;
- fn italic(self) -> Self;
- fn underline(self) -> Self;
- fn strikethrough(self) -> Self;
- fn monospace(self) -> Self;
+ fn bold(self) -> String;
+ fn italic(self) -> String;
+ fn underline(self) -> String;
+ fn strikethrough(self) -> String;
+ fn monospace(self) -> String;
// fn color(self, color: Color) -> Self;
}
@@ -65,6 +87,31 @@ impl<'r> Formatting<'r> for String {
// }
}
+impl<'r> Formatting<'r> for &str {
+ fn bold(self) -> String {
+ format!("{}{}{}", Self::BOLD, self, Self::BOLD)
+ }
+
+ fn italic(self) -> String {
+ format!("{}{}{}", Self::ITALIC, self, Self::ITALIC)
+ }
+
+ fn underline(self) -> String {
+ format!("{}{}{}", Self::UNDERLINE, self, Self::UNDERLINE)
+ }
+
+ fn strikethrough(self) -> String {
+ format!("{}{}{}", Self::STRIKETHROUGH, self, Self::STRIKETHROUGH)
+ }
+
+ fn monospace(self) -> String {
+ format!("{}{}{}", Self::MONOSPACE, self, Self::MONOSPACE)
+ }
+
+ // TODO implement color codes
+ // fn color(mut self, foreground: Option<Color>, background: Option<Color>) -> Self { }
+}
+
#[cfg(all(test, feature = "bench"))]
mod bench {
use super::*;
diff --git a/src/util/formatting/truncate.rs b/src/util/formatting/truncate.rs
index c1b6257..80caa23 100644
--- a/src/util/formatting/truncate.rs
+++ b/src/util/formatting/truncate.rs
@@ -1,4 +1,5 @@
/// Truncates a string after a certain number of characters.
+///
/// Function always tries to truncate on a word boundary.
/// Reimplemented from gonzobot.
pub fn truncate(text: &str, len: usize) -> String {
diff --git a/src/util/mod.rs b/src/util/mod.rs
index a8988c3..23ef2ce 100644
--- a/src/util/mod.rs
+++ b/src/util/mod.rs
@@ -1,2 +1,7 @@
-pub mod formatting;
-pub mod web;
+//! Utilities for dealing with IRC and bot making
+
+mod formatting;
+mod web;
+
+pub use formatting::*;
+pub use web::*;
diff --git a/src/util/web.rs b/src/util/web/mod.rs
index b9f44c1..4e886af 100644
--- a/src/util/web.rs
+++ b/src/util/web/mod.rs
@@ -1,36 +1,18 @@
-use anyhow::{Context, Error, Result};
+use anyhow::{Error, Result};
use async_trait::async_trait;
-use reqwest::{get, Url};
use urlparse::quote_plus as urlparse_quote_plus;
-#[async_trait]
-pub trait UrlShortener {
- fn new() -> Self;
- async fn shorten(&self, url: &str) -> Result<String, Error>;
-}
-
-pub struct IsgdUrlShortener {}
+pub mod url_shorteners;
+/// Shorten urls
#[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")?)
- }
+pub trait UrlShortener {
+ /// Call this method with the url you want shortened.
+ /// Returns the shortened url.
+ async fn shorten(url: &str) -> Result<String, Error>;
}
+/// quote strings to be URL save
pub fn quote_plus(text: &str) -> Result<String, Error> {
Ok(urlparse_quote_plus(text, b"")?)
}
diff --git a/src/util/web/url_shorteners.rs b/src/util/web/url_shorteners.rs
new file mode 100644
index 0000000..74d62ce
--- /dev/null
+++ b/src/util/web/url_shorteners.rs
@@ -0,0 +1,21 @@
+use anyhow::{Context, Error, Result};
+use async_trait::async_trait;
+use reqwest::{get, Url};
+
+pub struct Isgd;
+
+#[async_trait]
+impl super::UrlShortener for Isgd {
+ async fn shorten(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")?)
+ }
+}