using Salmon.Core; using System.Diagnostics; using System.Text.Json; using System.Text.Json.Serialization; namespace Salmon.Web; public class TripletJsonConverter : JsonConverter { public override Triplet? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { Debug.Assert(reader.TokenType == JsonTokenType.StartObject); Triplet ret = new (); while (reader.Read()) { if (reader.TokenType == JsonTokenType.EndObject) break; Debug.Assert(reader.TokenType == JsonTokenType.PropertyName); string jsonkey = reader.GetString(); Debug.Assert(reader.Read()); Debug.Assert(reader.TokenType != JsonTokenType.EndObject); Debug.Assert(reader.TokenType != JsonTokenType.EndArray); Debug.Assert(reader.TokenType != JsonTokenType.PropertyName); if(jsonkey.ToLower() == nameof(Triplet.key).ToLower()) { Debug.Assert(reader.TokenType == JsonTokenType.String); ret.key = reader.GetString(); } else if (jsonkey.ToLower() == nameof(Triplet.predicate).ToLower()) { Debug.Assert(reader.TokenType == JsonTokenType.String); ret.predicate = reader.GetString(); } else if(jsonkey.ToLower() == nameof(Triplet.LastFlush).ToLower()) { Debug.Assert(reader.TokenType == JsonTokenType.String); ret.LastFlush = reader.GetDateTime(); } else if (jsonkey.ToLower() == nameof(Triplet.value).ToLower()) { if (reader.TokenType == JsonTokenType.Null) ret.value = null; else if (reader.TokenType == JsonTokenType.False) ret.value = false; else if (reader.TokenType == JsonTokenType.True) ret.value = true; else if (reader.TokenType == JsonTokenType.String) ret.value = reader.GetString(); else if (reader.TokenType == JsonTokenType.Number) ret.value = reader.GetDouble(); else throw new NotImplementedException($"Cannot read Triple.value from token type {reader.TokenType} at {reader.TokenStartIndex} for {reader.GetString()}."); } else Console.WriteLine($"Unknown triplet field {jsonkey} with token type {reader.TokenType}."); } return ret; } public override void Write(Utf8JsonWriter writer, Triplet value, JsonSerializerOptions options) { writer.WriteStartObject(); writer.WriteString(nameof(Triplet.key), value.key); writer.WriteString(nameof(Triplet.predicate), value.predicate); writer.WritePropertyName(nameof(Triplet.LastFlush)); writer.WriteStringValue(value.LastFlush); writer.WritePropertyName(nameof(Triplet.value)); object? tval = value.value; if (tval is null) writer.WriteNullValue(); else if (tval is bool) writer.WriteBooleanValue((bool)tval); else if (tval is string) writer.WriteStringValue((string)tval); else if (tval is int) writer.WriteNumberValue((int)tval); else if (tval is long) writer.WriteNumberValue((long)tval); else if (tval is uint) writer.WriteNumberValue((uint)tval); else if (tval is ulong) writer.WriteNumberValue((ulong)tval); else if (tval is float) writer.WriteNumberValue((float)tval); else if (tval is double) writer.WriteNumberValue((double)tval); else if (tval is DateTime) writer.WriteStringValue((DateTime)tval); else throw new NotImplementedException($"Cannot serialize type {tval.GetType()}."); writer.WriteEndObject(); } }