doku_derive/
lib.rs

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            // We're emitting a dummy impl to avoid a potential error-cascade
35            // when something else already expects this type to be doku-fied
36            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}