core-test/src/core/Parsers.cs

101 lines
2.2 KiB
C#
Raw Normal View History

2026-02-12 21:18:29 +01:00
using System.CommandLine.Parsing;
using System.Text.RegularExpressions;
using Microsoft.Extensions.FileSystemGlobbing;
namespace Geekeey.Core;
internal static class Parsers
{
public static Uri? Uri(ArgumentResult result)
{
if (!result.Tokens.Any())
{
return null;
}
if (!System.Uri.TryCreate(result.Tokens.Single().Value, UriKind.RelativeOrAbsolute, out var uri))
{
result.AddError("Not a valid URI.");
return null;
}
return uri;
}
public static Pattern? Pattern(ArgumentResult result)
{
if (!result.Tokens.Any())
{
return null;
}
if (bool.TryParse(result.Tokens.Single().Value, out var value))
{
return new Pattern(value);
}
try
{
var regex = new Regex(result.Tokens.Single().Value, RegexOptions.Compiled | RegexOptions.IgnoreCase);
return new Pattern(regex);
}
catch (ArgumentException)
{
result.AddError("Not a valid boolean or regex pattern.");
return null;
}
}
public static Matcher? Matcher(ArgumentResult result)
{
if (!result.Tokens.Any())
{
return null;
}
var matcher = new Matcher();
foreach (var token in result.Tokens)
{
try
{
if (token.Value.StartsWith('!'))
{
matcher.AddExclude(token.Value[1..]);
}
else
{
matcher.AddInclude(token.Value);
}
}
catch (Exception exception)
{
result.AddError($"Not a valid glob pattern: {token.Value}. {exception.Message}");
return null;
}
}
return matcher;
}
}
internal sealed class Pattern
{
private readonly bool _value;
private readonly Regex? _pattern;
public Pattern(bool value)
{
_value = value;
}
public Pattern(Regex pattern)
{
_pattern = pattern;
}
public bool Match(string version)
{
return _pattern?.IsMatch(version) ?? _value;
}
}