// Copyright (c) Microsoft Corporation. // Licensed under the MIT License. using System; using System.Collections.Generic; using System.Text.Json; using Regorus.Internal; #nullable enable namespace Regorus { /// /// Provides static methods for managing the global resource schema registry. /// Resource schemas define the structure and validation rules for Azure Policy resources. /// public static unsafe class SchemaRegistry { /// /// Register a resource schema from JSON with a given name. /// /// Name to register the schema under /// JSON string representing the schema /// Thrown when schema registration fails public static void RegisterResource(string name, string schemaJson) { Utf8Marshaller.WithUtf8(name, namePtr => { Utf8Marshaller.WithUtf8(schemaJson, schemaPtr => { unsafe { ResultHelpers.GetStringResult(Internal.API.regorus_resource_schema_register((byte*)namePtr, (byte*)schemaPtr)); } }); }); } /// /// Check if a resource schema with the given name exists. /// /// Name of the schema to check /// True if the schema exists, false otherwise /// Thrown when the operation fails public static bool ContainsResource(string name) { return Utf8Marshaller.WithUtf8(name, namePtr => { unsafe { var result = Internal.API.regorus_resource_schema_contains((byte*)namePtr); return ResultHelpers.GetBoolResult(result); } }); } /// /// Get the number of registered resource schemas. /// /// The number of registered resource schemas /// Thrown when the operation fails public static long ResourceCount { get { var result = Internal.API.regorus_resource_schema_len(); return ResultHelpers.GetIntResult(result); } } /// /// Check if the resource schema registry is empty. /// /// True if the registry is empty, false otherwise /// Thrown when the operation fails public static bool IsResourceRegistryEmpty { get { var result = Internal.API.regorus_resource_schema_is_empty(); return ResultHelpers.GetBoolResult(result); } } /// /// List all registered resource schema names. /// /// JSON array of schema names /// Thrown when the operation fails public static string ListResourceNames() { return ResultHelpers.GetStringResult(Internal.API.regorus_resource_schema_list_names()) ?? "[]"; } /// /// List all registered resource schema names as managed strings. /// public static IReadOnlyList GetResourceNames() { var json = ListResourceNames(); return JsonSerializer.Deserialize(json) ?? Array.Empty(); } /// /// Remove a resource schema by name. /// /// Name of the schema to remove /// True if the schema was removed, false if it wasn't found /// Thrown when the operation fails public static bool RemoveResource(string name) { return Utf8Marshaller.WithUtf8(name, namePtr => { unsafe { var result = Internal.API.regorus_resource_schema_remove((byte*)namePtr); return ResultHelpers.GetBoolResult(result); } }); } /// /// Clear all resource schemas from the registry. /// /// Thrown when the operation fails public static void ClearResources() { ResultHelpers.GetStringResult(Internal.API.regorus_resource_schema_clear()); } /// /// Register an effect schema from JSON with a given name. /// /// Name to register the schema under /// JSON string representing the schema /// Thrown when schema registration fails public static void RegisterEffect(string name, string schemaJson) { Utf8Marshaller.WithUtf8(name, namePtr => { Utf8Marshaller.WithUtf8(schemaJson, schemaPtr => { unsafe { ResultHelpers.GetStringResult(Internal.API.regorus_effect_schema_register((byte*)namePtr, (byte*)schemaPtr)); } }); }); } /// /// Check if an effect schema with the given name exists. /// /// Name of the schema to check /// True if the schema exists, false otherwise /// Thrown when the operation fails public static bool ContainsEffect(string name) { return Utf8Marshaller.WithUtf8(name, namePtr => { unsafe { var result = Internal.API.regorus_effect_schema_contains((byte*)namePtr); return ResultHelpers.GetBoolResult(result); } }); } /// /// Get the number of registered effect schemas. /// /// The number of registered effect schemas /// Thrown when the operation fails public static long EffectCount { get { var result = Internal.API.regorus_effect_schema_len(); return ResultHelpers.GetIntResult(result); } } /// /// Check if the effect schema registry is empty. /// /// True if the registry is empty, false otherwise /// Thrown when the operation fails public static bool IsEffectRegistryEmpty { get { var result = Internal.API.regorus_effect_schema_is_empty(); return ResultHelpers.GetBoolResult(result); } } /// /// List all registered effect schema names. /// /// JSON array of schema names /// Thrown when the operation fails public static string ListEffectNames() { return ResultHelpers.GetStringResult(Internal.API.regorus_effect_schema_list_names()) ?? "[]"; } /// /// List all registered effect schema names as managed strings. /// public static IReadOnlyList GetEffectNames() { var json = ListEffectNames(); return JsonSerializer.Deserialize(json) ?? Array.Empty(); } /// /// Remove an effect schema by name. /// /// Name of the schema to remove /// True if the schema was removed, false if it wasn't found /// Thrown when the operation fails public static bool RemoveEffect(string name) { return Utf8Marshaller.WithUtf8(name, namePtr => { unsafe { var result = Internal.API.regorus_effect_schema_remove((byte*)namePtr); return ResultHelpers.GetBoolResult(result); } }); } /// /// Clear all effect schemas from the registry. /// /// Thrown when the operation fails public static void ClearEffects() { ResultHelpers.GetStringResult(Internal.API.regorus_effect_schema_clear()); } } }