use super::{LayerBlock, ParamsBlock};
use crate::kw;
use syn::parse::{Parse, ParseStream};
use syn::{Ident, braced, token};
#[allow(dead_code)]
pub struct ModelAst {
pub model: Ident,
pub brace_token: token::Brace,
pub params_block: Option<ParamsBlock>,
pub layer_block: Option<LayerBlock>,
pub semi_token: Option<token::Semi>,
}
impl Parse for ModelAst {
fn parse(input: ParseStream) -> syn::Result<Self> {
let model: Ident = input.parse()?;
let content; let brace_token = braced!(content in input);
let mut params_block: Option<ParamsBlock> = None;
let mut layer_block: Option<LayerBlock> = None;
while !content.is_empty() {
if content.peek(kw::layer) {
layer_block = content.parse().ok();
} else if content.peek(kw::params) {
params_block = content.parse().ok();
} else {
break;
}
}
let semi_token = if input.peek(token::Semi) {
input.parse().ok()
} else {
None
};
if layer_block.is_some() && params_block.is_none() {
return Err(syn::Error::new_spanned(
model,
"To define any edges with the macro, you must also define nodes.",
));
}
Ok(ModelAst {
model,
brace_token,
layer_block,
params_block,
semi_token,
})
}
}