// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. using System; using Regorus.Internal; #nullable enable namespace Regorus { /// /// Manages Azure Policy alias definitions used for resource normalization /// and policy compilation. /// public unsafe sealed class AliasRegistry : SafeHandleWrapper { /// /// Create an empty alias registry. /// public AliasRegistry() : base(RegorusAliasRegistryHandle.Create(), nameof(AliasRegistry)) { } /// /// Load control-plane alias data (array of ProviderAliases) from a JSON string. /// /// JSON array of ProviderAliases (e.g. from Get-AzPolicyAlias or ResourceTypesAndAliases.json) public void LoadJson(string json) { Utf8Marshaller.WithUtf8(json, jsonPtr => { UseHandle(regPtr => { CheckAndDropResult(API.regorus_alias_registry_load_json( (RegorusAliasRegistry*)regPtr, (byte*)jsonPtr)); return 0; }); }); } /// /// Load a data-plane policy manifest from a JSON string. /// /// JSON object containing a DataPolicyManifest public void LoadManifest(string json) { Utf8Marshaller.WithUtf8(json, jsonPtr => { UseHandle(regPtr => { CheckAndDropResult(API.regorus_alias_registry_load_manifest( (RegorusAliasRegistry*)regPtr, (byte*)jsonPtr)); return 0; }); }); } /// /// Gets the number of resource types loaded in the registry. /// public long Length { get { return UseHandle(regPtr => { return ResultHelpers.GetIntResult( API.regorus_alias_registry_len((RegorusAliasRegistry*)regPtr)); }); } } /// /// Normalize an ARM resource JSON and wrap it into the standard input envelope /// expected by a compiled Azure Policy program. /// /// Raw ARM resource JSON /// API version string (e.g. "2023-01-01"), or null to use default alias paths /// Additional context JSON object (pass "{}" if none) /// Policy parameter values JSON (pass "{}" if none) /// JSON string: { "resource": <normalized>, "context": <context>, "parameters": <params> } public string? NormalizeAndWrap(string resourceJson, string? apiVersion = null, string contextJson = "{}", string parametersJson = "{}") { return Utf8Marshaller.WithUtf8(resourceJson, resPtr => Utf8Marshaller.WithUtf8(contextJson, ctxPtr => Utf8Marshaller.WithUtf8(parametersJson, paramsPtr => { if (apiVersion is null) { return UseHandle(regPtr => { return ResultHelpers.GetStringResult( API.regorus_alias_registry_normalize_and_wrap( (RegorusAliasRegistry*)regPtr, (byte*)resPtr, null, (byte*)ctxPtr, (byte*)paramsPtr)); }); } else { return Utf8Marshaller.WithUtf8(apiVersion, apiPtr => UseHandle(regPtr => { return ResultHelpers.GetStringResult( API.regorus_alias_registry_normalize_and_wrap( (RegorusAliasRegistry*)regPtr, (byte*)resPtr, (byte*)apiPtr, (byte*)ctxPtr, (byte*)paramsPtr)); })); } }))); } /// /// Denormalize a previously-normalized resource JSON back to ARM format. /// /// The normalized resource JSON /// API version string, or null to use default alias paths /// Denormalized ARM JSON string public string? Denormalize(string normalizedJson, string? apiVersion = null) { return Utf8Marshaller.WithUtf8(normalizedJson, normPtr => { if (apiVersion is null) { return UseHandle(regPtr => { return ResultHelpers.GetStringResult( API.regorus_alias_registry_denormalize( (RegorusAliasRegistry*)regPtr, (byte*)normPtr, null)); }); } else { return Utf8Marshaller.WithUtf8(apiVersion, apiPtr => UseHandle(regPtr => { return ResultHelpers.GetStringResult( API.regorus_alias_registry_denormalize( (RegorusAliasRegistry*)regPtr, (byte*)normPtr, (byte*)apiPtr)); })); } }); } private static string? CheckAndDropResult(RegorusResult result) { return ResultHelpers.GetStringResult(result); } } }