tools/code/common/ApiOperation.cs (93 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.Threading; namespace common; public sealed record ApiOperationName : ResourceName { private ApiOperationName(string value) : base(value) { } public static ApiOperationName From(string value) => new(value); } public sealed record ApiOperationsUri : ResourceUri { public required ApiUri Parent { get; init; } private static string PathSegment { get; } = "operations"; protected override Uri Value => Parent.ToUri().AppendPathSegment(PathSegment).ToUri(); public static ApiOperationsUri From(ApiName apiName, ManagementServiceUri serviceUri) => new() { Parent = ApiUri.From(apiName, serviceUri) }; } public sealed record ApiOperationUri : ResourceUri { public required ApiOperationsUri Parent { get; init; } public required ApiOperationName Name { get; init; } protected override Uri Value => Parent.ToUri().AppendPathSegment(Name.ToString()).ToUri(); public static ApiOperationUri From(ApiOperationName name, ApiName apiName, ManagementServiceUri serviceUri) => new() { Parent = ApiOperationsUri.From(apiName, serviceUri), Name = name }; } public sealed record ApiOperationsDirectory : ResourceDirectory { public required ApiDirectory Parent { get; init; } private static string Name { get; } = "operations"; protected override DirectoryInfo Value => Parent.ToDirectoryInfo().GetChildDirectory(Name); public static ApiOperationsDirectory From(ApiName name, ManagementServiceDirectory serviceDirectory) => new() { Parent = ApiDirectory.From(name, serviceDirectory) }; public static Option<ApiOperationsDirectory> TryParse(DirectoryInfo? directory, ManagementServiceDirectory serviceDirectory) => directory is not null && directory.Name == Name ? from parent in ApiDirectory.TryParse(directory.Parent, serviceDirectory) select new ApiOperationsDirectory { Parent = parent } : Option<ApiOperationsDirectory>.None; } public sealed record ApiOperationDirectory : ResourceDirectory { public required ApiOperationsDirectory Parent { get; init; } public required ApiOperationName Name { get; init; } protected override DirectoryInfo Value => Parent.ToDirectoryInfo().GetChildDirectory(Name.ToString()); public static ApiOperationDirectory From(ApiOperationName name, ApiName apiName, ManagementServiceDirectory serviceDirectory) => new() { Parent = ApiOperationsDirectory.From(apiName, serviceDirectory), Name = name }; public static Option<ApiOperationDirectory> TryParse(DirectoryInfo? directory, ManagementServiceDirectory serviceDirectory) => from name in TryParseApiOperationName(directory) from parent in ApiOperationsDirectory.TryParse(directory?.Parent, serviceDirectory) select new ApiOperationDirectory { Parent = parent, Name = name }; internal static Option<ApiOperationName> TryParseApiOperationName(DirectoryInfo? directory) => string.IsNullOrWhiteSpace(directory?.Name) ? Option<ApiOperationName>.None : ApiOperationName.From(directory.Name); } public static class ApiOperationModule { public static IAsyncEnumerable<ApiOperationName> ListNames(this ApiOperationsUri uri, HttpPipeline pipeline, CancellationToken cancellationToken) => pipeline.ListJsonObjects(uri.ToUri(), cancellationToken) .Select(jsonObject => jsonObject.GetStringProperty("name")) .Select(ApiOperationName.From); public static IEnumerable<ApiOperationDirectory> ListDirectories(ApiName apiName, ManagementServiceDirectory serviceDirectory) { var parentDirectory = ApiOperationsDirectory.From(apiName, serviceDirectory); return parentDirectory.ToDirectoryInfo() .ListDirectories("*") .Choose(ApiOperationDirectory.TryParseApiOperationName) .Select(apiOperationName => new ApiOperationDirectory { Name = apiOperationName, Parent = parentDirectory }); } }