nidus-macros 1.0.7

Proc macros for Nidus controllers, routes, modules, providers, guards, pipes, and entrypoints.
Documentation
use proc_macro2::TokenStream;
use quote::quote;
use syn::{ImplItemFn, Path, parse2};

use crate::utils::require_method_receiver;

pub(crate) fn expand(attr: TokenStream, item: TokenStream) -> TokenStream {
    if let Err(error) = parse2::<Path>(attr) {
        return crate::diagnostics::compile_error_with_item_at(
            error.span(),
            "#[pipe] requires a pipe type like #[pipe(ValidationPipe)]",
            item,
        );
    }

    match parse2::<ImplItemFn>(item.clone()) {
        Ok(function) => match require_method_receiver(&function, "pipe") {
            Ok(()) => quote!(#function),
            Err(error) => crate::diagnostics::compile_error_with_item(error.to_string(), item),
        },
        Err(error) => crate::diagnostics::compile_error_with_item(
            format!("#[pipe] can only be used on route methods: {error}"),
            item,
        ),
    }
}

pub(crate) fn expand_validate(attr: TokenStream, item: TokenStream) -> TokenStream {
    if !attr.is_empty() {
        return crate::diagnostics::compile_error_with_item(
            "#[validate] does not accept arguments",
            item,
        );
    }

    match parse2::<ImplItemFn>(item.clone()) {
        Ok(function) => match require_method_receiver(&function, "validate") {
            Ok(()) => quote!(#function),
            Err(error) => crate::diagnostics::compile_error_with_item(error.to_string(), item),
        },
        Err(error) => crate::diagnostics::compile_error_with_item(
            format!("#[validate] can only be used on route methods: {error}"),
            item,
        ),
    }
}