public static IValitRule <TObject, TProperty> When <TObject, TProperty>(this IValitRule <TObject, TProperty> rule, Predicate <TObject> condition) where TObject : class
        {
            rule.ThrowIfNull(ValitExceptionMessages.NullRule);
            condition.ThrowIfNull(ValitExceptionMessages.NullPredicate);

            var accessor = rule.GetAccessor();

            accessor.AddCondition(condition);
            return(rule);
        }
        public static IValitRule <TObject, TProperty> Tag <TObject, TProperty>(this IValitRule <TObject, TProperty> rule, params string[] tags) where TObject : class
        {
            rule.ThrowIfNull(ValitExceptionMessages.NullRule);
            tags.ThrowIfNull();

            var accessor = rule.GetAccessor();

            accessor.AddTags(tags);
            return(rule);
        }
        public static IValitRule <TObject, TProperty> WithErrorCode <TObject, TProperty>(this IValitRule <TObject, TProperty> rule, int errorCode) where TObject : class
        {
            rule.ThrowIfNull(ValitExceptionMessages.NullRule);

            var accessor = rule.GetAccessor();

            var error = ValitRuleError.CreateForErrorCode(errorCode);

            accessor.AddError(error);
            return(rule);
        }
        public static IValitRule <TObject, TProperty> WithMessageKey <TObject, TProperty, TKey>(this IValitRule <TObject, TProperty> rule, TKey messageKey) where TObject : class
        {
            rule.ThrowIfNull(ValitExceptionMessages.NullRule);

            var accessor        = rule.GetAccessor();
            var messageProvider = accessor.GetMessageProvider <TKey>();

            var error = ValitRuleError.CreateForMessage(() => messageProvider.GetByKey(messageKey));

            accessor.AddError(error);
            return(rule);
        }
        internal static IValitRule <TObject, TProperty> WithMessage <TObject, TProperty>(this IValitRule <TObject, TProperty> rule, string message, bool isDefault) where TObject : class
        {
            rule.ThrowIfNull(ValitExceptionMessages.NullRule);
            message.ThrowIfNull();

            var accessor = rule.GetAccessor();

            var error = ValitRuleError.CreateForMessage(() => message, isDefault);

            accessor.AddError(error);
            return(rule);
        }
        public static IValitRule <TObject, TProperty> WithMessage <TObject, TProperty>(
            this IValitRule <TObject, TProperty> rule, Func <string> messageFunc) where TObject : class
        {
            rule.ThrowIfNull(ValitExceptionMessages.NullRule);
            messageFunc.ThrowIfNull();

            var accessor = rule.GetAccessor();

            var error = ValitRuleError.CreateForMessage(messageFunc);

            accessor.AddError(error);
            return(rule);
        }
        public static IValitRule <TObject, TProperty> Satisfies <TObject, TProperty>(this IValitRule <TObject, TProperty> rule, Predicate <TProperty> predicate) where TObject : class
        {
            rule.ThrowIfNull(ValitExceptionMessages.NullRule);
            predicate.ThrowIfNull(ValitExceptionMessages.NullPredicate);

            IValitRuleAccessor <TObject, TProperty> accessor;

            if (rule.IsFirstInEnsure())
            {
                accessor = rule.GetAccessor();
                accessor.SetPredicate(predicate);
                return(rule);
            }

            var newRule = new ValitRule <TObject, TProperty>(rule);

            accessor = newRule.GetAccessor();
            accessor.SetPredicate(predicate);
            return(newRule);
        }