diff --git a/src/doc/book/src/procedural-macros.md b/src/doc/book/src/procedural-macros.md index 468a8f904a45..e22ef85546bd 100644 --- a/src/doc/book/src/procedural-macros.md +++ b/src/doc/book/src/procedural-macros.md @@ -210,12 +210,15 @@ Hello, World! My name is FrenchToast Hello, World! My name is Waffles ``` +We've done it! + ## Custom Attributes In some cases it might make sense to allow users some kind of configuration. -For our example the user might want to overwrite the name that is printed in the `hello_world()` method. +For example, the user might want to overwrite the name that is printed in the `hello_world()` method. This can be achieved with custom attributes: + ```rust,ignore #[derive(HelloWorld)] #[HelloWorldName = "the best Pancakes"] @@ -232,8 +235,8 @@ If we try to compile this though, the compiler will respond with an error: error: The attribute `HelloWorldName` is currently unknown to the compiler and may have meaning added to it in the future (see issue #29642) ``` -The compiler needs to know that we handle this attribute and to not respond with an error. -This is done in the `hello-world-derive`-crate by adding `attributes` to the `proc_macro_derive` attribute: +The compiler needs to know that we're handling this attribute and to not respond with an error. +This is done in the `hello-world-derive` crate by adding `attributes` to the `proc_macro_derive` attribute: ```rust,ignore #[proc_macro_derive(HelloWorld, attributes(HelloWorldName))] @@ -244,11 +247,11 @@ Multiple attributes can be specified that way. ## Raising Errors -Let's assume that we do not want to accept `Enums` as input to our custom derive method. +Let's assume that we do not want to accept enums as input to our custom derive method. This condition can be easily checked with the help of `syn`. -But how to we tell the user, that we do not accept `Enums`. -The idiomatic was to report errors in procedural macros is to panic: +But how do we tell the user, that we do not accept enums? +The idiomatic way to report errors in procedural macros is to panic: ```rust,ignore fn impl_hello_world(ast: &syn::MacroInput) -> quote::Tokens { @@ -257,14 +260,14 @@ fn impl_hello_world(ast: &syn::MacroInput) -> quote::Tokens { if let syn::Body::Struct(_) = ast.body { // Yes, this is a struct quote! { - impl HelloWorld for #name { + impl HelloWorld for #name { fn hello_world() { println!("Hello, World! My name is {}", stringify!(#name)); } } } } else { - //Nope. This is an Enum. We cannot handle these! + //Nope. This is an Enum. We cannot handle these! panic!("#[derive(HelloWorld)] is only defined for structs, not for enums!"); } }