datalit-macros-internals 0.1.0-alpha.4

Internals for the datalit crate
Documentation
use syn::{Lifetime, parse::ParseStream};

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

use super::Entry;

#[derive(derive_syn_parse::Parse)]
pub struct LabeledEntry {
    label: Lifetime,
    #[prefix(syn::Token![:])]
    sub_entry: Box<Entry>,
}

impl LabeledEntry {
    pub fn peek(input: ParseStream) -> bool {
        input.peek(Lifetime) && input.peek2(syn::Token![:])
    }
}

impl StateOperation for LabeledEntry {
    fn apply_to(&self, state: &mut EntryState) -> syn::Result<()> {
        let start = state.curr_offset();
        self.sub_entry.apply_to(state)?;
        let end = state.curr_offset();
        state.report_label_def(&self.label, start, end)
    }
}