dto_derive 0.1.1

Derive for automatic mapping DTOs to Entities and vice versa.
Documentation
use proc_macro2::Span;
use syn::parse::ParseStream;
use syn::punctuated::Punctuated;
use syn::{Error, Ident, Lit, Result, Token};

use super::SpannedParse;
use crate::helpers::Sequence;

#[derive(Debug)]
pub(crate) struct SkipStructAttr {
    pub(crate) skips: Punctuated<Ident, Token![,]>,
    pub(crate) span: Span,
}

impl SpannedParse for SkipStructAttr {
    fn parse(input: ParseStream, span: Span) -> Result<Self> {
        input.parse::<super::kw::skip>()?;
        input.parse::<Token![=]>()?;
        let skip_lit = input.parse::<Lit>()?;
        if let Lit::Str(ref skip_names) = skip_lit {
            let skip_fields = skip_names.parse::<Sequence<Ident, Token![,]>>()?;
            if skip_fields.len() == 0 {
                Err(Error::new_spanned(
                    skip_lit,
                    "expected at least one field name",
                ))
            } else {
                Ok(SkipStructAttr {
                    skips: skip_fields.into_inner(),
                    span,
                })
            }
        } else {
            Err(Error::new_spanned(
                skip_lit,
                "expected string literal containing field names separated by comma",
            ))
        }
    }
}