// 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());
}
}
}