Skip to content

Commit 259d24f

Browse files
authored
merge Validate class into ArgumentValidation (#2077)
use the new Path.Exists method to check for directory and file existance
1 parent 7d3cd43 commit 259d24f

File tree

4 files changed

+46
-60
lines changed

4 files changed

+46
-60
lines changed

src/System.CommandLine/ArgumentValidation.cs

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
33

44
using System.Collections.Generic;
5+
using System.CommandLine.Parsing;
56
using System.IO;
67

78
namespace System.CommandLine
@@ -18,7 +19,7 @@ public static class ArgumentValidation
1819
/// <returns>The configured argument.</returns>
1920
public static Argument<FileInfo> AcceptExistingOnly(this Argument<FileInfo> argument)
2021
{
21-
argument.Validators.Add(Validate.FileExists);
22+
argument.Validators.Add(FileOrDirectoryExists<FileInfo>);
2223
return argument;
2324
}
2425

@@ -29,7 +30,7 @@ public static Argument<FileInfo> AcceptExistingOnly(this Argument<FileInfo> argu
2930
/// <returns>The configured argument.</returns>
3031
public static Argument<DirectoryInfo> AcceptExistingOnly(this Argument<DirectoryInfo> argument)
3132
{
32-
argument.Validators.Add(Validate.DirectoryExists);
33+
argument.Validators.Add(FileOrDirectoryExists<DirectoryInfo>);
3334
return argument;
3435
}
3536

@@ -40,7 +41,7 @@ public static Argument<DirectoryInfo> AcceptExistingOnly(this Argument<Directory
4041
/// <returns>The configured argument.</returns>
4142
public static Argument<FileSystemInfo> AcceptExistingOnly(this Argument<FileSystemInfo> argument)
4243
{
43-
argument.Validators.Add(Validate.FileOrDirectoryExists);
44+
argument.Validators.Add(FileOrDirectoryExists<FileSystemInfo>);
4445
return argument;
4546
}
4647

@@ -54,18 +55,51 @@ public static Argument<T> AcceptExistingOnly<T>(this Argument<T> argument)
5455
{
5556
if (typeof(IEnumerable<FileInfo>).IsAssignableFrom(typeof(T)))
5657
{
57-
argument.Validators.Add(Validate.FileExists);
58+
argument.Validators.Add(FileOrDirectoryExists<FileInfo>);
5859
}
5960
else if (typeof(IEnumerable<DirectoryInfo>).IsAssignableFrom(typeof(T)))
6061
{
61-
argument.Validators.Add(Validate.DirectoryExists);
62+
argument.Validators.Add(FileOrDirectoryExists<DirectoryInfo>);
6263
}
6364
else
6465
{
65-
argument.Validators.Add(Validate.FileOrDirectoryExists);
66+
argument.Validators.Add(FileOrDirectoryExists<FileSystemInfo>);
6667
}
6768

6869
return argument;
6970
}
71+
72+
private static void FileOrDirectoryExists<T>(ArgumentResult result)
73+
where T : FileSystemInfo
74+
{
75+
// both FileInfo and DirectoryInfo are sealed so following checks are enough
76+
bool checkFile = typeof(T) != typeof(DirectoryInfo);
77+
bool checkDirectory = typeof(T) != typeof(FileInfo);
78+
79+
for (var i = 0; i < result.Tokens.Count; i++)
80+
{
81+
var token = result.Tokens[i];
82+
83+
if (checkFile && checkDirectory)
84+
{
85+
#if NET7_0_OR_GREATER
86+
if (!Path.Exists(token.Value))
87+
#else
88+
if (!Directory.Exists(token.Value) && !File.Exists(token.Value))
89+
#endif
90+
{
91+
result.AddError(LocalizationResources.FileOrDirectoryDoesNotExist(token.Value));
92+
}
93+
}
94+
else if (checkDirectory && !Directory.Exists(token.Value))
95+
{
96+
result.AddError(LocalizationResources.DirectoryDoesNotExist(token.Value));
97+
}
98+
else if (checkFile && !Directory.Exists(token.Value) && !File.Exists(token.Value))
99+
{
100+
result.AddError(LocalizationResources.FileDoesNotExist(token.Value));
101+
}
102+
}
103+
}
70104
}
71105
}

src/System.CommandLine/OptionValidation.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ public static class OptionValidation
1818
/// <returns>The option being extended.</returns>
1919
public static Option<FileInfo> AcceptExistingOnly(this Option<FileInfo> option)
2020
{
21-
option.Argument.Validators.Add(Validate.FileExists);
21+
option._argument.AcceptExistingOnly();
22+
2223
return option;
2324
}
2425

@@ -29,7 +30,7 @@ public static Option<FileInfo> AcceptExistingOnly(this Option<FileInfo> option)
2930
/// <returns>The option being extended.</returns>
3031
public static Option<DirectoryInfo> AcceptExistingOnly(this Option<DirectoryInfo> option)
3132
{
32-
option.Argument.Validators.Add(Validate.DirectoryExists);
33+
option._argument.AcceptExistingOnly();
3334
return option;
3435
}
3536

@@ -40,7 +41,7 @@ public static Option<DirectoryInfo> AcceptExistingOnly(this Option<DirectoryInfo
4041
/// <returns>The option being extended.</returns>
4142
public static Option<FileSystemInfo> AcceptExistingOnly(this Option<FileSystemInfo> option)
4243
{
43-
option.Argument.Validators.Add(Validate.FileOrDirectoryExists);
44+
option._argument.AcceptExistingOnly();
4445
return option;
4546
}
4647

@@ -52,10 +53,7 @@ public static Option<FileSystemInfo> AcceptExistingOnly(this Option<FileSystemIn
5253
public static Option<T> AcceptExistingOnly<T>(this Option<T> option)
5354
where T : IEnumerable<FileSystemInfo>
5455
{
55-
if (option.Argument is Argument<T> arg)
56-
{
57-
arg.AcceptExistingOnly();
58-
}
56+
option._argument.AcceptExistingOnly();
5957

6058
return option;
6159
}

src/System.CommandLine/Option{T}.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace System.CommandLine
1010
/// <typeparam name="T">The <see cref="System.Type"/> that the option's arguments are expected to be parsed as.</typeparam>
1111
public class Option<T> : Option, IValueDescriptor<T>
1212
{
13-
private readonly Argument<T> _argument;
13+
internal readonly Argument<T> _argument;
1414

1515
/// <summary>
1616
/// Initializes a new instance of the Option class.

src/System.CommandLine/Validate.cs

Lines changed: 0 additions & 46 deletions
This file was deleted.

0 commit comments

Comments
 (0)