tools/code/common/PolicyFragment.cs (201 lines of code) (raw):

using Azure.Core.Pipeline; using Flurl; using LanguageExt; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.Json.Serialization; using System.Threading; using System.Threading.Tasks; namespace common; public sealed record PolicyFragmentName : ResourceName, IResourceName<PolicyFragmentName> { private PolicyFragmentName(string value) : base(value) { } public static PolicyFragmentName From(string value) => new(value); } public sealed record PolicyFragmentsUri : ResourceUri { public required ManagementServiceUri ServiceUri { get; init; } private static string PathSegment { get; } = "policyFragments"; protected override Uri Value => ServiceUri.ToUri().AppendPathSegment(PathSegment).ToUri(); public static PolicyFragmentsUri From(ManagementServiceUri serviceUri) => new() { ServiceUri = serviceUri }; } public sealed record PolicyFragmentUri : ResourceUri { public required PolicyFragmentsUri Parent { get; init; } public required PolicyFragmentName Name { get; init; } protected override Uri Value => Parent.ToUri().AppendPathSegment(Name.ToString()).ToUri(); public static PolicyFragmentUri From(PolicyFragmentName name, ManagementServiceUri serviceUri) => new() { Parent = PolicyFragmentsUri.From(serviceUri), Name = name }; } public sealed record PolicyFragmentsDirectory : ResourceDirectory { public required ManagementServiceDirectory ServiceDirectory { get; init; } private static string Name { get; } = "policy fragments"; protected override DirectoryInfo Value => ServiceDirectory.ToDirectoryInfo().GetChildDirectory(Name); public static PolicyFragmentsDirectory From(ManagementServiceDirectory serviceDirectory) => new() { ServiceDirectory = serviceDirectory }; public static Option<PolicyFragmentsDirectory> TryParse(DirectoryInfo? directory, ManagementServiceDirectory serviceDirectory) => directory is not null && directory.Name == Name && directory.Parent?.FullName == serviceDirectory.ToDirectoryInfo().FullName ? new PolicyFragmentsDirectory { ServiceDirectory = serviceDirectory } : Option<PolicyFragmentsDirectory>.None; } public sealed record PolicyFragmentDirectory : ResourceDirectory { public required PolicyFragmentsDirectory Parent { get; init; } public required PolicyFragmentName Name { get; init; } protected override DirectoryInfo Value => Parent.ToDirectoryInfo().GetChildDirectory(Name.ToString()); public static PolicyFragmentDirectory From(PolicyFragmentName name, ManagementServiceDirectory serviceDirectory) => new() { Parent = PolicyFragmentsDirectory.From(serviceDirectory), Name = name }; public static Option<PolicyFragmentDirectory> TryParse(DirectoryInfo? directory, ManagementServiceDirectory serviceDirectory) => from parent in PolicyFragmentsDirectory.TryParse(directory?.Parent, serviceDirectory) select new PolicyFragmentDirectory { Parent = parent, Name = PolicyFragmentName.From(directory!.Name) }; } public sealed record PolicyFragmentInformationFile : ResourceFile { public required PolicyFragmentDirectory Parent { get; init; } private static string Name { get; } = "policyFragmentInformation.json"; protected override FileInfo Value => Parent.ToDirectoryInfo().GetChildFile(Name); public static PolicyFragmentInformationFile From(PolicyFragmentName name, ManagementServiceDirectory serviceDirectory) => new() { Parent = new PolicyFragmentDirectory { Parent = PolicyFragmentsDirectory.From(serviceDirectory), Name = name } }; public static Option<PolicyFragmentInformationFile> TryParse(FileInfo? file, ManagementServiceDirectory serviceDirectory) => file is not null && file.Name == Name ? from parent in PolicyFragmentDirectory.TryParse(file.Directory, serviceDirectory) select new PolicyFragmentInformationFile { Parent = parent } : Option<PolicyFragmentInformationFile>.None; } public sealed record PolicyFragmentPolicyFile : ResourceFile { public required PolicyFragmentDirectory Parent { get; init; } private static string Name { get; } = "policy.xml"; protected override FileInfo Value => Parent.ToDirectoryInfo().GetChildFile(Name); public static PolicyFragmentPolicyFile From(PolicyFragmentName name, ManagementServiceDirectory serviceDirectory) => new() { Parent = new PolicyFragmentDirectory { Parent = PolicyFragmentsDirectory.From(serviceDirectory), Name = name } }; public static Option<PolicyFragmentPolicyFile> TryParse(FileInfo? file, ManagementServiceDirectory serviceDirectory) => file is not null && file.Name == Name ? from parent in PolicyFragmentDirectory.TryParse(file.Directory, serviceDirectory) select new PolicyFragmentPolicyFile { Parent = parent } : Option<PolicyFragmentPolicyFile>.None; } public sealed record PolicyFragmentDto { [JsonPropertyName("properties")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] public required PolicyFragmentContract Properties { get; init; } public sealed record PolicyFragmentContract { [JsonPropertyName("description")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] public string? Description { get; init; } [JsonPropertyName("format")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] public string? Format { get; init; } [JsonPropertyName("value")] [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] public string? Value { get; init; } } } public static class PolicyFragmentModule { public static async ValueTask DeleteAll(this PolicyFragmentsUri uri, HttpPipeline pipeline, CancellationToken cancellationToken) => await uri.ListNames(pipeline, cancellationToken) .IterParallel(async name => await PolicyFragmentUri.From(name, uri.ServiceUri) .Delete(pipeline, cancellationToken), cancellationToken); public static IAsyncEnumerable<PolicyFragmentName> ListNames(this PolicyFragmentsUri uri, HttpPipeline pipeline, CancellationToken cancellationToken) => pipeline.ListJsonObjects(uri.ToUri(), cancellationToken) .Select(jsonObject => jsonObject.GetStringProperty("name")) .Select(PolicyFragmentName.From); public static IAsyncEnumerable<(PolicyFragmentName Name, PolicyFragmentDto Dto)> List(this PolicyFragmentsUri policyFragmentsUri, HttpPipeline pipeline, CancellationToken cancellationToken) => policyFragmentsUri.ListNames(pipeline, cancellationToken) .SelectAwait(async name => { var uri = new PolicyFragmentUri { Parent = policyFragmentsUri, Name = name }; var dto = await uri.GetDto(pipeline, cancellationToken); return (name, dto); }); public static async ValueTask<Option<PolicyFragmentDto>> TryGetDto(this PolicyFragmentUri uri, HttpPipeline pipeline, CancellationToken cancellationToken) { var contentUri = uri.ToUri().AppendQueryParam("format", "rawxml").ToUri(); var contentOption = await pipeline.GetContentOption(contentUri, cancellationToken); return contentOption.Map(content => content.ToObjectFromJson<PolicyFragmentDto>()); } public static async ValueTask<PolicyFragmentDto> GetDto(this PolicyFragmentUri uri, HttpPipeline pipeline, CancellationToken cancellationToken) { var contentUri = uri.ToUri().AppendQueryParam("format", "rawxml").ToUri(); var content = await pipeline.GetContent(contentUri, cancellationToken); return content.ToObjectFromJson<PolicyFragmentDto>(); } public static async ValueTask Delete(this PolicyFragmentUri uri, HttpPipeline pipeline, CancellationToken cancellationToken) => await pipeline.DeleteResource(uri.ToUri(), waitForCompletion: true, cancellationToken); public static async ValueTask PutDto(this PolicyFragmentUri uri, PolicyFragmentDto dto, HttpPipeline pipeline, CancellationToken cancellationToken) { var content = BinaryData.FromObjectAsJson(dto); await pipeline.PutContent(uri.ToUri(), content, cancellationToken); } public static IEnumerable<PolicyFragmentDirectory> ListDirectories(ManagementServiceDirectory serviceDirectory) { var policyFragmentsDirectory = PolicyFragmentsDirectory.From(serviceDirectory); return policyFragmentsDirectory.ToDirectoryInfo() .ListDirectories("*") .Select(directoryInfo => PolicyFragmentName.From(directoryInfo.Name)) .Select(name => new PolicyFragmentDirectory { Parent = policyFragmentsDirectory, Name = name }); } public static IEnumerable<PolicyFragmentInformationFile> ListInformationFiles(ManagementServiceDirectory serviceDirectory) => ListDirectories(serviceDirectory) .Select(directory => new PolicyFragmentInformationFile { Parent = directory }) .Where(informationFile => informationFile.ToFileInfo().Exists()); public static IEnumerable<PolicyFragmentPolicyFile> ListPolicyFiles(ManagementServiceDirectory serviceDirectory) => ListDirectories(serviceDirectory) .Select(directory => new PolicyFragmentPolicyFile { Parent = directory }) .Where(informationFile => informationFile.ToFileInfo().Exists()); public static async ValueTask WriteDto(this PolicyFragmentInformationFile file, PolicyFragmentDto dto, CancellationToken cancellationToken) { var content = BinaryData.FromObjectAsJson(dto, JsonObjectExtensions.SerializerOptions); await file.ToFileInfo().OverwriteWithBinaryData(content, cancellationToken); } public static async ValueTask<PolicyFragmentDto> ReadDto(this PolicyFragmentInformationFile file, CancellationToken cancellationToken) { var content = await file.ToFileInfo().ReadAsBinaryData(cancellationToken); return content.ToObjectFromJson<PolicyFragmentDto>(); } public static async ValueTask WritePolicy(this PolicyFragmentPolicyFile file, string policy, CancellationToken cancellationToken) { var content = BinaryData.FromString(policy); await file.ToFileInfo().OverwriteWithBinaryData(content, cancellationToken); } }