Virtue, a sinless derive macro helper

Goals

Example

```rust use virtue::prelude::*;

[procmacroderive(YourDerive, attributes(some, attributes, go, here))]

pub fn deriveyourderive(input: TokenStream) -> TokenStream { deriveyourderiveinner(input) .unwraporelse(|error| error.intotoken_stream()) }

fn deriveyourderiveinner(input: TokenStream) -> Result { // Parse the struct or enum you want to implement a derive for let parse = Parse::new(input)?; // Get a reference to the generator let (mut generator, body) = parse.intogenerator(); match body { Body::Struct(body) => { // Implement your struct body here // See Generator for more information generator.implfor("YourTrait")? .generatefn("yourfn") .withselfarg(FnSelfArg::RefSelf) .body(|fnbody| { fnbody.pushparsed("println!(\"Hello world\");"); })?; }, Body::Enum(body) => { // Implement your enum body here // See Generator for more information generator.implfor("YourTrait")? .generatefn("yourfn") .withselfarg(FnSelfArg::RefSelf) .body(|fnbody| { fnbody.pushparsed("println!(\"Hello world\");"); })?; }, } generator.finish() } ```

Will generate

ignore impl YourTrait for <Struct or Enum> { fn your_fn(&self) { // .generate_fn("your_fn").with_self_arg(FnSelfArg::RefSelf) println!("Hello world"); // fn_body.push_parsed(...) } }