using JetBrains.Annotations; using System.Diagnostics; namespace Tiobon.Core.Common; [DebuggerStepThrough] public static class Check { [ContractAnnotation("value:null => halt")] public static T NotNull( T value, [InvokerParameterName][NotNull] string parameterName) { if (value == null) { throw new ArgumentNullException(parameterName); } return value; } [ContractAnnotation("value:null => halt")] public static T NotNull( T value, [InvokerParameterName][NotNull] string parameterName, string message) { if (value == null) { throw new ArgumentNullException(parameterName, message); } return value; } [ContractAnnotation("value:null => halt")] public static string NotNull( string value, [InvokerParameterName][NotNull] string parameterName, int maxLength = int.MaxValue, int minLength = 0) { if (value == null) { throw new ArgumentException($"{parameterName} can not be null!", parameterName); } if (value.Length > maxLength) { throw new ArgumentException($"{parameterName} length must be equal to or lower than {maxLength}!", parameterName); } if (minLength > 0 && value.Length < minLength) { throw new ArgumentException($"{parameterName} length must be equal to or bigger than {minLength}!", parameterName); } return value; } [ContractAnnotation("value:null => halt")] public static string NotNullOrWhiteSpace( string value, [InvokerParameterName][NotNull] string parameterName, int maxLength = int.MaxValue, int minLength = 0) { if (string.IsNullOrWhiteSpace(value)) { throw new ArgumentException($"{parameterName} can not be null, empty or white space!", parameterName); } if (value.Length > maxLength) { throw new ArgumentException($"{parameterName} length must be equal to or lower than {maxLength}!", parameterName); } if (minLength > 0 && value.Length < minLength) { throw new ArgumentException($"{parameterName} length must be equal to or bigger than {minLength}!", parameterName); } return value; } [ContractAnnotation("value:null => halt")] public static string NotNullOrEmpty( string value, [InvokerParameterName][NotNull] string parameterName, int maxLength = int.MaxValue, int minLength = 0) { if (value.IsNullOrEmpty()) { throw new ArgumentException($"{parameterName} can not be null or empty!", parameterName); } if (value.Length > maxLength) { throw new ArgumentException($"{parameterName} length must be equal to or lower than {maxLength}!", parameterName); } if (minLength > 0 && value.Length < minLength) { throw new ArgumentException($"{parameterName} length must be equal to or bigger than {minLength}!", parameterName); } return value; } [ContractAnnotation("value:null => halt")] public static ICollection NotNullOrEmpty(ICollection value, [InvokerParameterName][NotNull] string parameterName) { if (value == null || value.Count <= 0) { throw new ArgumentException(parameterName + " can not be null or empty!", parameterName); } return value; } [ContractAnnotation("type:null => halt")] public static Type AssignableTo( Type type, [InvokerParameterName][NotNull] string parameterName) { NotNull(type, parameterName); if (!type.IsAssignableTo()) { throw new ArgumentException($"{parameterName} (type of {type.AssemblyQualifiedName}) should be assignable to the {typeof(TBaseType).GetFullNameWithAssemblyName()}!"); } return type; } public static string Length( [CanBeNull] string value, [InvokerParameterName][NotNull] string parameterName, int maxLength, int minLength = 0) { if (minLength > 0) { if (string.IsNullOrEmpty(value)) { throw new ArgumentException(parameterName + " can not be null or empty!", parameterName); } if (value.Length < minLength) { throw new ArgumentException($"{parameterName} length must be equal to or bigger than {minLength}!", parameterName); } } if (value != null && value.Length > maxLength) { throw new ArgumentException($"{parameterName} length must be equal to or lower than {maxLength}!", parameterName); } return value; } }