WriteRuntimeObject static method

dynamic WriteRuntimeObject(
  1. SimpleJsonWriter writer,
  2. RuntimeObject obj
)

Implementation

static WriteRuntimeObject(SimpleJsonWriter writer, RuntimeObject obj) {
  var container = asOrNull<Container>(obj);
  if (container != null) {
    WriteRuntimeContainer(writer, container);
    return;
  }

  var divert = asOrNull<Divert>(obj);
  if (divert != null) {
    var divTypeKey = "->";
    if (divert.isExternal) {
      divTypeKey = "x()";
    } else if (divert.pushesToStack) {
      if (divert.stackPushType == PushPopType.Function) {
        divTypeKey = "f()";
      } else if (divert.stackPushType == PushPopType.Tunnel) {
        divTypeKey = "->t->";
      }
    }

    var targetStr;
    if (divert.hasVariableTarget) {
      targetStr = divert.variableDivertName;
    } else {
      targetStr = divert.targetPathString;
    }

    writer.WriteObjectStart();
    writer.WriteProperty(divTypeKey, targetStr);

    if (divert.hasVariableTarget) {
      writer.WriteProperty("var", true);
    }

    if (divert.isConditional) {
      writer.WriteProperty("c", true);
    }

    if (divert.externalArgs > 0) {
      writer.WriteIntProperty("exArgs", divert.externalArgs);
    }

    writer.WriteObjectEnd();
    return;
  }

  var choicePoint = asOrNull<ChoicePoint>(obj);
  if (choicePoint != null) {
    writer.WriteObjectStart();
    writer.WriteProperty("*", choicePoint.pathStringOnChoice);
    writer.WriteIntProperty("flg", choicePoint.flags);
    writer.WriteObjectEnd();
    return;
  }

  var boolVal = asOrNull<BoolValue>(obj);
  if (boolVal != null) {
    writer.WriteBool(boolVal.value);
    return;
  }

  var intVal = asOrNull<IntValue>(obj);
  if (intVal != null) {
    writer.WriteInt(intVal.value);
    return;
  }

  var floatVal = asOrNull<FloatValue>(
    obj,
  );
  if (floatVal != null) {
    writer.WriteFloat(floatVal.value);
    return;
  }

  var strVal = asOrNull<StringValue>(obj);
  if (strVal != null) {
    if (strVal.isNewLine) {
      writer.Write("\n", escape: false);
    } else {
      writer.WriteStringStart();
      writer.WriteStringInner("^");
      writer.WriteStringInner(strVal.value);
      writer.WriteStringEnd();
    }
    return;
  }

  var listVal = asOrNull<ListValue>(obj);
  if (listVal != null) {
    WriteInkList(writer, listVal);
    return;
  }

  var divTargetVal = asOrNull<DivertTargetValue>(obj);
  if (divTargetVal != null) {
    writer.WriteObjectStart();
    if (divTargetVal.value == null) {
      return ArgumentError.notNull("divTargetVal.value");
    }
    writer.WriteProperty("^->", divTargetVal.value.componentsString);
    writer.WriteObjectEnd();

    return;
  }

  var varPtrVal = asOrNull<VariablePointerValue>(obj);
  if (varPtrVal != null) {
    writer.WriteObjectStart();
    writer.WriteProperty("^var", varPtrVal.value);
    writer.WriteIntProperty("ci", varPtrVal.contextIndex);
    writer.WriteObjectEnd();
    return;
  }

  var glue = asOrNull<Glue>(obj);
  if (glue != null) {
    writer.Write("<>");
    return;
  }

  var controlCmd = asOrNull<ControlCommand>(obj);
  if (controlCmd != null) {
    writer.Write(
        JsonSerialization.controlCommandNames[controlCmd.commandType.index]);
    return;
  }

  var nativeFunc = asOrNull<NativeFunctionCall>(obj);
  if (nativeFunc != null) {
    var name = nativeFunc.name;

    if (name == "^") name = "L^";

    writer.Write(name);
    return;
  }

  var varRef = asOrNull<VariableReference>(obj);
  if (varRef != null) {
    writer.WriteObjectStart();
    var readCountPath = varRef.pathStringForCount;
    if (readCountPath != null) {
      writer.WriteProperty("CNT?", readCountPath);
    } else {
      writer.WriteProperty("VAR?", varRef.name);
    }

    writer.WriteObjectEnd();
    return;
  }

  var varAss = asOrNull<VariableAssignment>(obj);
  if (varAss != null) {
    writer.WriteObjectStart();

    var key = varAss.isGlobal ? "VAR=" : "temp=";
    writer.WriteProperty(key, varAss.variableName);

    // Reassignment?
    if (!varAss.isNewDeclaration) writer.WriteProperty("re", true);

    writer.WriteObjectEnd();

    return;
  }

  var voidObj = asOrNull<RuntimeVoid>(obj);
  if (voidObj != null) {
    writer.Write("void");
    return;
  }

  // Legacy tag
  var tag = asOrNull<Tag>(obj);
  if (tag != null) {
    writer.WriteObjectStart();
    writer.WriteProperty("#", tag.text);
    writer.WriteObjectEnd();
    return;
  }

  var choice = asOrNull<Choice>(obj);
  if (choice != null) {
    WriteChoice(writer, choice);
    return;
  }

  throw Exception("Failed to convert runtime object to Json token: $obj");
}