1
Fork 0
gravatar-rs/source/lib.rs

84 lines
2.1 KiB
Rust

//! # gravatar-rs
//!
//! This crate provides an API for creating [Gravatar image URLs], and by
//! extension, [Ivatar/Libravatar image URLs].
//!
//! [Gravatar image URLs]: https://gravatar.com/site/implement/images/
//! [Ivatar/Libravatar image URLs]: https://wiki.libravatar.org/api/
//!
//! The default [`Generator::base_url`] is `www.gravatar.com`, if you want to
//! set a custom `base_url` use [`Generator::set_base_url`].
//!
//! ```rust
//! use gravatar_rs::Generator;
//!
//! let generator = Generator::default();
//!
//! let gravatar_url = generator.generate("helllo@holllo.cc");
//!
//! assert_eq!(
//! gravatar_url,
//! "https://www.gravatar.com/avatar/ebff9105dce4954b1bdb57fdab079ff3"
//! );
//! ```
/// A generator for Gravatar image URLs.
#[derive(Debug)]
pub struct Generator {
pub base_url: String,
}
impl Default for Generator {
fn default() -> Self {
Self {
base_url: "www.gravatar.com".to_string(),
}
}
}
impl Generator {
/// Hashes an email with [`md5`] according to the [Gravatar hashing steps].
///
/// ```rust
/// use gravatar_rs::Generator;
///
/// let hash = Generator::hash_email("helllo@holllo.cc");
///
/// assert_eq!(
/// hash,
/// "ebff9105dce4954b1bdb57fdab079ff3"
/// );
/// ```
///
/// [Gravatar hashing steps]: https://en.gravatar.com/site/implement/hash/
pub fn hash_email(email: &str) -> String {
let hash = md5::compute(email.trim().to_lowercase());
format!("{hash:x}")
}
/// Generates a new Gravatar image URL using the Generator's configuration.
///
/// See the top-level module documentation for examples.
pub fn generate(&self, email: &str) -> String {
let base_url = &self.base_url;
let hash = Self::hash_email(email);
format!("https://{base_url}/avatar/{hash}")
}
/// Configures the Generator to use the base URL for generated URLs.
///
/// ```rust
/// use gravatar_rs::Generator;
///
/// // Use Libravatar instead of Gravatar.
/// Generator::default().set_base_url("cdn.libravatar.org");
/// ```
pub fn set_base_url(self, base_url: &str) -> Self {
Self {
base_url: base_url.to_string(),
..self
}
}
}