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 resolve;
10mod schema_emit;
11mod tool;
12
13#[proc_macro_derive(ToolInput, attributes(input))]
14pub fn input(input: TokenStream) -> TokenStream {
15    InputParser::default().parse(input)
16}
17
18#[proc_macro_derive(AgentOutput, attributes(output, strict))]
19pub fn agent_output(input: TokenStream) -> TokenStream {
20    OutputParser::default().parse(input)
21}
22
23#[proc_macro_attribute]
24pub fn tool(attr: TokenStream, item: TokenStream) -> TokenStream {
25    ToolParser::default().parse(attr, item)
26}
27
28#[proc_macro_attribute]
29pub fn agent(attr: TokenStream, item: TokenStream) -> TokenStream {
30    AgentParser::default().parse(attr, item)
31}
32
33#[proc_macro_derive(AgentHooks)]
34pub fn derive_agent_hooks(input: TokenStream) -> TokenStream {
35    let input = parse_macro_input!(input as DeriveInput);
36    let name = input.ident;
37
38    let (core, async_trait) = match resolve::resolve_agent_hooks_paths() {
39        Ok(paths) => paths,
40        Err(err) => return err.to_compile_error().into(),
41    };
42    let core = &core;
43    let async_trait = &async_trait;
44
45    // Correctly handle generics
46    let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
47
48    let expanded = quote! {
49        #[#async_trait]
50        impl #impl_generics #core::agent::AgentHooks for #name #ty_generics #where_clause {}
51    };
52
53    TokenStream::from(expanded)
54}