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 assertion, object? parameter, [CallerMemberName] string? method = "") => AssertAndThrow(assertion, [parameter], method); private static void AssertAndThrow( Func 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; } } }