blob: 52b162f0d7ef9d9adf2c0ad166878a02dde6ea92 [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use proc_macro::TokenStream;
mod derive_reference_doc;
/// Macro that adds an implementation of the trait MarkdownReferenceDocGenerator
/// to structs with `derive(ReferenceDoc)`. The trait adds the fn
/// `get_markdown_reference_docs()`. The return value is generated by consuming the
/// struct's field names, types, and doc comments. Markdown headers in the
/// doc comments are appropriately indendented based on the context in which
/// they appear.
///
/// Attributes: none
///
/// Example:
///
/// ```rust
/// #[derive(ReferenceDoc)]
/// struct MyStruct {
/// /// This comment will appear for `field`, and can contain markdown.
/// /// It will be prefixed by a generated heading.
/// ///
/// /// Other comments may link to the generated heading using the hash `#field`.
/// /// For example, [this](#field) is a self-referencing link.
/// field: i32,
/// }
/// ```
#[proc_macro_derive(ReferenceDoc, attributes(reference_doc))]
pub fn derive_reference_doc(input: TokenStream) -> TokenStream {
let ast = syn::parse(input).expect("could not parse input");
derive_reference_doc::impl_derive_reference_doc(ast)
.unwrap_or_else(|err| err.to_compile_error())
.into()
}