use crate::ast::RuleBlockAst;
use syn::parse::{Parse, ParseStream};
use syn::{Expr, Token};
pub struct DefaultStateFieldAst {
#[allow(dead_code)]
pub key: crate::keywords::default_state,
#[allow(dead_code)]
pub colon: Token![:],
pub state: Expr,
#[allow(dead_code)]
pub semi: Option<Token![;]>,
}
pub struct FiniteStateMachineAst {
pub default_state: Option<DefaultStateFieldAst>,
pub rules: RuleBlockAst,
}
impl Parse for DefaultStateFieldAst {
fn parse(input: ParseStream) -> syn::Result<Self> {
let key = input.parse()?;
let colon = input.parse()?;
let state = input.parse()?;
let semi = if input.peek(Token![;]) {
Some(input.parse()?)
} else {
None
};
Ok(Self {
key,
colon,
state,
semi, })
}
}
impl Parse for FiniteStateMachineAst {
fn parse(input: ParseStream) -> syn::Result<Self> {
let default_state = if input.peek(crate::keywords::default_state) {
Some(input.parse::<DefaultStateFieldAst>()?)
} else {
None
};
let rules = input.parse::<RuleBlockAst>()?;
Ok(Self {
default_state,
rules,
})
}
}
fn _parse_default_state(input: ParseStream) -> Option<DefaultStateFieldAst> {
if input.peek(Token![#]) && input.peek3(crate::keywords::default_state) {
return input.parse::<DefaultStateFieldAst>().ok();
}
None
}