csharp/Microsoft.Azure.Databricks.Client/Converters/AclPermissionItemConverter.cs (80 lines of code) (raw):

// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using Microsoft.Azure.Databricks.Client.Models; using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; using System.Text.Json.Nodes; using System.Text.Json.Serialization; namespace Microsoft.Azure.Databricks.Client.Converters; public class AclPermissionItemConverter : JsonConverter<AclPermissionItem> { public override bool CanConvert(Type typeToConvert) { return typeof(AclPermissionItem).IsAssignableFrom(typeToConvert); } private static readonly JsonSerializerOptions EnumOptions = new() { Converters = { new JsonStringEnumConverter() } }; public override bool HandleNull => true; public override AclPermissionItem Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var aclItemNode = JsonNode.Parse(ref reader)!.AsObject(); AclPermissionItem aclItem; if (aclItemNode.TryGetPropertyValue("user_name", out var userName)) { aclItem = new UserAclItem { Principal = userName!.GetValue<string>() }; } else if (aclItemNode.TryGetPropertyValue("group_name", out var groupName)) { aclItem = new GroupAclItem { Principal = groupName!.GetValue<string>() }; } else if (aclItemNode.TryGetPropertyValue("service_principal_name", out var servicePrincipalName)) { aclItem = new ServicePrincipalAclItem { Principal = servicePrincipalName!.GetValue<string>() }; } else { throw new NotImplementedException( $"JsonConverter not implemented for node {aclItemNode.ToJsonString()}"); } if (aclItemNode.ContainsKey("all_permissions")) { var permissionNode = aclItemNode["all_permissions"]![0]!.AsObject(); aclItem.PermissionLevel = permissionNode["permission_level"]!.Deserialize<PermissionLevel>(options); aclItem.Inherited = permissionNode.TryGetPropertyValue("inherited", out var inherited) && inherited!.GetValue<bool>(); aclItem.InheritedFromObject = permissionNode.TryGetPropertyValue("inherited_from_object", out var inheritedFrom) ? inheritedFrom!.Deserialize<IEnumerable<string>>(options) : Enumerable.Empty<string>(); } else { aclItem.PermissionLevel = aclItemNode["permission_level"]!.Deserialize<PermissionLevel>(options); } return aclItem; } public override void Write(Utf8JsonWriter writer, AclPermissionItem value, JsonSerializerOptions options) { var node = value switch { UserAclItem user => JsonSerializer.SerializeToNode(user, EnumOptions), GroupAclItem group => JsonSerializer.SerializeToNode(group, EnumOptions), ServicePrincipalAclItem sp => JsonSerializer.SerializeToNode(sp, EnumOptions), _ => throw new NotImplementedException($"JsonConverter not implemented for type {value.GetType()}") }; node!.WriteTo(writer); } }