Skip to content

racharron/derive-syn-parse

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

35 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

crates.io docs.rs

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 <name>: 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:

# Cargo.toml

[dependencies]
derive-syn-parse = "0.1.5"
// 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.

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:

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<Self> {
        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:

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.

About

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

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Rust 100.0%