// Reading discriminating union requires using JSValue. public static void ReadValue(this JSValue jsValue, out OneOf2 <T2Extra, R2D2Extra> value) { value = default; if (jsValue.TryGetObjectProperty("Kind", out JSValue kind)) { RobotModel modelType = kind.ReadValue <RobotModel>(); switch (modelType) { case RobotModel.T2: value = jsValue.ReadValue <T2Extra>(); break; case RobotModel.R2D2: value = jsValue.ReadValue <R2D2Extra>(); break; } } }
// Writing discriminating union is simpler than reading. public static void WriteValue(this IJSValueWriter writer, OneOf2 <T2Extra, R2D2Extra> value) { writer.WriteObjectBegin(); if (value.TryGet(out T2Extra t2)) { writer.WriteObjectProperty("Kind", RobotModel.T2); writer.WriteObjectProperties(t2); } else if (value.TryGet(out R2D2Extra r2d2)) { writer.WriteObjectProperty("Kind", RobotModel.R2D2); writer.WriteObjectProperties(r2d2); } writer.WriteObjectEnd(); }