An open API service indexing awesome lists of open source software.

https://github.com/sharnoff/derive-syn-parse

A #[derive] macro for syn's `Parse` trait
https://github.com/sharnoff/derive-syn-parse

procedural-macro rust syn

Last synced: about 2 months ago
JSON representation

A #[derive] macro for syn's `Parse` trait

Awesome Lists containing this project

README

        

[![crates.io](https://img.shields.io/crates/v/derive-syn-parse.svg)](https://crates.io/crates/derive-syn-parse)
[![docs.rs](https://docs.rs/derive-syn-parse/badge.svg)](https://docs.rs/derive-syn-parse)

# `derive-syn-parse`: A derive macro for `syn`'s `Parse` trait

This is a fairly straightforward derive macro that produces an implementation `syn::parse::Parse`
for the type it's applied to.

A common pattern when writing custom `syn` parsers is repeating `: input.parse()?` for
each field in the output. This crate's `#[derive(Parse)]` handles that for you, with some helpful
extra customization.

## Usage

Using this crate is as simple as adding it to your 'Cargo.toml' and importing the derive macro:

```toml
# Cargo.toml

[dependencies]
derive-syn-parse = "0.2.0"
```

```rust
// your_file.rs
use derive_syn_parse::Parse;

#[derive(Parse)]
struct CustomParsable {
// ...
}
```

The derived implementation of `Parse` will always parse in the order that the fields are given.
Detailed information about the various field attributes available is given in the
[crate documentation](https://docs.rs/derive-syn-parse).

This crate is primarily intended for users who are already making heavy use of `syn` and wish to
reduce the amount of boilerplate code required.

## Motivation

When writing rust code that makes heavy use of `syn`'s parsing functionality, we often end up
writing things like:
```rust
use syn::parse::{Parse, ParseStream};
use syn::{Ident, Token, Type};

// A simplified struct field
//
// x: i32
struct MyField {
ident: Ident,
colon_token: Token![:],
ty: Type,
}

impl Parse for MyField {
fn parse(input: ParseStream) -> syn::Result {
Ok(MyField {
ident: input.parse()?,
colon_token: input.parse()?,
ty: input.parse()?,
})
}
}
```
This is really repetitive! Ideally, we'd like to just `#[derive(Parse)]` and have it work. And
so we can! (for the most part) Adding `#[derive(Parse)]` to the previous struct produces an
equivalent implementation of `Parse`:
```rust
use syn::{Ident, Token, Type};
use derive_syn_parse::Parse;

#[derive(Parse)]
struct MyField {
ident: Ident,
colon_token: Token![:],
ty: Type,
}
```

Of course, there are more complicated cases. But - even though they're complicated, many of them are
still covered by the various advanced features provided! For more information, see the
[crate documentation](https://docs.rs/derive-syn-parse).