-
-
Notifications
You must be signed in to change notification settings - Fork 254
/
AttributeValidator.cs
90 lines (79 loc) · 3.46 KB
/
AttributeValidator.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// Copyright (c) Nate McMaster.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using McMaster.Extensions.CommandLineUtils.Abstractions;
namespace McMaster.Extensions.CommandLineUtils.Validation
{
/// <summary>
/// A validator that uses a <see cref="ValidationAttribute"/> to validate a command, command line option, or argument.
/// </summary>
public class AttributeValidator : IValidator, ICommandValidator
{
/// <summary>
/// Initializes an instance of <see cref="AttributeValidator"/>.
/// </summary>
/// <param name="attribute"></param>
public AttributeValidator(ValidationAttribute attribute)
{
ValidationAttribute = attribute ?? throw new ArgumentNullException(nameof(attribute));
}
internal ValidationAttribute ValidationAttribute { get; }
/// <summary>
/// Gets the validation result for a command line option.
/// </summary>
/// <param name="option"></param>
/// <param name="context"></param>
/// <returns></returns>
public ValidationResult? GetValidationResult(CommandOption option, ValidationContext context)
{
if (ValidationAttribute is RequiredAttribute && option.OptionType == CommandOptionType.NoValue)
{
if (option.HasValue())
{
return ValidationResult.Success;
}
}
return GetValidationResult(option.Values, context);
}
/// <summary>
/// Gets the validation result for a command line argument.
/// </summary>
/// <param name="argument"></param>
/// <param name="context"></param>
/// <returns></returns>
public ValidationResult? GetValidationResult(CommandArgument argument, ValidationContext context)
=> GetValidationResult(argument.Values, context);
private ValidationResult? GetValidationResult(IReadOnlyList<string?>? values, ValidationContext context)
{
if (values == null)
{
throw new ArgumentNullException(nameof(values));
}
if (ValidationAttribute is RequiredAttribute && values.Count == 0)
{
return ValidationAttribute.GetValidationResult(null, context);
}
foreach (var value in values)
{
var result = ValidationAttribute.GetValidationResult(value, context);
if (result != ValidationResult.Success)
{
return result;
}
}
return ValidationResult.Success;
}
/// <summary>Checks whether the command is valid using any associated validation attributes.</summary>
/// <param name="command">The command line application to validate</param>
/// <param name="context">The context under which validation should be performed</param>
public ValidationResult? GetValidationResult(CommandLineApplication command, ValidationContext context)
{
var model = (command as IModelAccessor)?.GetModel();
return model != null
? ValidationAttribute.GetValidationResult(model, context)
: ValidationAttribute.GetValidationResult(command, context);
}
}
}