datalit-macros-internals 0.1.0-alpha.4

Internals for the datalit crate
Documentation
mod block;
mod call;
mod labeled;
mod literal;
mod mode_change;
mod repeat;
mod sequence;

use crate::state::{EntryState, StateOperation};

pub use self::{
    block::BlockEntry,
    call::CallEntry,
    labeled::LabeledEntry,
    literal::{ByteLiteral, ByteStringLiteral, CStringLiteral, IntLiteral},
    mode_change::ModeChange,
    repeat::RepeatEntry,
    sequence::SequenceEntry,
};

macro_rules! build_variant {
    (enum $name:ident {$(
        ($type:ident, $desc:literal)
    ),* $(,)?}) => {
        // Define the enum with variants and associated parsing logic
        #[derive(derive_syn_parse::Parse)]
        pub enum $name {
            $(
                #[peek_with($type::peek, name = $desc)]
                $type($type),
            )*
        }

        impl StateOperation for $name {
            fn apply_to(&self, state: &mut EntryState) -> syn::Result<()> {
                match self {
                    $(
                        $name::$type(inner) => inner.apply_to(state)?,
                    )*
                }
                Ok(())
            }
        }
    }
}

build_variant! {
    enum Entry {
        (IntLiteral, "integer literal"),
        (ByteStringLiteral, "byte string literal"),
        (ByteLiteral, "byte literal"),
        (CStringLiteral, "C-style string literal"),
        (BlockEntry, "braced list of entries"),
        (LabeledEntry, "labeled entry"),
        (RepeatEntry, "repeated entry"),
        (CallEntry, "call entry"),
        (ModeChange, "mode change"),
    }
}