nacos-macro 0.3.0

Nacos's proc macros.
Documentation
#![allow(clippy::manual_unwrap_or_default)] // for #[darling(default)]

use darling::FromMeta;
use darling::ast::NestedMeta;
use syn::{ItemStruct, Path, parse_macro_input, parse_quote};

use self::{request::grpc_request, response::grpc_response};

pub(crate) mod request;
pub(crate) mod response;

#[derive(Debug, FromMeta)]
pub(crate) struct MacroArgs {
    identity: String,

    #[darling(default)]
    crates: Crates,

    module: Module,
}

#[derive(Debug, FromMeta)]
enum Module {
    Config,
    Naming,
    Internal,
}

impl Module {
    fn to_string(&self) -> &str {
        match self {
            Module::Config => "config",
            Module::Naming => "naming",
            Module::Internal => "internal",
        }
    }
}

#[derive(Debug, FromMeta)]
struct Crates {
    #[darling(default = "Self::default_serde")]
    serde: Path,

    #[darling(default = "Self::default_std")]
    std: Path,
}

impl Default for Crates {
    fn default() -> Self {
        Self::from_list(&[]).expect("Default crates list should be valid")
    }
}

impl Crates {
    fn default_serde() -> Path {
        parse_quote! { ::serde }
    }

    fn default_std() -> Path {
        parse_quote! { ::std }
    }
}

pub fn request(
    args: proc_macro::TokenStream,
    input: proc_macro::TokenStream,
) -> proc_macro::TokenStream {
    let item_struct = parse_macro_input!(input as ItemStruct);

    let meta_list = NestedMeta::parse_meta_list(args.into()).expect("Failed to parse meta list");
    let macro_args = MacroArgs::from_list(&meta_list).expect("Failed to parse macro arguments");

    grpc_request(macro_args, item_struct).into()
}

pub fn response(
    args: proc_macro::TokenStream,
    input: proc_macro::TokenStream,
) -> proc_macro::TokenStream {
    let item_struct = parse_macro_input!(input as ItemStruct);

    let meta_list = NestedMeta::parse_meta_list(args.into()).expect("Failed to parse meta list");
    let macro_args = MacroArgs::from_list(&meta_list).expect("Failed to parse macro arguments");

    grpc_response(macro_args, item_struct).into()
}