use std::convert::TryFrom;
use proc_macro2::TokenStream;
use syn::{token::Brace, Block};
#[derive(Clone, Debug, syn_derive::ToTokens, syn_derive::Parse)]
pub struct InvalidBlock {
#[syn(braced)]
pub brace: Brace,
#[syn(in = brace)]
pub body: TokenStream,
}
#[derive(Clone, Debug, syn_derive::ToTokens)]
pub enum NodeBlock {
ValidBlock(Block),
Invalid(InvalidBlock),
}
impl NodeBlock {
pub fn try_block(&self) -> Option<&Block> {
match self {
Self::ValidBlock(b) => Some(b),
Self::Invalid(_) => None,
}
}
}
impl TryFrom<NodeBlock> for Block {
type Error = syn::Error;
fn try_from(v: NodeBlock) -> Result<Block, Self::Error> {
match v {
NodeBlock::ValidBlock(v) => Ok(v),
NodeBlock::Invalid(_) => Err(syn::Error::new_spanned(
v,
"Cant parse expression as block.",
)),
}
}
}