worktable_macros 0.9.0

Proc-macro companion crate for worktable: the worktable! macro and its derives. Formerly published as worktable_codegen.
Documentation
mod delete;
mod in_place;
mod operation;
mod select;
mod update;

use proc_macro2::TokenTree;
use syn::spanned::Spanned;

use crate::common::Parser;
use crate::common::model::Queries;

impl Parser {
    pub fn parse_queries(&mut self) -> syn::Result<Queries> {
        let ident = self.input_iter.next().ok_or(syn::Error::new(
            self.input.span(),
            "Expected `queries` field in declaration",
        ))?;
        if let TokenTree::Ident(ident) = ident {
            if ident.to_string().as_str() != "queries" {
                return Err(syn::Error::new(
                    ident.span(),
                    "Expected `queries` field. `WorkTable` name must be specified",
                ));
            }
        } else {
            return Err(syn::Error::new(ident.span(), "Expected field name identifier."));
        };

        self.parse_colon()?;

        let mut queries = Queries::default();
        let ops = self
            .input_iter
            .next()
            .ok_or(syn::Error::new(self.input.span(), "Expected operation declarations"))?;
        if let TokenTree::Group(ops) = ops {
            let mut parser = Parser::new(ops.stream());
            while let Some(ident) = parser.peek_next() {
                match ident.to_string().as_str() {
                    "update" => {
                        let updates = parser.parse_updates()?;
                        queries.updates = updates;
                    }
                    "delete" => {
                        let deletes = parser.parse_deletes()?;
                        queries.deletes = deletes;
                    }
                    "in_place" => {
                        let in_place = parser.parse_in_place()?;
                        queries.in_place = in_place;
                    }
                    _ => return Err(syn::Error::new(ident.span(), "Unexpected identifier")),
                }
            }
        } else {
            return Err(syn::Error::new(ops.span(), "Expected operation declarations"));
        };

        self.try_parse_comma()?;

        Ok(queries)
    }
}