tools/code/common/WorkspacePolicyFragment.cs (169 lines of code) (raw):
using Azure.Core.Pipeline;
using Flurl;
using LanguageExt;
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Text.Json.Serialization;
using System.Threading;
using System.Threading.Tasks;
namespace common;
public sealed record WorkspacePolicyFragmentsUri : ResourceUri
{
public required WorkspaceUri Parent { get; init; }
private static string PathSegment { get; } = "policyFragments";
protected override Uri Value => Parent.ToUri().AppendPathSegment(PathSegment).ToUri();
public static WorkspacePolicyFragmentsUri From(WorkspaceName name, ManagementServiceUri serviceUri) =>
new() { Parent = WorkspaceUri.From(name, serviceUri) };
}
public sealed record WorkspacePolicyFragmentUri : ResourceUri
{
public required WorkspacePolicyFragmentsUri Parent { get; init; }
public required PolicyFragmentName Name { get; init; }
protected override Uri Value => Parent.ToUri().AppendPathSegment(Name.ToString()).ToUri();
public static WorkspacePolicyFragmentUri From(PolicyFragmentName name, WorkspaceName workspaceName, ManagementServiceUri serviceUri) =>
new()
{
Parent = WorkspacePolicyFragmentsUri.From(workspaceName, serviceUri),
Name = name
};
}
public sealed record WorkspacePolicyFragmentsDirectory : ResourceDirectory
{
public required WorkspaceDirectory Parent { get; init; }
private static string Name { get; } = "policy fragments";
protected override DirectoryInfo Value =>
Parent.ToDirectoryInfo().GetChildDirectory(Name);
public static WorkspacePolicyFragmentsDirectory From(WorkspaceName name, ManagementServiceDirectory serviceDirectory) =>
new() { Parent = WorkspaceDirectory.From(name, serviceDirectory) };
public static Option<WorkspacePolicyFragmentsDirectory> TryParse(DirectoryInfo? directory, ManagementServiceDirectory serviceDirectory) =>
IsDirectoryNameValid(directory)
? from parent in WorkspaceDirectory.TryParse(directory.Parent, serviceDirectory)
select new WorkspacePolicyFragmentsDirectory { Parent = parent }
: Option<WorkspacePolicyFragmentsDirectory>.None;
internal static bool IsDirectoryNameValid([NotNullWhen(true)] DirectoryInfo? directory) =>
directory?.Name == Name;
}
public sealed record WorkspacePolicyFragmentDirectory : ResourceDirectory
{
public required WorkspacePolicyFragmentsDirectory Parent { get; init; }
public required PolicyFragmentName Name { get; init; }
protected override DirectoryInfo Value =>
Parent.ToDirectoryInfo().GetChildDirectory(Name.ToString());
public static WorkspacePolicyFragmentDirectory From(PolicyFragmentName name, WorkspaceName workspaceName, ManagementServiceDirectory serviceDirectory) =>
new()
{
Parent = WorkspacePolicyFragmentsDirectory.From(workspaceName, serviceDirectory),
Name = name
};
public static Option<WorkspacePolicyFragmentDirectory> TryParse(DirectoryInfo? directory, ManagementServiceDirectory serviceDirectory) =>
from parent in WorkspacePolicyFragmentsDirectory.TryParse(directory?.Parent, serviceDirectory)
select new WorkspacePolicyFragmentDirectory
{
Parent = parent,
Name = PolicyFragmentName.From(directory!.Name)
};
}
public sealed record WorkspacePolicyFragmentInformationFile : ResourceFile
{
public required WorkspacePolicyFragmentDirectory Parent { get; init; }
private static string Name { get; } = "policyFragmentInformation.json";
protected override FileInfo Value =>
Parent.ToDirectoryInfo().GetChildFile(Name);
public static WorkspacePolicyFragmentInformationFile From(PolicyFragmentName name, WorkspaceName workspaceName, ManagementServiceDirectory serviceDirectory) =>
new()
{
Parent = WorkspacePolicyFragmentDirectory.From(name, workspaceName, serviceDirectory)
};
public static Option<WorkspacePolicyFragmentInformationFile> TryParse(FileInfo? file, ManagementServiceDirectory serviceDirectory) =>
IsFileNameValid(file)
? from parent in WorkspacePolicyFragmentDirectory.TryParse(file.Directory, serviceDirectory)
select new WorkspacePolicyFragmentInformationFile { Parent = parent }
: Option<WorkspacePolicyFragmentInformationFile>.None;
internal static bool IsFileNameValid([NotNullWhen(true)] FileInfo? file) =>
file?.Name == Name;
}
public sealed record WorkspacePolicyFragmentPolicyFile : ResourceFile
{
public required WorkspacePolicyFragmentDirectory Parent { get; init; }
private static string Name { get; } = "policy.xml";
protected override FileInfo Value =>
Parent.ToDirectoryInfo().GetChildFile(Name);
public static WorkspacePolicyFragmentPolicyFile From(PolicyFragmentName name, WorkspaceName workspaceName, ManagementServiceDirectory serviceDirectory) =>
new()
{
Parent = new WorkspacePolicyFragmentDirectory
{
Parent = WorkspacePolicyFragmentsDirectory.From(workspaceName, serviceDirectory),
Name = name
}
};
public static Option<WorkspacePolicyFragmentPolicyFile> TryParse(FileInfo? file, ManagementServiceDirectory serviceDirectory) =>
file is not null && file.Name == Name
? from parent in WorkspacePolicyFragmentDirectory.TryParse(file.Directory, serviceDirectory)
select new WorkspacePolicyFragmentPolicyFile { Parent = parent }
: Option<WorkspacePolicyFragmentPolicyFile>.None;
}
public sealed record WorkspacePolicyFragmentDto
{
[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 WorkspacePolicyFragmentModule
{
public static IAsyncEnumerable<PolicyFragmentName> ListNames(this WorkspacePolicyFragmentsUri uri, HttpPipeline pipeline, CancellationToken cancellationToken) =>
pipeline.ListJsonObjects(uri.ToUri(), cancellationToken)
.Select(jsonObject => jsonObject.GetStringProperty("name"))
.Select(PolicyFragmentName.From);
public static IAsyncEnumerable<(PolicyFragmentName Name, WorkspacePolicyFragmentDto Dto)> List(this WorkspacePolicyFragmentsUri workspacePolicyFragmentsUri, HttpPipeline pipeline, CancellationToken cancellationToken) =>
workspacePolicyFragmentsUri.ListNames(pipeline, cancellationToken)
.SelectAwait(async name =>
{
var uri = new WorkspacePolicyFragmentUri { Parent = workspacePolicyFragmentsUri, Name = name };
var dto = await uri.GetDto(pipeline, cancellationToken);
return (name, dto);
});
public static async ValueTask<WorkspacePolicyFragmentDto> GetDto(this WorkspacePolicyFragmentUri uri, HttpPipeline pipeline, CancellationToken cancellationToken)
{
var contentUri = uri.ToUri().AppendQueryParam("format", "rawxml").ToUri();
var content = await pipeline.GetContent(contentUri, cancellationToken);
return content.ToObjectFromJson<WorkspacePolicyFragmentDto>();
}
public static async ValueTask Delete(this WorkspacePolicyFragmentUri uri, HttpPipeline pipeline, CancellationToken cancellationToken) =>
await pipeline.DeleteResource(uri.ToUri(), waitForCompletion: true, cancellationToken);
public static async ValueTask PutDto(this WorkspacePolicyFragmentUri uri, WorkspacePolicyFragmentDto dto, HttpPipeline pipeline, CancellationToken cancellationToken)
{
var content = BinaryData.FromObjectAsJson(dto);
await pipeline.PutContent(uri.ToUri(), content, cancellationToken);
}
public static async ValueTask WriteDto(this WorkspacePolicyFragmentInformationFile file, WorkspacePolicyFragmentDto dto, CancellationToken cancellationToken)
{
var content = BinaryData.FromObjectAsJson(dto, JsonObjectExtensions.SerializerOptions);
await file.ToFileInfo().OverwriteWithBinaryData(content, cancellationToken);
}
public static async ValueTask<WorkspacePolicyFragmentDto> ReadDto(this WorkspacePolicyFragmentInformationFile file, CancellationToken cancellationToken)
{
var content = await file.ToFileInfo().ReadAsBinaryData(cancellationToken);
return content.ToObjectFromJson<WorkspacePolicyFragmentDto>();
}
public static async ValueTask WritePolicy(this WorkspacePolicyFragmentPolicyFile file, string policy, CancellationToken cancellationToken)
{
var content = BinaryData.FromString(policy);
await file.ToFileInfo().OverwriteWithBinaryData(content, cancellationToken);
}
}