All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.kaitai.struct.languages.components.GoSwitchOps.scala Maven / Gradle / Ivy

package io.kaitai.struct.languages.components

import io.kaitai.struct.datatype.DataType
import io.kaitai.struct.datatype.DataType.{BytesType, SwitchType}
import io.kaitai.struct.exprlang.Ast
import io.kaitai.struct.format.Identifier
import io.kaitai.struct.translators.GoTranslator

trait GoSwitchOps extends SwitchOps {
  val translator: GoTranslator

  def switchShouldUseCompareFn(onType: DataType): (Option[String], () => Unit)
  def switchCaseStartCompareFn(compareFn: String, switchOn: Ast.expr, condition: Ast.expr): Unit

  override def switchCases[T](
    id: Identifier,
    on: Ast.expr,
    cases: Map[Ast.expr, T],
    normalCaseProc: (T) => Unit,
    elseCaseProc: (T) => Unit
  ): Unit = {
    val onType = translator.detectType(on)
    switchShouldUseCompareFn(onType) match {
      case (Some(compareFn: String), compareFnCallback) =>
        switchCasesUsingCompareFn(id, on, compareFn, compareFnCallback, cases, normalCaseProc, elseCaseProc)
      case (None, _) =>
        switchCasesRender(id, on, cases, normalCaseProc, elseCaseProc)
    }
  }

  protected def switchCasesUsingCompareFn[T](
    id: Identifier,
    on: Ast.expr,
    compareFn: String,
    compareFnCallback: () => Unit,
    cases: Map[Ast.expr, T],
    normalCaseProc: (T) => Unit,
    elseCaseProc: (T) => Unit
  ): Unit = {
    switchStart(id, Ast.expr.Bool(true))

    cases.foreach { case (condition, result) =>
      condition match {
        case SwitchType.ELSE_CONST =>
        case _ =>
          compareFnCallback()
          switchCaseStartCompareFn(compareFn, on, condition)
          normalCaseProc(result)
          switchCaseEnd()
      }
    }

    cases.get(SwitchType.ELSE_CONST).foreach { (result) =>
      switchElseStart()
      elseCaseProc(result)
      switchElseEnd()
    }

    switchEnd()
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy