static void ThrowForUnsuccessfulValidationIfApplicable(IQueryableValidationResult result, ResolvedValidationOptions options)
        {
            if (ShouldThrowForError(options) && result.RuleResults.Any(x => x.Outcome == Rules.RuleOutcome.Errored))
            {
                var message = String.Format(Resources.ExceptionMessages.GetExceptionMessage("ErrorInValidation"),
                                            nameof(ResolvedValidationOptions),
                                            nameof(ResolvedValidationOptions.RuleThrowingBehaviour),
                                            nameof(RuleThrowingBehaviour),
                                            options.RuleThrowingBehaviour,
                                            nameof(ValidationResult),
                                            nameof(RuleOutcome.Errored));
                throw new ValidationException(message, (ValidationResult)result);
            }

            if (ShouldThrowForFailure(options) && result.RuleResults.Any(x => x.Outcome == Rules.RuleOutcome.Failed))
            {
                var message = String.Format(Resources.ExceptionMessages.GetExceptionMessage("FailureInValidation"),
                                            nameof(ResolvedValidationOptions),
                                            nameof(ResolvedValidationOptions.RuleThrowingBehaviour),
                                            nameof(RuleThrowingBehaviour),
                                            options.RuleThrowingBehaviour,
                                            nameof(ValidationResult),
                                            nameof(RuleOutcome.Errored),
                                            nameof(RuleOutcome.Failed));
                throw new ValidationException(message, (ValidationResult)result);
            }
        }
Пример #2
0
 internal static SerializableValidationResult ToSerializableValidationResult(IQueryableValidationResult result)
 {
     return(new SerializableValidationResult
     {
         RuleResults = result.RuleResults
                       .Select(ruleResult =>
         {
             return new SerializableValidationRuleResult
             {
                 MemberName = ruleResult.Identifier?.MemberName,
                 ObjectIdentityString = ruleResult.Identifier?.ObjectIdentity?.ToString(),
                 RuleTypeName = ruleResult.Identifier?.RuleType.AssemblyQualifiedName,
                 RuleName = ruleResult.Identifier?.RuleName,
                 ValidatedTypeName = ruleResult.Identifier?.ValidatedType.AssemblyQualifiedName,
                 Outcome = ruleResult.Outcome,
                 Message = ruleResult.Message,
                 ExceptionString = ruleResult.Exception?.ToString(),
             };
         })
                       .ToArray(),
     });
 }
Пример #3
0
        internal static IQueryableValidationResult <TDerived> PolymorphicAs <TValidated, TDerived>(IQueryableValidationResult <TValidated> results)
            where TDerived : TValidated
        {
            if (results is null)
            {
                throw new ArgumentNullException(nameof(results));
            }

            if (!(results.ManifestValue is IHasPolymorphicTypes poly))
            {
                var message = String.Format(Resources.ExceptionMessages.GetExceptionMessage("MustImplementPolymorphicInterface"),
                                            typeof(IHasPolymorphicTypes).Name,
                                            results.ManifestValue.GetType().FullName);
                throw new ArgumentException(message, nameof(results));
            }

            var polymorphicManifest = poly.PolymorphicTypes.FirstOrDefault(x => x.ValidatedType == typeof(TDerived));

            if (polymorphicManifest is null)
            {
                var message = String.Format(Resources.ExceptionMessages.GetExceptionMessage("MustHaveMatchingPolymorphicManifest"),
                                            results.ManifestValue.ValidatedType.FullName,
                                            typeof(TDerived).FullName);
                throw new ArgumentException(message, nameof(results));
            }

            return(new SubsetOfValidationResults <TDerived>(results.RuleResults, polymorphicManifest));
        }
Пример #4
0
        internal static IQueryableValidationResult <TValidated> WithoutSuccesses <TValidated>(IQueryableValidationResult <TValidated> results)
        {
            if (results is null)
            {
                throw new ArgumentNullException(nameof(results));
            }

            return(new SubsetOfValidationResults <TValidated>(results.Where(x => x.Outcome != Rules.RuleOutcome.Passed), results.ManifestValue));
        }
Пример #5
0
        internal static IQueryableValidationResult <TValidated> ForOnlyTheSameValue <TValidated>(IQueryableValidationResult <TValidated> results)
        {
            if (results is null)
            {
                throw new ArgumentNullException(nameof(results));
            }

            var filteredRuleResults = results.RuleResults.Where(new RuleResultIsForDescendentOfValue(results.ManifestValue, false));

            return(new SubsetOfValidationResults <TValidated>(filteredRuleResults, results.ManifestValue));
        }
Пример #6
0
        internal static IQueryableValidationResult <TItem> ForMatchingMemberItem <TValidated, TItem>(IQueryableValidationResult <TValidated> results,
                                                                                                     Expression <Func <TValidated, IEnumerable <TItem> > > memberExpression,
                                                                                                     TItem item)
        {
            if (results is null)
            {
                throw new ArgumentNullException(nameof(results));
            }

            var member          = Reflection.Reflect.Member(memberExpression);
            var collectionValue = results.ManifestValue.Children.FirstOrDefault(x => x.MemberName == member.Name);

            if (collectionValue is null)
            {
                var message = String.Format(Resources.ExceptionMessages.GetExceptionMessage("NoMatchingMemberInManifest"),
                                            typeof(TValidated).FullName,
                                            member.Name);
                throw new ArgumentException(message, nameof(memberExpression));
            }
            if (collectionValue.CollectionItemValue is null)
            {
                var message = string.Format(Resources.ExceptionMessages.GetExceptionMessage("ValueMustBeACollection"),
                                            typeof(TValidated).FullName,
                                            member.Name,
                                            nameof(ForMatchingMemberItem));
                throw new ArgumentException(message, nameof(memberExpression));
            }

            var filteredRuleResults = results.RuleResults.Where(new RuleResultIsForDescendentOfValue(collectionValue.CollectionItemValue, item));

            return(new SubsetOfValidationResults <TItem>(filteredRuleResults, collectionValue.CollectionItemValue));
        }
        async Task <IEnumerable <ValidationRuleResult> > GetRuleResultsWithMessagesAsync(IQueryableValidationResult result, CancellationToken cancellationToken)
        {
            var results = new List <ValidationRuleResult>();

            foreach (var ruleResult in result.RuleResults)
            {
                cancellationToken.ThrowIfCancellationRequested();
                results.Add(await GetRuleResultWithMessageAsync(ruleResult, cancellationToken).ConfigureAwait(false));
            }

            return(results);
        }
        /// <inheritdoc/>
        public async Task <IQueryableValidationResult <TValidated> > GetResultWithMessagesAsync <TValidated>(IQueryableValidationResult <TValidated> result, CancellationToken cancellationToken = default)
        {
            var resultsWithMessages = await GetRuleResultsWithMessagesAsync(result, cancellationToken).ConfigureAwait(false);

            return(new ValidationResult <TValidated>(resultsWithMessages, ((ValidationResult <TValidated>)result).Manifest));
        }