#![allow(dead_code)]
use darling::{ast::NestedMeta, FromMeta};
use proc_macro2::Span;
#[derive(Debug, FromMeta)]
pub struct ServerAttrs {
pub name: String,
pub version: String,
#[darling(default)]
pub instructions: Option<String>,
#[darling(default)]
pub debug_expand: bool,
}
impl ServerAttrs {
pub fn parse(attr: proc_macro2::TokenStream) -> Result<Self, darling::Error> {
let attr_args = NestedMeta::parse_meta_list(attr)?;
Self::from_list(&attr_args)
}
}
#[derive(Debug, FromMeta)]
pub struct ToolAttrs {
pub description: String,
#[darling(default)]
pub name: Option<String>,
#[darling(default)]
pub destructive: bool,
#[darling(default)]
pub idempotent: bool,
#[darling(default)]
pub read_only: bool,
#[darling(default)]
pub max_input_size: Option<usize>,
}
impl ToolAttrs {
pub fn parse(attr: proc_macro2::TokenStream) -> Result<Self, darling::Error> {
let attr_args = NestedMeta::parse_meta_list(attr)?;
Self::from_list(&attr_args)
}
}
#[derive(Debug, FromMeta)]
pub struct ResourceAttrs {
pub uri_pattern: String,
#[darling(default)]
pub name: Option<String>,
#[darling(default)]
pub description: Option<String>,
#[darling(default)]
pub mime_type: Option<String>,
}
impl ResourceAttrs {
pub fn parse(attr: proc_macro2::TokenStream) -> Result<Self, darling::Error> {
let attr_args = NestedMeta::parse_meta_list(attr)?;
Self::from_list(&attr_args)
}
}
#[derive(Debug, FromMeta)]
pub struct PromptAttrs {
pub description: String,
#[darling(default)]
pub name: Option<String>,
}
impl PromptAttrs {
pub fn parse(attr: proc_macro2::TokenStream) -> Result<Self, darling::Error> {
let attr_args = NestedMeta::parse_meta_list(attr)?;
Self::from_list(&attr_args)
}
}
#[derive(Debug, Default, FromMeta)]
pub struct ParamAttrs {
#[darling(default)]
pub default: Option<syn::Lit>,
#[darling(default)]
pub min: Option<i64>,
#[darling(default)]
pub max: Option<i64>,
}
pub fn call_site() -> Span {
Span::call_site()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_server_attrs_parse() {
let tokens = quote::quote!(name = "test-server", version = "1.0.0");
let attrs = ServerAttrs::parse(tokens).unwrap();
assert_eq!(attrs.name, "test-server");
assert_eq!(attrs.version, "1.0.0");
assert!(attrs.instructions.is_none());
assert!(!attrs.debug_expand);
}
#[test]
fn test_tool_attrs_parse() {
let tokens = quote::quote!(description = "Test tool", destructive = true);
let attrs = ToolAttrs::parse(tokens).unwrap();
assert_eq!(attrs.description, "Test tool");
assert!(attrs.destructive);
assert!(!attrs.idempotent);
}
}