Skip to main content

newer_type_macro/
lib.rs

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}