rama-macros 0.3.0

procedural macross for rama
Documentation
//! Macros that were moved over from [`axum_macros`] and modified to work with rama
//!
//! [`axum`]: https://crates.io/crates/axum_macros

#![cfg_attr(docsrs, feature(doc_cfg))]
#![cfg_attr(test, allow(clippy::float_cmp))]
#![cfg_attr(not(test), warn(clippy::print_stdout, clippy::dbg_macro))]

use proc_macro::TokenStream;
use quote::{ToTokens, quote};
use syn::parse::Parse;

pub(crate) mod attr_parsing;
pub(crate) mod from_ref;

pub(crate) fn expand_with<F, I, K>(input: TokenStream, f: F) -> TokenStream
where
    F: FnOnce(I) -> syn::Result<K>,
    I: Parse,
    K: ToTokens,
{
    expand(syn::parse(input).and_then(f))
}

pub(crate) fn expand<T>(result: syn::Result<T>) -> TokenStream
where
    T: ToTokens,
{
    match result {
        Ok(tokens) => {
            let tokens = (quote! { #tokens }).into();
            if std::env::var_os("RAMA_MACROS_DEBUG").is_some() {
                eprintln!("{tokens}");
            }
            tokens
        }
        Err(err) => err.into_compile_error().into(),
    }
}