specta-macros 1.0.5

Macros for specta. Don't use directly!
Documentation
use crate::utils::format_fn_wrapper;
use proc_macro2::TokenStream;
use quote::quote;
use syn::{
    parse::{Parse, ParseStream},
    Ident, Path, PathArguments, Token,
};

pub struct FnDatatypeInput {
    type_map: Ident,
    function: Path,
}

impl Parse for FnDatatypeInput {
    fn parse(input: ParseStream<'_>) -> syn::Result<Self> {
        let type_map: Ident = input.parse()?;
        input.parse::<Token![,]>()?;
        let function: Path = input.parse()?;

        Ok(Self { type_map, function })
    }
}

pub fn proc_macro(
    FnDatatypeInput { type_map, function }: FnDatatypeInput,
) -> syn::Result<TokenStream> {
    let mut specta_fn_macro = function.clone();

    let last = specta_fn_macro
        .segments
        .last_mut()
        .expect("Function path is empty!");

    last.ident = format_fn_wrapper(&last.ident.clone());
    last.arguments = PathArguments::None;

    Ok(quote! {
        specta::functions::get_datatype_internal(
            #function as #specta_fn_macro!(@signature),
            #specta_fn_macro!(@asyncness),
            #specta_fn_macro!(@name),
            #type_map,
            #specta_fn_macro!(@arg_names),
            #specta_fn_macro!(@docs)
        )
    })
}