1mod attrs;
2mod error;
3mod expand;
4mod utils;
5
6mod prelude {
7 pub(crate) use super::{
8 attrs::{self, RenameRule},
9 error::*,
10 utils::*,
11 };
12 pub use proc_macro::TokenStream;
13 pub use proc_macro2::{Span, TokenStream as TokenStream2};
14 pub use quote::{quote, quote_spanned};
15 pub use syn::spanned::Spanned;
16
17 pub type Result<T, E = Error> = std::result::Result<T, E>;
18}
19
20use self::prelude::*;
21use syn::parse_macro_input;
22
23#[proc_macro_derive(Document, attributes(doku))]
24pub fn derive_document(input: TokenStream) -> TokenStream {
25 let input = parse_macro_input!(input as syn::DeriveInput);
26
27 match expand::expand(&input) {
28 Ok(stream) => stream,
29
30 Err(err) => {
31 let err = err.compile();
32 let ident = input.ident;
33
34 quote! {
37 #err
38
39 impl ::doku::Document for #ident {
40 fn ty() -> ::doku::Type {
41 unreachable!()
42 }
43 }
44 }
45 }
46 }
47 .into()
48}