using FluentValidation; namespace cuqmbr.TravelGuide.Application.Common.FluentValidation; public static class CustomValidators { public static IRuleBuilderOptions IsUsername( this IRuleBuilder ruleBuilder) { return ruleBuilder .Matches(@"^[a-z0-9-_.]*$"); } // According to RFC 5321. public static IRuleBuilderOptions IsEmail( this IRuleBuilder ruleBuilder) { return ruleBuilder .Matches(@"^[\w\.-]{1,64}@[\w\.-]{1,251}\.\w{2,4}$"); } // According to ITU-T E.164, no spaces. public static IRuleBuilderOptions IsPhoneNumber( this IRuleBuilder ruleBuilder) { return ruleBuilder .Matches(@"^\+[0-9]{7,15}$"); } public static IRuleBuilderOptions> IsUnique( this IRuleBuilder> ruleBuilder, Func selector) { if (selector == null) { throw new ArgumentNullException( nameof(selector), "Cannot pass a null selector."); } return ruleBuilder .Must(x => x.IsDistinct(selector)); } public static bool IsDistinct( this IEnumerable elements, Func selector) { var hashSet = new HashSet(); foreach (var element in elements.Select(selector)) { if (!hashSet.Contains(element)) hashSet.Add(element); else return false; } return true; } }