Expand description
§Virtue, a sinless derive macro helper
§Goals
- Zero dependencies, so fast compile times
- No other dependencies needed
- Declarative code generation
- As much typesystem checking as possible
- Build for modern rust: 1.57 and up
- Build with popular crates in mind:
- Will always respect semver. Minor releases will never have:
- Breaking API changes
- MSRV changes
§Example
First, add this to your Cargo.toml:
[lib]
proc-macro = true
Then instantiate your project with:
ⓘ
use virtue::prelude::*;
#[proc_macro_derive(RetHi)] // change this to change your #[derive(...)] name
pub fn derive_ret_hi(input: TokenStream) -> TokenStream {
derive_ret_hi_inner(input).unwrap_or_else(|error| error.into_token_stream())
}
fn derive_ret_hi_inner(input: TokenStream) -> Result<TokenStream> {
let parse = Parse::new(input)?;
let (mut generator, _attributes, _body) = parse.into_generator();
generator
.generate_impl()
.generate_fn("hi")
.with_self_arg(FnSelfArg::RefSelf)
.with_return_type("&'static str")
.body(|body| {
body.lit_str("hi");
Ok(())
})?;
generator.finish()
}
You can invoke this with
ⓘ
#[derive(RetHi)]
struct Foo;
fn main() {
println!("{}", Foo.hi());
}
The generated code is:
ⓘ
impl Foo {
fn hi(&self) -> &'static str {
"hi"
}
}
Modules§
- Code to help generate functions.
- Module for parsing code. The main enum is
Parse
. - Useful includes
- Utility functions
Enums§
- Errors that can occur while parsing or generator your derive macro.
Type Aliases§
- Result alias for virtue’s errors