private FieldValidatorCreator(
     PipeValidator <TModel> pipe,
     params Func <TModel, bool>[] ifConditions)
 {
     _pipe         = pipe;
     _current      = new ValidatorStruture <TField>();
     _ifConditions = ifConditions;
 }
 public IPipeValidator <TModel> Add()
 {
     if (_queue != null && _current.StructureType != ValidatorStrutureType.Default)
     {
         _queue.Add(_current);
         _current = new ValidatorStruture <TField>();
     }
     _pipe.AddFieldValidator(this);
     return(_pipe);
 }
        private async Task <ValidateResult> InvokeValidationForCurrent(
            TField field,
            ValidatorStruture <TField> current,
            string index)
        {
            var path = _path + index;

            switch (current.StructureType)
            {
            case ValidatorStrutureType.Func:
                if (!_current.Must(field))
                {
                    return(ValidateResult.DefaultFailed
                           .SetErrorMessage(current.Message)
                           .SetPath(path));
                }
                return(ValidateResult.DefaultValid);

            case ValidatorStrutureType.FuncAsync:
                if (!await _current.MustAsync(field))
                {
                    return(ValidateResult.DefaultFailed
                           .SetErrorMessage(current.Message)
                           .SetPath(path));
                }
                return(ValidateResult.DefaultValid);

            case ValidatorStrutureType.Validator:
                var result = current.Validator.Validate(field);
                if (result.IsFailed)
                {
                    result.SetPath(path);
                }
                return(result);

            case ValidatorStrutureType.ValidatorAsync:
                var asyncResult = await current.ValidatorAsync.ValidateAsync(field);

                if (asyncResult.IsFailed)
                {
                    asyncResult.SetPath(path);
                }
                return(asyncResult);

            default:
                return(ValidateResult.DefaultValid);
            }
        }
        private async Task <ValidateResult> InvokeValidationForField(
            TField field,
            ValidatorStruture <TField> current,
            int?index = null)
        {
            var indexstr = index == null ? string.Empty : $"[{index}]";

            if (_queue != null && _queue.Count > 0)
            {
                return(await InvokeValidationForQueue(field, indexstr));
            }
            else
            {
                return(await InvokeValidationForCurrent(field, current, indexstr));
            }
        }
 public IValidatorCreator <TModel, TField> Must(Func <TField, Task <bool> > must)
 {
     CheckQueueAndCurrentValidator();
     _current = new ValidatorStruture <TField>(must);
     return(this);
 }
 public IFieldValidatorCreator <TModel, TField> Set(IValidatorAsync <TField> validatorAsync)
 {
     CheckQueueAndCurrentValidator();
     _current = new ValidatorStruture <TField>(validatorAsync);
     return(this);
 }