using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BaseDomain.SimpleValidator { public class ObjectValidatorBuilder { /// /// model that is validated /// private T model; private bool isValid; public ObjectValidatorBuilder(T objectOrEntity) { model = objectOrEntity; } /// /// Check if model meetf all rules /// public ObjectValidatorBuilder Build() { //select all ruiles without OnlyIf expression or with satisfied OnlyIf expression var invalidResults = _rules.Where(m => m.OnlyIf == null || (m.OnlyIf != null && m.OnlyIf(model))); //select all rules that arent satisfied invalidResults = invalidResults.Where(m => !m.ValidationExpression(model)); //set error messages of unsatisfied rules ErrorMessages = invalidResults.Select(m => m.ErrorMessage).ToList(); isValid =!invalidResults.Any(); return this; } public bool IsValid() { return isValid; } public void ThrowErrorMessages() { if (!isValid) throw new ArgumentException(this.ErrorMessagesAsString()); } public string ErrorMessagesAsString() { return String.Join("\n", this.ErrorMessages); } /// /// Get error messages for rules that are not satisfied /// public List ErrorMessages { get; set; } /// /// List of rules that are specified for model /// private readonly List> _rules = new List>(); public ObjectValidatorBuilder AddRule(Func validationExpression, Func onlyIf, String errorMessage) { _rules.Add(new ValidationRule() { ValidationExpression = validationExpression, OnlyIf = onlyIf, ErrorMessage = errorMessage }); return this; } public ObjectValidatorBuilder AddRule(Func validationExpression, String errorMessage) { AddRule(validationExpression, null, errorMessage); return this; } public ObjectValidatorBuilder AddRule(AValueObject valueObject) { AddRule((valueObject) => (valueObject as AValueObject).GetValidationExpression(), null, AValueObject.ErrorMessage); return this; } public ObjectValidatorBuilder AddRule(ValidationRule rule) { AddRule(rule); return this; } public void ClearRules() { _rules.Clear(); } } }