private static IValidatableSchema Validate(IValidatableSchema validatable) { var properties = validatable.GetType().GetProperties(); if (!properties.Any() || (validatable.GetSchemaRules() is null) || !validatable.ChangedHashCode()) { return(validatable); } var rules = validatable.GetSchemaRules(); var describedValidations = rules.GetType().GetProperties(); var validationResult = new ValidationResult(); var tasks = new List <Task>(); foreach (var validation in describedValidations) { tasks.AddRange(ValidationFactory.CreateByPropertyName(validatable, properties, validation.Name, validation.GetValue(rules)?.ToString().Split('|'), validationResult)); } tasks.ForEach(t => t.Start()); Task.WaitAll(tasks.ToArray(), TASK_EXECUTION_TIMEOUT); validatable.ValidationResult = validationResult; validatable.SetHashCode(); return(validatable); }
public static IValidatableSchema ValidateSchema(this IValidatableSchema validatable) { lock (_lock) { return(Validate(validatable)); } }
public static List <Task> CreateByPropertyName(IValidatableSchema entity, PropertyInfo[] properties, string propertyName, string[] rules, ValidationResult result) { ValidateRulesAndResultObject(rules, result); var property = properties.FirstOrDefault(p => p.Name.Equals(propertyName)); var tasks = new List <Task>(); ValidateProperty(propertyName, property); var propertyValue = property.GetValue(entity); foreach (var rule in rules) { switch (rule) { case RuleName.REQUIRED: tasks.Add(new Task(() => result.Add(CommonValidations.IsRequired(property, propertyValue)))); break; case string r when r.Contains(RuleName.MIN): tasks.Add(new Task(() => result.Add(CreateValidationForMin(property, propertyValue, rule)))); break; case string r when r.Contains(RuleName.MAX): tasks.Add(new Task(() => result.Add(CreateValidationForMax(property, propertyValue, rule)))); break; case string r when r.Contains(RuleName.GUID): tasks.Add(new Task(() => result.Add(CreateValidationForGuid(property, propertyValue, rule)))); break; case RuleName.EMAIL: tasks.Add(new Task(() => result.Add(EmailValidations.IsEmail(property, propertyValue)))); break; case RuleName.CNPJ: tasks.Add(new Task(() => result.Add(CnpjValidations.IsCnpj(property, propertyValue)))); break; case RuleName.CPF: tasks.Add(new Task(() => result.Add(CpfValidations.IsCpf(property, propertyValue)))); break; default: throw new RuleNotSupportedException(rule); } } return(tasks); }