1#![doc(
2 html_logo_url = "https://github.com/compio-rs/compio-logo/raw/refs/heads/master/generated/colored-bold.svg"
3)]
4#![doc(
5 html_favicon_url = "https://github.com/compio-rs/compio-logo/raw/refs/heads/master/generated/colored-bold.svg"
6)]
7
8mod item_fn;
9
10mod main_fn;
11
12use proc_macro::TokenStream;
13use proc_macro_crate::{FoundCrate, crate_name};
14use proc_macro2::{Ident, Span};
15use quote::{ToTokens, quote};
16use syn::parse_macro_input;
17
18#[proc_macro_attribute]
19pub fn main(args: TokenStream, item: TokenStream) -> TokenStream {
20 parse_macro_input!(item as main_fn::CompioMain)
21 .with_args(parse_macro_input!(args as item_fn::RawAttr))
22 .into_token_stream()
23 .into()
24}
25
26#[proc_macro_attribute]
27pub fn test(args: TokenStream, item: TokenStream) -> TokenStream {
28 parse_macro_input!(item as main_fn::CompioMain)
29 .with_args(parse_macro_input!(args as item_fn::RawAttr))
30 .with_test(true)
31 .into_token_stream()
32 .into()
33}
34
35fn retrieve_runtime_mod() -> proc_macro2::TokenStream {
36 match crate_name("compio-runtime") {
37 Ok(FoundCrate::Itself) => quote!(crate),
38 Ok(FoundCrate::Name(name)) => {
39 let ident = Ident::new(&name, Span::call_site());
40 quote!(::#ident)
41 }
42 Err(_) => match crate_name("compio") {
43 Ok(FoundCrate::Itself) => quote!(crate::runtime),
44 Ok(FoundCrate::Name(name)) => {
45 let ident = Ident::new(&name, Span::call_site());
46 quote!(::#ident::runtime)
47 }
48 Err(_) => panic!("Cannot find compio or compio_runtime."),
49 },
50 }
51}
52
53fn retrieve_driver_mod() -> proc_macro2::TokenStream {
54 match crate_name("compio-driver") {
55 Ok(FoundCrate::Itself) => quote!(crate),
56 Ok(FoundCrate::Name(name)) => {
57 let ident = Ident::new(&name, Span::call_site());
58 quote!(::#ident)
59 }
60 Err(_) => match crate_name("compio") {
61 Ok(FoundCrate::Itself) => quote!(crate::driver),
62 Ok(FoundCrate::Name(name)) => {
63 let ident = Ident::new(&name, Span::call_site());
64 quote!(::#ident::driver)
65 }
66 Err(_) => {
67 let ident = Ident::new("compio_driver", Span::call_site());
68 quote!(::#ident)
69 }
70 },
71 }
72}