using System; using System.Text.Json; using System.Text.Json.Serialization; namespace Questionable.Model.Questing.Converter; public sealed class QuestWorkConfigConverter : JsonConverter { public override QuestWorkValue Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType == JsonTokenType.Number) { return new QuestWorkValue(reader.GetByte()); } if (reader.TokenType != JsonTokenType.StartObject) { throw new JsonException(); } byte? high = null; byte? low = null; EQuestWorkMode mode = EQuestWorkMode.Bitwise; while (reader.Read()) { switch (reader.TokenType) { case JsonTokenType.PropertyName: { string text = reader.GetString(); if (text == null || !reader.Read()) { throw new JsonException(); } switch (text) { case "High": high = reader.GetByte(); break; case "Low": low = reader.GetByte(); break; case "Mode": mode = new QuestWorkModeConverter().Read(ref reader, typeof(EQuestWorkMode), options); break; default: throw new JsonException(); } break; } case JsonTokenType.EndObject: return new QuestWorkValue(high, low, mode); default: throw new JsonException(); } } throw new JsonException(); } public override void Write(Utf8JsonWriter writer, QuestWorkValue value, JsonSerializerOptions options) { if (value != null && value.High.HasValue && value.Low.HasValue && value.Mode == EQuestWorkMode.Bitwise) { byte value2 = (byte)((value.High.Value << 4) + value.Low.Value); writer.WriteNumberValue(value2); return; } writer.WriteStartObject(); if (value.High.HasValue) { writer.WriteNumber("High", value.High.Value); } if (value.Low.HasValue) { writer.WriteNumber("Low", value.Low.Value); } if (value.Mode != EQuestWorkMode.Bitwise) { writer.WritePropertyName("Mode"); new QuestWorkModeConverter().Write(writer, value.Mode, options); } writer.WriteEndObject(); } }