1#![allow(missing_docs)]
2use std::{env, sync::LazyLock};
12
13use equivalence::Equivalence;
14use map::MapSignature;
15use proc_macro_crate::{FoundCrate, crate_name};
16use proc_macro2::Span;
17use quote::{ToTokens, TokenStreamExt, quote};
18use rewrite::Rewrite;
19use rule::TreeRule;
20use syn::{Ident, parse_macro_input};
21use term::TreeTerm;
22
23mod equivalence;
24mod map;
25mod rewrite;
26mod rule;
27mod term;
28
29pub(crate) struct CrateRoot {
30 root: LazyLock<String>,
31}
32
33impl ToTokens for CrateRoot {
34 fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
35 let crate_root = Ident::new(&self.root, Span::call_site());
36
37 tokens.append_all(quote! { ::#crate_root });
38 }
39}
40
41pub(crate) static CRATE_ROOT: CrateRoot = CrateRoot {
42 root: LazyLock::new(|| {
43 if env::var("CARGO_PKG_NAME").unwrap() == "ekege" {
44 String::from("ekege")
45 } else if let FoundCrate::Name(root_name) =
46 crate_name("ekege").expect("proc-macro-crate could not detect ekege")
47 {
48 root_name
49 } else {
50 unreachable!()
51 }
52 }),
53};
54
55#[proc_macro]
56pub fn term(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream {
57 let input = parse_macro_input!(tokens as TreeTerm);
58
59 proc_macro::TokenStream::from(input.to_token_stream())
60}
61
62#[proc_macro]
63pub fn map_signature(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream {
64 let input = parse_macro_input!(tokens as MapSignature);
65
66 proc_macro::TokenStream::from(input.to_token_stream())
67}
68
69#[proc_macro]
70pub fn rule(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream {
71 let input = parse_macro_input!(tokens as TreeRule);
72
73 proc_macro::TokenStream::from(input.to_token_stream())
74}
75
76#[proc_macro]
77pub fn rewrite(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream {
78 let input = parse_macro_input!(tokens as Rewrite);
79
80 proc_macro::TokenStream::from(input.to_token_stream())
81}
82
83#[proc_macro]
84pub fn equivalence(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream {
85 let input = parse_macro_input!(tokens as Equivalence);
86
87 proc_macro::TokenStream::from(input.to_token_stream())
88}