duchess_macro/
lib.rs

1use argument::{DuchessDeclaration, MethodSelector};
2use parse::Parser;
3use proc_macro::TokenStream;
4
5use duchess_reflect::*;
6
7mod derive;
8mod java_function;
9
10/// The main duchess macro, used like so
11///
12/// ```rust,ignore
13/// duchess::java_package! {
14///     package some.pkg.name;
15///     class SomeDotId { * }
16/// }
17/// ```
18///
19/// see the tutorial in the [duchess book] for more info.
20///
21/// [duchess book]: https://nikomatsakis.github.io/duchess/
22#[proc_macro]
23pub fn java_package(input: TokenStream) -> TokenStream {
24    let input: proc_macro2::TokenStream = input.into();
25    let decl = match Parser::from(input).parse::<DuchessDeclaration>() {
26        Ok(decl) => decl,
27        Err(err) => return err.to_compile_error().into(),
28    };
29
30    match decl.to_tokens() {
31        Ok(t) => return t.into(),
32        Err(e) => return e.into_compile_error().into(),
33    }
34}
35
36#[proc_macro_attribute]
37pub fn java_function(args: TokenStream, input: TokenStream) -> TokenStream {
38    let args: proc_macro2::TokenStream = args.into();
39    let args = match Parser::from(args).parse::<MethodSelector>() {
40        Ok(decl) => decl,
41        Err(err) => return err.to_compile_error().into(),
42    };
43
44    let item_fn = match syn::parse::<syn::ItemFn>(input) {
45        Ok(item_fn) => item_fn,
46        Err(err) => return err.into_compile_error().into(),
47    };
48
49    match java_function::java_function(args, item_fn) {
50        Ok(t) => t.into(),
51        Err(err) => err.into_compile_error().into(),
52    }
53}
54
55synstructure::decl_derive!([ToRust, attributes(java)] => derive::derive_to_rust);
56
57synstructure::decl_derive!([ToJava, attributes(java)] => derive::derive_to_java);