exhaustiveSwitch function

String exhaustiveSwitch({
  1. required SumTypeSpec spec,
  2. required bool implement,
})

Implementation

String exhaustiveSwitch({
  required SumTypeSpec spec,
  required bool implement,
}) =>
    function(
      type: "\$T",
      name: "iswitch",
      typeParams: [const TypeParamSpec(name: "\$T")],
      namedParams: [
        for (final caseSpec in spec.cases)
          param(
            type: [
              "required \$T Function(",
              if (caseSpec.type.requiresPayload) caseSpec.type.name,
              ")",
            ].join(),
            name: caseSpec.name,
          ),
      ],
      body: implement
          ? [
              for (final caseSpec in spec.cases) ...[
                "if (this.${caseSpec.name} != null) {",
                "return ${caseSpec.name}(",
                if (caseSpec.type.requiresPayload) "this.${caseSpec.name}!",
                "); } else"
              ],
              "{ throw StateError(\"an instance of \$${spec.sumTypeName} has no case selected\"); }",
            ]
          : null,
    );