pest_tree_derive 0.1.0

Derive crate for pest_tree
Documentation
#![allow(
    dead_code,
    irrefutable_let_patterns,
    unused_variables,
    unused_imports,
    unused
)]
use derive_builder::Builder;
use std::fmt::Debug;

use proc_macro2::{Ident, TokenStream};
use quote::{quote, quote_spanned, ToTokens};
use syn::parse::{Parse, ParseStream};
use syn::spanned::Spanned;
use syn::{
    braced, parse_macro_input, parse_quote, token, Attribute, Data, DataEnum, DataStruct,
    DeriveInput, Expr, Fields, GenericParam, Generics, Index, Meta, Token, Variant,
};
mod strategy;
use strategy::*;
mod attributes;
use attributes::*;
mod context;
use context::*;

#[proc_macro_derive(PestTree, attributes(pest_tree))]
pub fn pest_tree_derive(token_stream: proc_macro::TokenStream) -> proc_macro::TokenStream {
    let ast: syn::Item = parse_macro_input!(token_stream);
    match ast {
        syn::Item::Struct(item_struct) => {
            let strat = StrategyAttribute::from_syn_attributes(&item_struct.attrs);
            match strat {
                StrategyAttribute::Direct => {
                    let ctx = DirectStructContext::from_syn_item_struct(item_struct);
                    ctx.to_impl().into()
                }
                StrategyAttribute::Sequential => {
                    let ctx = SequentialStructContext::from_syn_item_struct(item_struct);
                    ctx.to_impl().into()
                }
                _ => unreachable!("invalid parsing result (struct)"),
            }
        }
        syn::Item::Enum(item_enum) => {
            let strat = StrategyAttribute::from_syn_attributes(&item_enum.attrs);
            match strat {
                StrategyAttribute::Conditional => {
                    let ctx = ConditionalEnumContext::from_syn_item_enum(item_enum);
                    ctx.to_impl().into()
                }
                _ => unreachable!("invalid parsing result (enum)"),
            }
        }
        _ => todo!(),
    }
}

fn pretty_print(ts: &proc_macro2::TokenStream) -> String {
    let file = syn::parse_file(&ts.to_string()).expect("pretty print died");
    prettyplease::unparse(&file)
}