# 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