private static DryvRuleDefinition Translate(this DryvRuleDefinition rule, ITranslator translator, DryvOptions options)
        {
            if (rule.TranslatedValidationExpression != null ||
                rule.TranslationError != null)
            {
                return(rule);
            }

            try
            {
                var translatedRule = translator.Translate(rule.ValidationExpression, rule.PropertyExpression);

                rule.TranslatedValidationExpression = translatedRule.Factory;
                rule.PreevaluationOptionTypes       = translatedRule.OptionTypes;
            }
            catch (DryvException ex)
            {
                switch (options.TranslationErrorBehavior)
                {
                case TranslationErrorBehavior.ValidateOnServer:
                    rule.TranslatedValidationExpression = null;
                    rule.PreevaluationOptionTypes       = null;
                    rule.TranslationError = ex;
                    break;

                default:
                    throw;
                }
            }

            return(rule);
        }
Esempio n. 2
0
        public static DryvResult Validate(this DryvRuleDefinition rule, object model, Func <Type, object> objectFactory)
        {
            rule.Compile();
            var options = rule.GetPreevaluationOptions(objectFactory);

            return(rule.CompiledValidationExpression(model, options));
        }
Esempio n. 3
0
        public static bool IsEnabled(this DryvRuleDefinition rule, Func <Type, object> objectFactory)
        {
            rule.Compile();
            var options = rule.GetPreevaluationOptions(objectFactory);

            return(rule.CompiledEnablingExpression(options));
        }
Esempio n. 4
0
 private static void EnsurePreevaluationOptionTypes(this DryvRuleDefinition rule)
 {
     if (rule.PreevaluationOptionTypes?.Any() != true)
     {
         rule.PreevaluationOptionTypes = (from p in rule.ValidationExpression.Parameters.Skip(1)
                                          select p.Type).ToArray();
     }
 }
Esempio n. 5
0
        public static DryvRuleDefinition Compile(this DryvRuleDefinition rule)
        {
            if (rule.CompiledValidationExpression != null)
            {
                return(rule);
            }

            rule.CompiledValidationExpression = rule.CompileValidationExpression();
            rule.CompiledEnablingExpression   = rule.CompileEnablingExpression();

            return(rule);
        }
Esempio n. 6
0
        private static Func <object[], bool> CompileEnablingExpression(this DryvRuleDefinition rule)
        {
            var lambdaExpression = rule.EnablingExpression;

            rule.EnsurePreevaluationOptionTypes();

            var optionsParameter = Expression.Parameter(typeof(object[]), "options");
            Expression <Func <object[], bool> > resultLambda;

            if (lambdaExpression != null)
            {
                var invokeArguments = new List <Expression>();
                invokeArguments.AddOptionParameters(lambdaExpression, optionsParameter);
                var invokeExpression = Expression.Invoke(lambdaExpression, invokeArguments);
                resultLambda = Expression.Lambda <Func <object[], bool> >(invokeExpression, optionsParameter);
            }
            else
            {
                resultLambda = Expression.Lambda <Func <object[], bool> >(Expression.Constant(true), optionsParameter);
            }

            return(resultLambda.Compile());
        }
Esempio n. 7
0
        private static Func <object, object[], DryvResult> CompileValidationExpression(this DryvRuleDefinition rule)
        {
            var lambdaExpression = rule.ValidationExpression;

            rule.EnsurePreevaluationOptionTypes();

            var modelParameter   = Expression.Parameter(typeof(object), "model");
            var optionsParameter = Expression.Parameter(typeof(object[]), "options");
            var invokeArguments  = new List <Expression>
            {
                Expression.Convert(modelParameter, lambdaExpression.Parameters.First().Type)
            };

            invokeArguments.AddOptionParameters(lambdaExpression, optionsParameter, 1);

            var invokeExpression = Expression.Invoke(lambdaExpression, invokeArguments);
            var resultLambda     = Expression.Lambda <Func <object, object[], DryvResult> >(invokeExpression, modelParameter, optionsParameter);

            return(resultLambda.Compile());
        }
Esempio n. 8
0
 private static object[] GetPreevaluationOptions(this DryvRuleDefinition rule, Func <Type, object> objectFactory)
 {
     return((from t in rule.PreevaluationOptionTypes
             select objectFactory(t)).ToArray());
 }