qamp/Qrakhen.Qamp.Core/Assert.cs

55 lines
1.7 KiB
C#

using Qrakhen.Qamp.Core.Values;
using System.Runtime.CompilerServices;
using V = Qrakhen.Qamp.Core.Values.ValueType;
namespace Qrakhen.Qamp.Core;
public static class Assert
{
public static void IsPrimitive(params Value[] values)
{
AssertAndThrow(() => values.All(value => value.Is(V.Primitive, false)), values);
}
public static void NotZero(params Value[] values)
{
AssertAndThrow(() => values.All(value => value.Signed != 0), values);
}
public static void IsInteger(params Value[] values)
{
AssertAndThrow(() => values.All(value => value.Is(V.Integer, false)), values);
}
public static void NotVoid(params Value[] values)
{
AssertAndThrow(() => values.All(value => value.Type != V.Void), values);
}
private static void AssertAndThrow(Func<bool> assertion, object? parameter, [CallerMemberName] string? method = "") =>
AssertAndThrow(assertion, [parameter], method);
private static void AssertAndThrow(
Func<bool> assertion,
object?[] parameters,
[CallerMemberName] string? method = "")
{
if (!assertion.Invoke())
throw new AssertionException(method ?? "", parameters);
}
public class AssertionException : Exception
{
public readonly string Assertion;
public readonly object?[] Parameters;
public AssertionException(string assertion, params object?[] parameters)
: base($"Assertion {assertion} failed for parameters:{Environment.NewLine}" +
$"{string.Join(Environment.NewLine, parameters.Select(p => $" - <{p?.GetType().Name ?? "null"}>{p?.ToString() ?? "null"}"))}")
{
Assertion = assertion;
Parameters = parameters;
}
}
}