Skip to main content

compio_macros/
lib.rs

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}