# prom-attire [![travis-badge][]][travis] [![cargo-badge][]][cargo] [![license-badge][]][license] [![rust-version-badge][]][rust-version] **Pro**cedural **M**acro **Attri**but**e**s For when you need the best dressed procedural macro. ## Developing This project uses [clippy][] and denies warnings in CI builds. To ensure your changes will be accepted please check them with `cargo clippy` (available via `cargo install clippy` on nightly rust) before submitting a pull request (along with `cargo test` as usual). Both the nightly date and clippy version used in CI are pinned in the `.travis.yml` as clippy sometimes breaks for a few days after a new nightly is published, feel free to update to a new known good pair anytime as part of a pull request. ### Why Three Crates Why not three crates? One issue with current procedural macros is that crates defining procedural macros can't use their own procedural macros. In this case `prom-attire` wants to have some attributes controlling how it parses the attributes (at the moment, only the top level "scope" attribute identifier, i.e. the value `attire` in `#[attire(scope = shoes)]`), obviously `prom-attire` will need to parse these attributes out to get the details it needs, but the entire point of `prom-attire` is to make parsing attributes pain-free, having a manual parser in `prom-attire` itself mean any upgrades to the parsing code generated by `prom-attire` would probably have to be duplicated in the parsing code inside `prom-attire` itself. Luckily there is a solution, by using three crates ;-) The base is `prom-attire-impl`, this implements the entirety of the procedural derive, but does not itself define a procedural derive macro. Instead it exports a single function taking in the AST provided to a procedural derive and some configuration and returns the derived implementation. Next `prom-attire-bootstrap` defines a simple procedural derive macro `FromAttributesBootstrap` that calls into `prom-attire-impl` with a hardcoded configuration. Finally `prom-attire` defines a slightly more complicated procedural derive macro (`FromAttributes`) that parses some attributes (using a parser derived with `FromAttributesBootstrap`), then calls into `prom-attire-impl` with a configuration derived from those parsed attributes. This is the "public" entrypoint to the crates, technically the others could be used but they're unlikely to be useful. So, in the end `prom-attire` is a crate defining a procedural derive macro, to help developers write procedural derive macros, that uses a procedural derive in its implementation (no, that is not inception). ## License Licensed under either of * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) at your option. ### Contribution Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you shall be dual licensed as above, without any additional terms or conditions. [travis-badge]: https://img.shields.io/travis/Nemo157/prom-attire-rs/master.svg?style=flat-square [travis]: https://travis-ci.org/Nemo157/prom-attire-rs [cargo-badge]: https://img.shields.io/crates/v/prom-attire.svg?style=flat-square [cargo]: https://crates.io/crates/prom-attire [license-badge]: https://img.shields.io/badge/license-MIT/Apache--2.0-lightgray.svg?style=flat-square [license]: #license [rust-version-badge]: https://img.shields.io/badge/rust-1.15+-blue.svg?style=flat-square [rust-version]: .travis.yml#L5 [clippy]: https://github.com/Manishearth/rust-clippy