predawn 0.9.0

Predawn is a Rust web framework like Spring Boot.
Documentation
use std::{
    borrow::Cow,
    fmt::Debug,
    net::{IpAddr, Ipv4Addr, Ipv6Addr},
};

use bytes::Bytes;
use http::{HeaderValue, Uri};

#[derive(Debug, Clone)]
pub enum MaybeHeaderValue {
    Value(HeaderValue),
    None,
    Error,
}

pub trait ToHeaderValue: Debug {
    fn to_header_value(&self) -> MaybeHeaderValue;
}

impl<T: ToHeaderValue> ToHeaderValue for Option<T> {
    fn to_header_value(&self) -> MaybeHeaderValue {
        match self {
            Some(v) => v.to_header_value(),
            None => MaybeHeaderValue::None,
        }
    }
}

impl ToHeaderValue for bool {
    fn to_header_value(&self) -> MaybeHeaderValue {
        let s = match self {
            true => "true",
            false => "false",
        };

        MaybeHeaderValue::Value(HeaderValue::from_static(s))
    }
}

macro_rules! impl_to_header_value_directly {
    ($($ty:ty),+ $(,)?) => {
        $(
            impl ToHeaderValue for $ty {
                fn to_header_value(&self) -> MaybeHeaderValue {
                    MaybeHeaderValue::Value(HeaderValue::from(*self))
                }
            }
        )+
    };
}

impl_to_header_value_directly![i16, i32, i64, isize, u16, u32, u64, usize];

macro_rules! impl_to_header_value_str {
    ($($ty:ty),+ $(,)?) => {
        $(
            impl ToHeaderValue for $ty {
                fn to_header_value(&self) -> MaybeHeaderValue {
                    match HeaderValue::from_str(self) {
                        Ok(o) => MaybeHeaderValue::Value(o),
                        Err(_) => MaybeHeaderValue::Error,
                    }
                }
            }
        )+
    };
}

impl_to_header_value_str![&'static str, Cow<'static, str>, String, Box<str>];

macro_rules! impl_to_header_value_bytes {
    ($($ty:ty),+ $(,)?) => {
        $(
            impl ToHeaderValue for $ty {
                fn to_header_value(&self) -> MaybeHeaderValue {
                    match HeaderValue::from_bytes(self) {
                        Ok(o) => MaybeHeaderValue::Value(o),
                        Err(_) => MaybeHeaderValue::Error,
                    }
                }
            }
        )+
    };
}

impl_to_header_value_bytes![&'static [u8], Cow<'static, [u8]>, Vec<u8>, Box<[u8]>, Bytes];

macro_rules! impl_to_header_value_by_to_string {
    ($($ty:ty),+ $(,)?) => {
        $(
            impl ToHeaderValue for $ty {
                fn to_header_value(&self) -> MaybeHeaderValue {
                    match HeaderValue::try_from(self.to_string()) {
                        Ok(o) => MaybeHeaderValue::Value(o),
                        Err(_) => MaybeHeaderValue::Error,
                    }
                }
            }
        )+
    };
}

impl_to_header_value_by_to_string![i8, i128, u8, u128, f32, f64, Ipv4Addr, Ipv6Addr, IpAddr, Uri];