示例#1
0
    public override Event Read(ref Utf8JsonReader reader, Type _, JsonSerializerOptions options)
    {
        if (JsonDocument.TryParseValue(ref reader, out var doc) &&
            doc.RootElement.TryGetProperty(sTypePropertyName, out var typeProperty) &&
            doc.RootElement.TryGetProperty(sDetailTypePropertyName, out var detailTypeProperty))
        {
            var type       = typeProperty.Deserialize <EventType>(options);
            var detailType = detailTypeProperty.GetString() ?? string.Empty;

            // Try to parse EventSet.
            if (!EventSet.TryFromKey((type, detailType), out var set))
            {
                // Handle unknown `detail_type` events, but the `type` must be one of the four.
                set = type switch
                {
                    EventType.Meta => EventSet.NewMeta(detailType, typeof(EventMeta)),
                    EventType.Message => EventSet.NewMessage(detailType, typeof(EventMessage)),
                    EventType.Notice => EventSet.NewNotice(detailType, typeof(EventNotice)),
                    EventType.Request => EventSet.NewRequest(detailType, typeof(EventRequest)),
                    // `type` is unknown, not supported yet.
                    _ => throw new NotSupportedException(
                              $"{nameof(EventType)} {typeProperty.GetRawText()} is not supported by {nameof(JsonEventConverter)}.")
                };
            }

            var post = doc.Deserialize(set !.ClassType, options);

            if (post is Event ev)
            {
                return(ev);
            }
        }

        throw new JsonException();
    }