1use proc_macro::TokenStream as TokenStream1;
2use proc_macro_error::{abort, proc_macro_error};
3use syn::*;
4
5mod implement;
6mod implement_internal;
7mod target;
8
9fn random() -> u64 {
10 use std::hash::{BuildHasher, Hasher};
11 std::collections::hash_map::RandomState::new()
12 .build_hasher()
13 .finish()
14}
15
16trait ResultExt {
17 type R;
18 fn unwrap_or_abort(self) -> Self::R;
19}
20
21impl<T> ResultExt for syn::Result<T> {
22 type R = T;
23
24 fn unwrap_or_abort(self) -> Self::R {
25 match self {
26 Ok(ok) => ok,
27 Err(e) => abort!(e.to_compile_error(), e),
28 }
29 }
30}
31
32#[proc_macro_error]
33#[proc_macro_attribute]
34pub fn target(arg: TokenStream1, input: TokenStream1) -> TokenStream1 {
35 target::target(parse_macro_input!(arg), parse_macro_input!(input)).into()
36}
37
38#[proc_macro_error]
39#[proc_macro_attribute]
40pub fn implement(arg: TokenStream1, input: TokenStream1) -> TokenStream1 {
41 implement::implement(&parse_macro_input!(arg), &parse_macro_input!(input)).into()
42}
43
44#[doc(hidden)]
45#[proc_macro_error]
46#[proc_macro]
47pub fn __implement_internal(input: TokenStream1) -> TokenStream1 {
48 parse_macro_input!(input as implement_internal::Input)
49 .implement_internal()
50 .into()
51}