Skip to main content

autoagents_derive/
lib.rs

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    // Correctly handle generics
37    let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
38
39    let expanded = quote! {
40        // bring async_trait in via absolute path to avoid needing use in consumer crate
41        #[::autoagents::async_trait]
42        impl #impl_generics ::autoagents::core::agent::AgentHooks for #name #ty_generics #where_clause {}
43    };
44
45    TokenStream::from(expanded)
46}