File: WebEventData\DragEventArgsReader.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 DragEventArgsReader
{
    private static readonly JsonEncodedText DataTransfer = JsonEncodedText.Encode("dataTransfer");
    private static readonly JsonEncodedText DropEffect = JsonEncodedText.Encode("dropEffect");
    private static readonly JsonEncodedText EffectAllowed = JsonEncodedText.Encode("effectAllowed");
    private static readonly JsonEncodedText Files = JsonEncodedText.Encode("files");
    private static readonly JsonEncodedText Items = JsonEncodedText.Encode("items");
    private static readonly JsonEncodedText Types = JsonEncodedText.Encode("types");
    private static readonly JsonEncodedText Kind = JsonEncodedText.Encode("kind");
    private static readonly JsonEncodedText Type = JsonEncodedText.Encode("type");
 
    internal static DragEventArgs Read(JsonElement jsonElement)
    {
        var eventArgs = new DragEventArgs();
        foreach (var property in jsonElement.EnumerateObject())
        {
            if (property.NameEquals(DataTransfer.EncodedUtf8Bytes))
            {
                eventArgs.DataTransfer = ReadDataTransfer(property.Value);
            }
            else
            {
                MouseEventArgsReader.ReadProperty(eventArgs, property);
            }
        }
 
        return eventArgs;
    }
 
    private static DataTransfer ReadDataTransfer(JsonElement jsonElement)
    {
        var dataTransfer = new DataTransfer();
        foreach (var property in jsonElement.EnumerateObject())
        {
            if (property.NameEquals(DropEffect.EncodedUtf8Bytes))
            {
                dataTransfer.DropEffect = property.Value.GetString()!;
            }
            else if (property.NameEquals(EffectAllowed.EncodedUtf8Bytes))
            {
                dataTransfer.EffectAllowed = property.Value.GetString();
            }
            else if (property.NameEquals(Files.EncodedUtf8Bytes))
            {
                dataTransfer.Files = ReadStringArray(property.Value);
            }
            else if (property.NameEquals(Items.EncodedUtf8Bytes))
            {
                var value = property.Value;
                var items = new DataTransferItem[value.GetArrayLength()];
                var i = 0;
                foreach (var item in value.EnumerateArray())
                {
                    items[i++] = ReadDataTransferItem(item);
                }
                dataTransfer.Items = items;
            }
            else if (property.NameEquals(Types.EncodedUtf8Bytes))
            {
                dataTransfer.Types = ReadStringArray(property.Value);
            }
            else
            {
                throw new JsonException($"Unknown property {property.Name}");
            }
        }
 
        return dataTransfer;
    }
 
    private static DataTransferItem ReadDataTransferItem(JsonElement jsonElement)
    {
        var item = new DataTransferItem();
        foreach (var property in jsonElement.EnumerateObject())
        {
            if (property.NameEquals(Kind.EncodedUtf8Bytes))
            {
                item.Kind = property.Value.GetString()!;
            }
            else if (property.NameEquals(Type.EncodedUtf8Bytes))
            {
                item.Type = property.Value.GetString()!;
            }
            else
            {
                throw new JsonException($"Unknown property {property.Name}");
            }
        }
 
        return item;
    }
 
    private static string[] ReadStringArray(JsonElement value)
    {
        var values = new string[value.GetArrayLength()];
        var i = 0;
        foreach (var item in value.EnumerateArray())
        {
            values[i++] = item.GetString()!;
        }
 
        return values;
    }
}