WriteRuntimeObject static method
dynamic
WriteRuntimeObject(
- SimpleJsonWriter writer,
- 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");
}