1extern crate proc_macro;
2use agent::{AgentParser, output::OutputParser};
3use proc_macro::TokenStream;
4use quote::quote;
5use syn::{DeriveInput, parse_macro_input};
6use tool::{ToolParser, input::InputParser};
7
8mod agent;
9mod tool;
10
11#[proc_macro_derive(ToolInput, attributes(input))]
12pub fn input(input: TokenStream) -> TokenStream {
13 InputParser::default().parse(input)
14}
15
16#[proc_macro_derive(AgentOutput, attributes(output, strict))]
17pub fn agent_output(input: TokenStream) -> TokenStream {
18 OutputParser::default().parse(input)
19}
20
21#[proc_macro_attribute]
22pub fn tool(attr: TokenStream, item: TokenStream) -> TokenStream {
23 ToolParser::default().parse(attr, item)
24}
25
26#[proc_macro_attribute]
27pub fn agent(attr: TokenStream, item: TokenStream) -> TokenStream {
28 AgentParser::default().parse(attr, item)
29}
30
31#[proc_macro_derive(AgentHooks)]
32pub fn derive_agent_hooks(input: TokenStream) -> TokenStream {
33 let input = parse_macro_input!(input as DeriveInput);
34 let name = input.ident;
35
36 let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
38
39 let expanded = quote! {
40 #[::autoagents::async_trait]
42 impl #impl_generics ::autoagents::core::agent::AgentHooks for #name #ty_generics #where_clause {}
43 };
44
45 TokenStream::from(expanded)
46}