brane_dsl/parser/
instance.rsuse std::num::NonZeroUsize;
use log::trace;
use nom::error::{ContextError, ParseError};
use nom::{IResult, Parser, combinator as comb, multi, sequence as seq};
use super::ast::{Expr, Identifier, Node, PropertyExpr};
use crate::parser::{expression, identifier};
use crate::scanner::{Token, Tokens};
use crate::spec::{TextPos, TextRange};
use crate::tag_token;
pub fn instance_property<'a, E: ParseError<Tokens<'a>> + ContextError<Tokens<'a>>>(input: Tokens<'a>) -> IResult<Tokens<'a>, PropertyExpr, E> {
trace!("Attempting to parse instance property");
let (r, (name, value)) = seq::separated_pair(identifier::parse, tag_token!(Token::Assign), expression::parse).parse(input)?;
let (r, c) = comb::opt(tag_token!(Token::Comma)).parse(r)?;
let range: TextRange = TextRange::new(name.start().clone(), c.map(|t| TextPos::end_of(t.tok[0].inner())).unwrap_or_else(|| value.end().clone()));
Ok((r, PropertyExpr { name, value: Box::new(value), range }))
}
pub fn parse<'a, E: ParseError<Tokens<'a>> + ContextError<Tokens<'a>>>(input: Tokens<'a>) -> IResult<Tokens<'a>, Expr, E> {
trace!("Attempting to parse instance expression");
let (r, n): (Tokens<'a>, Tokens<'a>) = tag_token!(Token::New)(input)?;
let (r, (class, properties)): (Tokens<'a>, (Identifier, Option<Vec<PropertyExpr>>)) =
comb::cut(seq::pair(identifier::parse, seq::preceded(tag_token!(Token::LeftBrace), comb::opt(multi::many1(instance_property)))))(r)?;
let (r, b): (Tokens<'a>, Tokens<'a>) = comb::cut(tag_token!(Token::RightBrace))(r)?;
Ok((r, Expr::new_instance(class, properties.unwrap_or_default(), TextRange::from((n.tok[0].inner(), b.tok[0].inner())))))
}