compo-macros 0.1.3

Compo is a general-purpose declarative and reactive component framework designed for single-threaded asynchronous execution, offering high performance and safety guarantees. Suitable for GUI scenarios or other similar non-GUI component systems.
Documentation
macro_rules! ts {
    ($fmt: literal$(, $i: expr)*) => {{
        use std::str::FromStr;
        let msg = format!($fmt$(, $i)*);
        TokenStream::from_str(msg.as_str()).unwrap()
    }};
}

macro_rules! error {
    (raw, $span: expr, $fmt: literal$(, $i: expr)*) => {{
        let msg = format!($fmt$(, $i)*);
        ts!("compile_error!(\"{}\\n --> {}:{}:{}\");", msg, $span.file().replace("\\", r"\\"), $span.line(), $span.column())
    }};
    (arg, $span: expr, $fmt: literal$(, $i: expr)*) => {{
        let s = error!(raw, $span, $fmt $(, $i)*);
        let s = s.to_string();
        ts!("#[deny = {}] _: ()", &s[..s.len() -1])
    }};
    (block, $span: expr, $fmt: literal$(, $i: expr)*) => {{
        let s = error!(raw, $span, $fmt $(, $i)*);
        ts!("{{ {} }}", s)
    }};
    (raw, $fmt: literal$(, $i: expr)*) => {{
        let msg = format!($fmt$(, $i)*);
        ts!("compile_error!(\"{}\");", msg)
    }};
    (arg, $fmt: literal$(, $i: expr)*) => {{
        let s = error!(raw, $fmt $(, $i)*);
        let s = s.to_string();
        ts!("#[deny = {}] _: ()", &s[..s.len() -1])
    }};
    (block, $fmt: literal$(, $i: expr)*) => {{
        let s = error!(raw, $fmt $(, $i)*);
        ts!("{{ {} }}", s)
    }};
}