use super::*;
use crate::Identifier;
use itertools::Itertools as _;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct CompositeFieldInitializer {
pub identifier: Identifier,
pub expression: Option<Expression>,
pub span: Span,
pub id: NodeID,
}
crate::simple_node_impl!(CompositeFieldInitializer);
impl fmt::Display for CompositeFieldInitializer {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if let Some(expr) = &self.expression {
write!(f, "{}: {expr}", self.identifier)
} else {
write!(f, "{}", self.identifier)
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct CompositeExpression {
pub path: Path,
pub const_arguments: Vec<Expression>,
pub members: Vec<CompositeFieldInitializer>,
pub span: Span,
pub id: NodeID,
}
impl fmt::Display for CompositeExpression {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.path)?;
if !self.const_arguments.is_empty() {
write!(f, "::[{}]", self.const_arguments.iter().format(", "))?;
}
write!(f, " {{")?;
if !self.members.is_empty() {
write!(f, " ")?;
}
write!(f, "{}", self.members.iter().format(", "))?;
if !self.members.is_empty() {
write!(f, " ")?;
}
write!(f, "}}")
}
}
impl From<CompositeExpression> for Expression {
fn from(value: CompositeExpression) -> Self {
Expression::Composite(value)
}
}
crate::simple_node_impl!(CompositeExpression);