integral-enum 3.0.1

Simple way to define integer-like enums
Documentation
use proc_macro2::Span;
use syn::{token::Plus, BinOp, Expr, ExprBinary, ExprLit, Lit, LitInt};

pub struct Tag {
    pub current: Expr,
}

fn int(repr: &str) -> Expr {
    Expr::Lit(ExprLit {
        attrs: Vec::new(),
        lit: Lit::Int(LitInt::new(repr, Span::mixed_site())),
    })
}

fn add_one(to: Expr) -> Expr {
    Expr::Binary(ExprBinary {
        attrs: Vec::new(),
        left: to.into(),
        op: BinOp::Add(Plus([Span::mixed_site()])),
        right: int("1").into(),
    })
}

impl Default for Tag {
    fn default() -> Self {
        Self { current: int("0") }
    }
}

impl Tag {
    pub fn process(&mut self, expr: Option<&Expr>) -> Expr {
        match expr {
            Some(new_current) => {
                self.current = add_one(new_current.clone());
                new_current.clone()
            }

            None => {
                let prev = self.current.clone();
                self.current = add_one(self.current.clone());
                prev
            }
        }
    }
}