File: WebEventData\ChangeEventArgsReader.cs
Web Access
Project: src\src\Components\Web\src\Microsoft.AspNetCore.Components.Web.csproj (Microsoft.AspNetCore.Components.Web)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#nullable enable
 
using System.Text.Json;
 
namespace Microsoft.AspNetCore.Components.Web;
 
internal static class ChangeEventArgsReader
{
    private static readonly JsonEncodedText ValueKey = JsonEncodedText.Encode("value");
 
    internal static ChangeEventArgs Read(JsonElement jsonElement)
    {
        var changeArgs = new ChangeEventArgs();
        foreach (var property in jsonElement.EnumerateObject())
        {
            if (property.NameEquals(ValueKey.EncodedUtf8Bytes))
            {
                var value = property.Value;
                switch (value.ValueKind)
                {
                    case JsonValueKind.Null:
                        break;
                    case JsonValueKind.String:
                        changeArgs.Value = value.GetString();
                        break;
                    case JsonValueKind.True:
                    case JsonValueKind.False:
                        changeArgs.Value = value.GetBoolean();
                        break;
                    case JsonValueKind.Array:
                        changeArgs.Value = GetJsonElementStringArrayValue(value);
                        break;
                    default:
                        throw new ArgumentException($"Unsupported {nameof(ChangeEventArgs)} value {jsonElement}.");
                }
                return changeArgs;
            }
            else
            {
                throw new JsonException($"Unknown property {property.Name}");
            }
        }
 
        return changeArgs;
    }
 
    private static string?[] GetJsonElementStringArrayValue(JsonElement jsonElement)
    {
        var result = new string?[jsonElement.GetArrayLength()];
        var elementIndex = 0;
 
        foreach (var arrayElement in jsonElement.EnumerateArray())
        {
            if (arrayElement.ValueKind != JsonValueKind.String)
            {
                throw new InvalidOperationException(
                    $"Unsupported {nameof(JsonElement)} value kind '{arrayElement.ValueKind}' " +
                    $"(expected '{JsonValueKind.String}').");
            }
 
            result[elementIndex] = arrayElement.GetString();
            elementIndex++;
        }
 
        return result;
    }
}