nop-macros 0.2.0

Procedural macros to do nothing, allowing attributes to be used as metadata
Documentation
  • Coverage
  • 100%
    4 out of 4 items documented4 out of 4 items with examples
  • Size
  • Source code size: 19.37 kB This is the summed size of all the files inside the crates.io package for this release.
  • Documentation size: 267.04 kB This is the summed size of all files generated by rustdoc for all configured targets
  • Links
  • Techcable/nop-macros.rust
    0 0 1
  • crates.io
  • Dependencies
  • Versions
  • Owners
  • Techcable

nop-macros

Crates.io Version docs.rs

Procedural macros that do nothing, allowing attributes to be used as metadata.

Any code marked with the #[nop_macros::nop] attribute is passed through without modification. Similarly, using #[derive(nop_macros::NopDerive)] on a type does not generate any code or implement any traits.

Useful for source-code only metadata, readable by tools but ignored at runtime. I use this for configuring build-time source generation (see "Use Cases" below).

All macros can be used multiple times and renamed with pub use.

Example

pub use nop_macros::nop as example1;
pub use nop_macros::nop_noargs as example2;
pub use nop_macros::nop as example3;
pub use nop_macros::NopDerive as DeriveExample1;
pub use nop_macros::NopDerive as DeriveExample2;

#[example1(ignored)]
#[example2]
pub fn foo() -> i32 {
    7
}

#[example2]
const BAR: u32 = 42;

#[example3(781)]
pub fn baz() -> i32 {
    18
}

assert_eq!(foo(), 7);
assert_eq!(BAR, 42);
assert_eq!(baz(), 18);

#[derive(Debug, DeriveExample1, DeriveExample2)]
struct Foo {
    bar: String
}

Use Cases

I use this for generating source-code at build-time, configured by attributes on rust code.

An example of a build-time source generator that parses rust code is cbindgen. However, that project uses comments for configruation, which I want to avoid.

Build-time source generation is significantly more powerful and flexible than procedural macros. Maktlad has a blog post on this subject.

I recomend genco instead of quote for build-time quasiquoting. It preserves whitespace and supports languages besides rust.

I still use syn for parsing rust code.