rust-mcp-macros 0.9.1

A procedural macro that derives the MCPToolSchema implementation for structs or enums, generating a tool_input_schema function used with rust_mcp_schema::Tool.
Documentation
use crate::common::{IconDsl, IconThemeDsl};
use proc_macro2::TokenStream;
use quote::quote;

pub fn generate_icons(base_crate: &TokenStream, icons: &Option<Vec<IconDsl>>) -> TokenStream {
    let mut icon_exprs = Vec::new();

    if let Some(icons) = &icons {
        for icon in icons {
            let src = &icon.src;
            let mime_type = icon
                .mime_type
                .as_ref()
                .map(|s| quote! { Some(#s.to_string()) })
                .unwrap_or(quote! { None });
            let theme = icon
                .theme
                .as_ref()
                .map(|t| match t {
                    IconThemeDsl::Light => quote! { Some(#base_crate::IconTheme::Light) },
                    IconThemeDsl::Dark => quote! { Some(#base_crate::IconTheme::Dark) },
                })
                .unwrap_or(quote! { None });

            let sizes: Vec<_> = icon
                .sizes
                .as_ref()
                .map(|arr| {
                    arr.iter()
                        .map(|elem| {
                            quote! { #elem.to_string() }
                        })
                        .collect::<Vec<_>>()
                })
                .unwrap_or_default();

            let icon_expr = quote! {
                #base_crate::Icon {
                    src: #src.to_string(),
                    mime_type: #mime_type,
                    sizes: vec![ #(#sizes),* ],
                    theme: #theme,
                }
            };
            icon_exprs.push(icon_expr);
        }
    }

    if icon_exprs.is_empty() {
        quote! { ::std::vec::Vec::new() }
    } else {
        quote! { vec![ #(#icon_exprs),* ] }
    }
}