extern crate md5;
extern crate url;
use md5::{Digest, Md5};
use url::percent_encoding::{utf8_percent_encode, DEFAULT_ENCODE_SET};
use url::Url;
#[derive(Clone, Debug)]
pub enum Default {
ImageUrl(Url),
Http404,
Blank,
MysteryMan,
Identicon,
MonsterId,
Wavatar,
Retro,
}
#[derive(Clone, Debug)]
pub enum Rating {
G,
Pg,
R,
X,
}
#[derive(Clone, Debug)]
pub struct Gravatar {
email: String,
size: Option<u16>,
default: Option<Default>,
force_default: bool,
rating: Option<Rating>,
ssl: bool,
}
impl Gravatar {
pub fn new(email: &str) -> Gravatar {
Gravatar {
email: email.to_string(),
size: None,
default: None,
force_default: false,
rating: None,
ssl: true,
}
}
pub fn set_size(&mut self, size: Option<u16>) -> &mut Self {
self.size = match size {
Some(s) => Some(s.max(1).min(2048)),
None => None,
};
self
}
pub fn set_default(&mut self, default: Option<Default>) -> &mut Self {
self.default = default;
self
}
pub fn set_force_default(&mut self, force_default: bool) -> &mut Self {
self.force_default = force_default;
self
}
pub fn set_rating(&mut self, rating: Option<Rating>) -> &mut Self {
self.rating = rating;
self
}
pub fn set_ssl(&mut self, ssl: bool) -> &mut Self {
self.ssl = ssl;
self
}
pub fn image_url(self: &Self) -> Url {
let digest = Md5::new()
.chain(&self.email.trim().to_ascii_lowercase())
.result();
let hash = format!("{:x}", digest);
let mut url = Url::parse(&format!(
"{}.gravatar.com/avatar/{}",
if self.ssl {
"https://secure"
} else {
"http://www"
},
hash
))
.unwrap();
if let Some(s) = self.size {
url.query_pairs_mut().append_pair("s", &s.to_string());
}
if let Some(ref d) = self.default {
let val = match d {
Default::ImageUrl(ref u) => {
utf8_percent_encode(u.as_str(), DEFAULT_ENCODE_SET).to_string()
}
Default::Http404 => "404".to_string(),
Default::MysteryMan => "mm".to_string(),
Default::Identicon => "identicon".to_string(),
Default::MonsterId => "monsterid".to_string(),
Default::Wavatar => "wavatar".to_string(),
Default::Retro => "retro".to_string(),
Default::Blank => "blank".to_string(),
};
url.query_pairs_mut().append_pair("d", &val);
}
if self.force_default {
url.query_pairs_mut().append_pair("f", "y");
}
if let Some(ref r) = self.rating {
let val = match r {
Rating::G => "g",
Rating::Pg => "pg",
Rating::R => "r",
Rating::X => "x",
};
url.query_pairs_mut().append_pair("r", val);
}
url
}
}