xitca-codegen 0.4.0

proc macro for xitca
Documentation
use proc_macro::TokenStream;
use quote::quote;
use syn::{Error, ItemImpl, Type, spanned::Spanned};

pub(crate) fn error(_: TokenStream, item: ItemImpl) -> Result<TokenStream, Error> {
    let Type::Path(ref err_ty) = *item.self_ty else {
        return Err(Error::new(item.self_ty.span(), "expect Struct or Enum"));
    };

    let call_impl = crate::find_async_method(&item.items, "call")
        .ok_or_else(|| Error::new(err_ty.span(), "expect 'async fn call' method"))??;

    let call_stmts = &call_impl.block.stmts;

    Ok(quote! {
        impl<'r> ::xitca_web::service::Service<WebContext<'r, ::xitca_web::error::Request<'r>>> for #err_ty {
            type Response = WebResponse;
            type Error = ::core::convert::Infallible;

            async fn call(&self, ctx: WebContext<'r, ::xitca_web::error::Request<'r>>) -> Result<Self::Response, Self::Error> {
                Ok({#(#call_stmts)*})
            }
        }

        impl From<#err_ty> for ::xitca_web::error::Error {
            fn from(e: #err_ty) -> Self {
                Self::from_service(e)
            }
        }
    }
    .into())
}