gecko-dev/third_party/rust/darling/README.md

58 строки
3.0 KiB
Markdown
Исходник Обычный вид История

Darling
=======
[![Build Status](https://travis-ci.org/TedDriggs/darling.svg?branch=master)](https://travis-ci.org/TedDriggs/darling)
[![Latest Version](https://img.shields.io/crates/v/darling.svg)](https://crates.io/crates/darling)
`darling` is a crate for proc macro authors, which enables parsing attributes into structs. It is heavily inspired by `serde` both in its internals and in its API.
# Usage
`darling` provides a set of traits which can be derived or manually implemented.
1. `FromMetaItem` is used to extract values from a meta-item in an attribute. Implementations are likely reusable for many libraries, much like `FromStr` or `serde::Deserialize`. Trait implementations are provided for primitives, some std types, and some `syn` types.
1. `FromDeriveInput` is implemented or derived by each proc-macro crate which depends on `darling`. This is the root for input parsing; it gets access to the identity, generics, and visibility of the target type, and can specify which attribute names should be parsed or forwarded from the input AST.
1. `FromField` is implemented or derived by each proc-macro crate which depends on `darling`. Structs deriving this trait will get access to the identity (if it exists), type, and visibility of the field.
# Example
```rust,ignore
#[macro_use]
extern crate darling;
extern crate syn;
#[derive(Default, FromMetaItem)]
#[darling(default)]
pub struct Lorem {
#[darling(rename = "sit")]
ipsum: bool,
dolor: Option<String>,
}
#[derive(FromDeriveInput)]
#[darling(from_ident, attributes(my_crate), forward_attrs(allow, doc, cfg))]
pub struct MyTraitOpts {
ident: syn::Ident,
attrs: Vec<syn::Attribute>,
lorem: Lorem,
}
```
The above code will then be able to parse this input:
```rust,ignore
/// A doc comment which will be available in `MyTraitOpts::attrs`.
#[derive(MyTrait)]
#[my_crate(lorem(dolor = "Hello", ipsum))]
pub struct ConsumingType;
```
# Features
Darling's features are built to work well for real-world projects.
* **Defaults**: Supports struct- and field-level defaults, using the same path syntax as `serde`.
* **Field Renaming**: Fields can have different names in usage vs. the backing code.
No bug - Revendor rust dependencies. r=me on a CLOSED TREE MozReview-Commit-ID: 7LSWUCyCxkT --HG-- rename : third_party/rust/quote/.cargo-checksum.json => third_party/rust/quote-0.3.15/.cargo-checksum.json rename : third_party/rust/quote/Cargo.toml => third_party/rust/quote-0.3.15/Cargo.toml rename : third_party/rust/syn/LICENSE-MIT => third_party/rust/quote-0.3.15/LICENSE-MIT rename : third_party/rust/quote/README.md => third_party/rust/quote-0.3.15/README.md rename : third_party/rust/quote/src/ident.rs => third_party/rust/quote-0.3.15/src/ident.rs rename : third_party/rust/quote/src/lib.rs => third_party/rust/quote-0.3.15/src/lib.rs rename : third_party/rust/quote/src/to_tokens.rs => third_party/rust/quote-0.3.15/src/to_tokens.rs rename : third_party/rust/quote/src/tokens.rs => third_party/rust/quote-0.3.15/src/tokens.rs rename : third_party/rust/quote/tests/test.rs => third_party/rust/quote-0.3.15/tests/test.rs rename : third_party/rust/syn/.cargo-checksum.json => third_party/rust/syn-0.11.11/.cargo-checksum.json rename : third_party/rust/syn/Cargo.toml => third_party/rust/syn-0.11.11/Cargo.toml rename : third_party/rust/syn/LICENSE-MIT => third_party/rust/syn-0.11.11/LICENSE-MIT rename : third_party/rust/syn/README.md => third_party/rust/syn-0.11.11/README.md rename : third_party/rust/syn/src/aster/generics.rs => third_party/rust/syn-0.11.11/src/aster/generics.rs rename : third_party/rust/syn/src/aster/ident.rs => third_party/rust/syn-0.11.11/src/aster/ident.rs rename : third_party/rust/syn/src/aster/invoke.rs => third_party/rust/syn-0.11.11/src/aster/invoke.rs rename : third_party/rust/syn/src/aster/lifetime.rs => third_party/rust/syn-0.11.11/src/aster/lifetime.rs rename : third_party/rust/syn/src/aster/mod.rs => third_party/rust/syn-0.11.11/src/aster/mod.rs rename : third_party/rust/syn/src/aster/path.rs => third_party/rust/syn-0.11.11/src/aster/path.rs rename : third_party/rust/syn/src/aster/qpath.rs => third_party/rust/syn-0.11.11/src/aster/qpath.rs rename : third_party/rust/syn/src/aster/ty.rs => third_party/rust/syn-0.11.11/src/aster/ty.rs rename : third_party/rust/syn/src/aster/ty_param.rs => third_party/rust/syn-0.11.11/src/aster/ty_param.rs rename : third_party/rust/syn/src/aster/where_predicate.rs => third_party/rust/syn-0.11.11/src/aster/where_predicate.rs rename : third_party/rust/syn/src/attr.rs => third_party/rust/syn-0.11.11/src/attr.rs rename : third_party/rust/syn/src/constant.rs => third_party/rust/syn-0.11.11/src/constant.rs rename : third_party/rust/syn/src/data.rs => third_party/rust/syn-0.11.11/src/data.rs rename : third_party/rust/syn/src/derive.rs => third_party/rust/syn-0.11.11/src/derive.rs rename : third_party/rust/syn/src/escape.rs => third_party/rust/syn-0.11.11/src/escape.rs rename : third_party/rust/syn/src/expr.rs => third_party/rust/syn-0.11.11/src/expr.rs rename : third_party/rust/syn/src/fold.rs => third_party/rust/syn-0.11.11/src/fold.rs rename : third_party/rust/syn/src/generics.rs => third_party/rust/syn-0.11.11/src/generics.rs rename : third_party/rust/syn/src/ident.rs => third_party/rust/syn-0.11.11/src/ident.rs rename : third_party/rust/syn/src/item.rs => third_party/rust/syn-0.11.11/src/item.rs rename : third_party/rust/syn/src/krate.rs => third_party/rust/syn-0.11.11/src/krate.rs rename : third_party/rust/syn/src/lib.rs => third_party/rust/syn-0.11.11/src/lib.rs rename : third_party/rust/syn/src/lit.rs => third_party/rust/syn-0.11.11/src/lit.rs rename : third_party/rust/syn/src/mac.rs => third_party/rust/syn-0.11.11/src/mac.rs rename : third_party/rust/syn/src/op.rs => third_party/rust/syn-0.11.11/src/op.rs rename : third_party/rust/syn/src/ty.rs => third_party/rust/syn-0.11.11/src/ty.rs rename : third_party/rust/syn/src/visit.rs => third_party/rust/syn-0.11.11/src/visit.rs rename : third_party/rust/unicode-xid/.cargo-checksum.json => third_party/rust/unicode-xid-0.0.4/.cargo-checksum.json rename : third_party/rust/unicode-xid/Cargo.toml => third_party/rust/unicode-xid-0.0.4/Cargo.toml
2018-02-14 14:39:47 +03:00
* **Auto-populated fields**: Structs deriving `FromDeriveInput` and `FromField` can declare properties named `ident`, `vis`, `ty`, `attrs`, and `generics` to automatically get copies of the matching values from the input AST. `FromDeriveInput` additionally exposes `data` to get access to the body of the deriving type, and `FromVariant` exposes `fields`.
* **Mapping function**: Use `#[darling(map="path")]` to specify a function that runs on the result of parsing a meta-item field. This can change the return type, which enables you to parse to an intermediate form and convert that to the type you need in your struct.
* **Skip fields**: Use `#[darling(skip)]` to mark a field that shouldn't be read from attribute meta-items.
* **Multiple-occurrence fields**: Use `#[darling(multiple)]` on a `Vec` field to allow that field to appear multiple times in the meta-item. Each occurrence will be pushed into the `Vec`.