backyard-generator 0.1.10

Convert AST node back to PHP code.
Documentation
use backyard_nodes::{ cast_node, Node, NodeType, NodeWrapper };

use crate::generator::{ Builder, EndMode, Generator, GeneratorArgument, DEFAULT_GENERATORS };

pub struct MatchGenerator;

impl MatchGenerator {
  pub fn generate<'arena>(
    generator: &mut Generator<'arena, '_>,
    builder: &mut Builder,
    node: &Node<'arena>
  ) {
    let node = cast_node!(Match, &node.wrapper);
    builder.push("match(");
    generator.generate_node(builder, &node.condition, &mut GeneratorArgument::default());
    builder.push(") {");
    let mut arms = generator.generate_nodes_new(
      &node.arms,
      &mut GeneratorArgument::new(
        EndMode::CommaWithoutEnd,
        &[(NodeType::MatchArm, Self::generate_arm)]
      )
    );
    arms.indent();
    builder.extend(arms);
    builder.new_line();
    builder.push("}");
  }

  pub fn generate_arm<'arena>(
    generator: &mut Generator<'arena, '_>,
    builder: &mut Builder,
    node: &Node<'arena>
  ) {
    let node = cast_node!(MatchArm, &node.wrapper);
    if !node.conditions.is_empty() {
      let conditions = generator.generate_nodes_new(
        &node.conditions,
        &mut GeneratorArgument::for_parameter(&DEFAULT_GENERATORS)
      );
      builder.push(&conditions.print(" "));
    } else {
      builder.push("default");
    }
    builder.push(" => ");
    generator.generate_node(builder, &node.expr, &mut GeneratorArgument::default());
  }
}