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 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}