use rocket::http;
pub enum Header {
RetryAfter(u64),
XRateLimitError(&'static str),
XRateLimitLimit(u64),
XRateLimitRemaining(u64),
XRateLimitReset(u64),
}
pub const RETRY_AFTER: &str = "retry-after";
pub const X_RATELIMIT_ERROR: &str = "x-ratelimit-error";
pub const X_RATELIMIT_LIMIT: &str = "x-ratelimit-limit";
pub const X_RATELIMIT_REMAINING: &str = "x-ratelimit-remaining";
pub const X_RATELIMIT_RESET: &str = "x-ratelimit-reset";
#[doc(hidden)]
impl From<Header> for http::Header<'_> {
fn from(header: Header) -> Self {
match header {
Header::RetryAfter(sec) => http::Header::new(RETRY_AFTER, sec.to_string()),
Header::XRateLimitError(err) => http::Header::new(X_RATELIMIT_ERROR, err),
Header::XRateLimitLimit(limit) => {
http::Header::new(X_RATELIMIT_LIMIT, limit.to_string())
}
Header::XRateLimitRemaining(remaining) => {
http::Header::new(X_RATELIMIT_REMAINING, remaining.to_string())
}
Header::XRateLimitReset(sec) => http::Header::new(X_RATELIMIT_RESET, sec.to_string()),
}
}
}
#[cfg(test)]
mod tests {
use super::Header;
use super::{
RETRY_AFTER, X_RATELIMIT_ERROR, X_RATELIMIT_LIMIT, X_RATELIMIT_REMAINING, X_RATELIMIT_RESET,
};
use rocket::http;
use std::str::FromStr;
#[test]
fn test_header() {
let h: http::Header = Header::RetryAfter(10).into();
assert_eq!(RETRY_AFTER, h.name());
assert_eq!(10, u64::from_str(h.value()).unwrap());
let h: http::Header = Header::XRateLimitError("some error").into();
assert_eq!(X_RATELIMIT_ERROR, h.name());
assert_eq!("some error", h.value());
let h: http::Header = Header::XRateLimitLimit(100).into();
assert_eq!(X_RATELIMIT_LIMIT, h.name());
assert_eq!(100, u64::from_str(h.value()).unwrap());
let h: http::Header = Header::XRateLimitRemaining(1).into();
assert_eq!(X_RATELIMIT_REMAINING, h.name());
assert_eq!(1, u64::from_str(h.value()).unwrap());
let h: http::Header = Header::XRateLimitReset(5).into();
assert_eq!(X_RATELIMIT_RESET, h.name());
assert_eq!(5, u64::from_str(h.value()).unwrap());
}
}