rscx 0.1.14

rscx is a HTML templating library for Rust with a JSX-like syntax.
Documentation
use std::{
    borrow::Cow,
    convert::Infallible,
    env::VarError,
    fmt,
    io::ErrorKind,
    net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6},
    num::{
        NonZeroI128, NonZeroI16, NonZeroI32, NonZeroI64, NonZeroI8, NonZeroIsize, NonZeroU128,
        NonZeroU16, NonZeroU32, NonZeroU64, NonZeroU8, NonZeroUsize,
    },
    rc::Rc,
    sync::{
        mpsc::{RecvTimeoutError, TryRecvError},
        Arc,
    },
};

pub trait Render {
    fn render(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result;
}

macro_rules! impl_render_for_basic_types {
    ($($t:ty)*) => ($(
        impl Render for $t {
            #[inline(always)]
            fn render(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
                fmt::Display::fmt(self, f)
            }
        }
    )*)
}

impl_render_for_basic_types! {
    Infallible
    VarError
    ErrorKind
    IpAddr
    SocketAddr
    RecvTimeoutError
    TryRecvError
    bool
    char
    f32
    f64
    i8
    i16
    i32
    i64
    i128
    isize
    u8
    u16
    u32
    u64
    u128
    usize
    Ipv4Addr
    Ipv6Addr
    SocketAddrV4
    SocketAddrV6
    NonZeroI8
    NonZeroI16
    NonZeroI32
    NonZeroI64
    NonZeroI128
    NonZeroIsize
    NonZeroU8
    NonZeroU16
    NonZeroU32
    NonZeroU64
    NonZeroU128
    NonZeroUsize
    String
    str
}

impl<B: ?Sized> Render for Cow<'_, B>
where
    B: Render + ToOwned,
    <B as ToOwned>::Owned: Render,
{
    fn render(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match *self {
            Cow::Borrowed(ref b) => Render::render(b, f),
            Cow::Owned(ref o) => Render::render(o, f),
        }
    }
}

impl<T: Render> Render for Box<T> {
    #[inline(always)]
    fn render(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        Render::render(&**self, f)
    }
}

impl<T: Render + ?Sized> Render for &T {
    #[inline(always)]
    fn render(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        Render::render(&**self, f)
    }
}

impl<T: Render> Render for &mut T {
    #[inline(always)]
    fn render(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        Render::render(&**self, f)
    }
}

impl<T: Render> Render for Rc<T> {
    #[inline(always)]
    fn render(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        Render::render(&**self, f)
    }
}

impl<T: Render> Render for Arc<T> {
    #[inline(always)]
    fn render(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        Render::render(&**self, f)
    }
}

impl<T: Render> Render for Option<T> {
    #[inline(always)]
    fn render(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        if let Some(inner) = self {
            inner.render(f)
        } else {
            Ok(())
        }
    }
}

impl Render for () {
    #[inline(always)]
    fn render(&self, _: &mut fmt::Formatter<'_>) -> fmt::Result {
        Ok(())
    }
}