public static Func <Task <RuleResult> > ToTaskFunc(this AsyncRuleValidateAction action)
        {
            if (action == null)
            {
                return(null);
            }

            return(() =>
            {
                var tcs = new TaskCompletionSource <RuleResult>();

                try
                {
                    action(result => tcs.TrySetResult(result));
                }
                catch (Exception e)
                {
                    if (!tcs.TrySetException(e))
                    {
                        throw;
                    }
                }

                return tcs.Task;
            });
        }
 public IAsyncValidationRule AddAsyncRule(IEnumerable<Expression<Func<object>>> properties,
     AsyncRuleValidateAction validateAction)
 {
     return AddAsyncRule(properties, validateAction.ToTaskFunc());
 }
 public IAsyncValidationRule AddAsyncRule(Expression<Func<object>> property1Expression,
     Expression<Func<object>> property2Expression,
     AsyncRuleValidateAction validateAction)
 {
     return AddAsyncRule(property1Expression, property2Expression, validateAction.ToTaskFunc());
 }
 public IAsyncValidationRule AddAsyncRule(AsyncRuleValidateAction validateAction)
 {
     return AddAsyncRule(validateAction.ToTaskFunc());
 }
 public IAsyncValidationRule AddAsyncRule(object target, AsyncRuleValidateAction validateAction)
 {
     return AddAsyncRule(target, validateAction.ToTaskFunc());
 }
 public IAsyncValidationRule AddAsyncRule(IEnumerable <Expression <Func <object> > > properties,
                                          AsyncRuleValidateAction validateAction)
 {
     return(AddAsyncRule(properties, validateAction.ToTaskFunc()));
 }
 public IAsyncValidationRule AddAsyncRule(Expression <Func <object> > property1Expression,
                                          Expression <Func <object> > property2Expression,
                                          AsyncRuleValidateAction validateAction)
 {
     return(AddAsyncRule(property1Expression, property2Expression, validateAction.ToTaskFunc()));
 }
 public IAsyncValidationRule AddAsyncRule(AsyncRuleValidateAction validateAction)
 {
     return(AddAsyncRule(validateAction.ToTaskFunc()));
 }
 public IAsyncValidationRule AddAsyncRule(object target, AsyncRuleValidateAction validateAction)
 {
     return(AddAsyncRule(target, validateAction.ToTaskFunc()));
 }