use std::fmt;
pub use fmt::Result;
pub use fmt::Write;
pub use jaws::JWTFormat;
pub trait HttpCase {
fn titlecase(&self) -> TitleCase<'_, Self> {
TitleCase(self)
}
fn lowercase(&self) -> LowerCase<'_, Self> {
LowerCase(self)
}
}
impl<T> HttpCase for T where T: fmt::Display {}
#[derive(Debug)]
struct TitleCaseWriter<W> {
writer: W,
prev: char,
}
impl<W> fmt::Write for TitleCaseWriter<W>
where
W: fmt::Write,
{
fn write_str(&mut self, s: &str) -> Result {
for c in s.chars() {
if self.prev == '-' {
self.writer.write_char(c.to_ascii_uppercase())?;
} else {
self.writer.write_char(c.to_ascii_lowercase())?;
}
if c.is_ascii_whitespace() {
self.prev = '-'
} else {
self.prev = c;
}
}
Ok(())
}
}
impl<W> TitleCaseWriter<W> {
fn new(writer: W) -> Self {
TitleCaseWriter { writer, prev: '-' }
}
}
pub struct TitleCase<'a, T: ?Sized>(&'a T);
impl<T: fmt::Display + ?Sized> fmt::Display for TitleCase<'_, T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result {
let mut writer = TitleCaseWriter::new(f);
write!(&mut writer, "{}", self.0)
}
}
#[derive(Debug)]
struct LowerCaseWriter<W> {
writer: W,
}
impl<W> fmt::Write for LowerCaseWriter<W>
where
W: fmt::Write,
{
fn write_str(&mut self, s: &str) -> Result {
self.writer.write_str(&s.to_ascii_lowercase())
}
}
impl<W> LowerCaseWriter<W> {
fn new(writer: W) -> Self {
LowerCaseWriter { writer }
}
}
pub struct LowerCase<'a, T: ?Sized>(&'a T);
impl<T: fmt::Display + ?Sized> fmt::Display for LowerCase<'_, T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result {
let mut writer = LowerCaseWriter::new(f);
write!(&mut writer, "{}", self.0)
}
}