Skip to content

Commit

Permalink
Fix: Handle invalid parameter configuration (kutoga#42)
Browse files Browse the repository at this point in the history
* Handle invalid states

* Update version

* Fix test helpers

* Add a test

* Using ordering

* Fix example

* Update README

* Downgrade netcore2.2 to netcore2.1
  • Loading branch information
kutoga authored Aug 30, 2020
1 parent 6303884 commit f81184f
Show file tree
Hide file tree
Showing 11 changed files with 75 additions and 4 deletions.
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# FluentArgs: Fluent Argument Parsing for .NET
<strong>
Version:
0.9.6
0.9.7

</strong>

Expand Down Expand Up @@ -862,6 +862,11 @@ namespace Example
{
throw new NotImplementedException();
}

public Task PrintInvalidStateError(IReadOnlyCollection<string>? helpFlagAliases)
{
throw new NotImplementedException();
}
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ variables:
docDirectory: '$(Build.SourcesDirectory)/doc'
major: '0'
minor: '9'
patch: '6'
patch: '7'

steps:
- script: dotnet tool install --global Paket --version 5.203.0
Expand Down
2 changes: 1 addition & 1 deletion doc/DummyProject/DummyProject.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<PropertyGroup>
<LangVersion>8.0</LangVersion>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
<TargetFramework>netcoreapp2.1</TargetFramework>
<NoWarn>SA1633;SA1400;CA1303;SA0001</NoWarn>
</PropertyGroup>

Expand Down
5 changes: 5 additions & 0 deletions doc/examples/HandleErrors03.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ public Task PrintInvalidCommandValueError(IReadOnlyCollection<string> aliases, s
{
throw new NotImplementedException();
}

public Task PrintInvalidStateError(IReadOnlyCollection<string>? helpFlagAliases)
{
throw new NotImplementedException();
}
}
}
}
8 changes: 8 additions & 0 deletions source/FluentArgs.Test.Helpers/DummyParsingErrorPrinter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ public class DummyParsingErrorPrinter :
public IReadOnlyCollection<(IReadOnlyCollection<string> remainingArguments, IReadOnlyCollection<string>? helpFlagAliases)> NotAllArgumentsAreUsedErrors =>
notAllArgumentsAreUsedErrors;

public int InvalidStateErrors { get; private set; } = 0;

public Task PrintArgumentMissingError(IReadOnlyCollection<string>? aliases, Type targetType, string description, IReadOnlyCollection<string>? helpFlagAliases)
{
argumentMissingErrors.Add((aliases, targetType, description, helpFlagAliases));
Expand All @@ -55,5 +57,11 @@ public Task PrintInvalidCommandValueError(IReadOnlyCollection<string> aliases, s
invalidCommandValueErrors.Add((aliases, value, helpFlagAliases));
return Task.CompletedTask;
}

public Task PrintInvalidStateError(IReadOnlyCollection<string>? helpFlagAliases)
{
++InvalidStateErrors;
return Task.CompletedTask;
}
}
}
27 changes: 27 additions & 0 deletions source/FluentArgs.Test/Parsing/ErrorTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public static void IfAnArgumentIsMissing_ShouldFailAndPropagateError()
parseSuccess.Should().BeFalse();
called.Should().BeFalse();
dummyParsingErrorPrinter.ArgumentParsingErrors.Should().BeEmpty();
dummyParsingErrorPrinter.InvalidStateErrors.Should().Be(0);
dummyParsingErrorPrinter.ArgumentMissingErrors.Count.Should().Be(1);
dummyParsingErrorPrinter.ArgumentMissingErrors.First().aliases.Should().BeEquivalentTo("-x");
dummyParsingErrorPrinter.ArgumentMissingErrors.First().helpFlagAliases.Should().BeNull();
Expand Down Expand Up @@ -62,6 +63,7 @@ public static void IfArgumentCannotBeParsed_ShouldFailAndPropagateError()
parseSuccess.Should().BeFalse();
called.Should().BeFalse();
dummyParsingErrorPrinter.ArgumentMissingErrors.Should().BeEmpty();
dummyParsingErrorPrinter.InvalidStateErrors.Should().Be(0);
dummyParsingErrorPrinter.ArgumentParsingErrors.Count.Should().Be(1);
dummyParsingErrorPrinter.ArgumentParsingErrors.First().aliases.Should().BeEquivalentTo("-n");
dummyParsingErrorPrinter.InvalidCommandValueErrors.Should().BeEmpty();
Expand All @@ -86,6 +88,7 @@ public static void IfArgumentWithACustomParserCannotBeParsed_ShouldFailAndPropag
parseSuccess.Should().BeFalse();
called.Should().BeFalse();
dummyParsingErrorPrinter.ArgumentMissingErrors.Should().BeEmpty();
dummyParsingErrorPrinter.InvalidStateErrors.Should().Be(0);
dummyParsingErrorPrinter.ArgumentParsingErrors.Count.Should().Be(1);
dummyParsingErrorPrinter.ArgumentParsingErrors.First().aliases.Should().BeEquivalentTo("-n");
dummyParsingErrorPrinter.InvalidCommandValueErrors.Should().BeEmpty();
Expand Down Expand Up @@ -128,6 +131,7 @@ public static void FailedValidation_ShouldRecommendHelp()
parseSuccess.Should().BeFalse();
called.Should().BeFalse();
dummyParsingErrorPrinter.ArgumentMissingErrors.Should().BeEmpty();
dummyParsingErrorPrinter.InvalidStateErrors.Should().Be(0);
dummyParsingErrorPrinter.ArgumentParsingErrors.Count.Should().Be(1);
dummyParsingErrorPrinter.ArgumentParsingErrors.First().aliases.Should().BeNull();
dummyParsingErrorPrinter.ArgumentParsingErrors.First().helpFlagAliases.Should().BeEquivalentTo("-h", "--help");
Expand Down Expand Up @@ -155,6 +159,7 @@ public static void FailedValidationWithCustomParser_ShouldRecommendHelp()
parseSuccess.Should().BeFalse();
called.Should().BeFalse();
dummyParsingErrorPrinter.ArgumentMissingErrors.Should().BeEmpty();
dummyParsingErrorPrinter.InvalidStateErrors.Should().Be(0);
dummyParsingErrorPrinter.ArgumentParsingErrors.Count.Should().Be(1);
dummyParsingErrorPrinter.ArgumentParsingErrors.First().aliases.Should().BeNull();
dummyParsingErrorPrinter.ArgumentParsingErrors.First().helpFlagAliases.Should().BeEquivalentTo("-h", "--help");
Expand Down Expand Up @@ -182,6 +187,7 @@ public static void InvalidCommandValues_ShouldRecommendHelp()
called.Should().BeFalse();
dummyParsingErrorPrinter.ArgumentMissingErrors.Should().BeEmpty();
dummyParsingErrorPrinter.ArgumentParsingErrors.Should().BeEmpty();
dummyParsingErrorPrinter.InvalidStateErrors.Should().Be(0);
dummyParsingErrorPrinter.InvalidCommandValueErrors.Count.Should().Be(1);
dummyParsingErrorPrinter.InvalidCommandValueErrors.First().aliases.Should().BeEquivalentTo("-n");
dummyParsingErrorPrinter.InvalidCommandValueErrors.First().helpFlagAliases.Should().BeEquivalentTo("-h", "--help");
Expand Down Expand Up @@ -221,9 +227,30 @@ public static void IfTooManyArgumentsAreGivenAndItisDisallows_ShouldRecommendHel
dummyParsingErrorPrinter.ArgumentMissingErrors.Should().BeEmpty();
dummyParsingErrorPrinter.ArgumentParsingErrors.Should().BeEmpty();
dummyParsingErrorPrinter.InvalidCommandValueErrors.Should().BeEmpty();
dummyParsingErrorPrinter.InvalidStateErrors.Should().Be(0);
dummyParsingErrorPrinter.NotAllArgumentsAreUsedErrors.Count.Should().Be(1);
dummyParsingErrorPrinter.NotAllArgumentsAreUsedErrors.First().remainingArguments.Should().BeEquivalentWithSameOrdering("a", "b");
dummyParsingErrorPrinter.NotAllArgumentsAreUsedErrors.First().helpFlagAliases.Should().BeEquivalentTo("-h", "--help");
}

[Fact]
public static void InvalidStates_ShouldRecommendHelp()
{
var args = new[] { "-a" };
var dummyParsingErrorPrinter = new DummyParsingErrorPrinter();
var builder = FluentArgsBuilder.New()
.RegisterDefaultHelpFlags()
.RegisterParsingErrorPrinter(dummyParsingErrorPrinter)
.Invalid();

var parseSuccess = builder.Parse(args);

parseSuccess.Should().BeFalse();
dummyParsingErrorPrinter.ArgumentMissingErrors.Should().BeEmpty();
dummyParsingErrorPrinter.ArgumentParsingErrors.Should().BeEmpty();
dummyParsingErrorPrinter.InvalidCommandValueErrors.Should().BeEmpty();
dummyParsingErrorPrinter.NotAllArgumentsAreUsedErrors.Should().BeEmpty();
dummyParsingErrorPrinter.InvalidStateErrors.Should().Be(1);
}
}
}
8 changes: 8 additions & 0 deletions source/FluentArgs/Exceptions/InvalidStateException.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace FluentArgs.Exceptions
{
using System;

internal class InvalidStateException : Exception
{
}
}
3 changes: 2 additions & 1 deletion source/FluentArgs/Execution/InvalidStep.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using FluentArgs.Exceptions;

internal class InvalidStep : Step
{
Expand All @@ -19,7 +20,7 @@ public override Task Accept(IStepVisitor visitor)

public override Task Execute(State state)
{
throw new Exception("TODO: Invalid state: show helP");
throw new InvalidStateException();
}
}
}
6 changes: 6 additions & 0 deletions source/FluentArgs/FluentArgsDefinition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,12 @@ public async Task<bool> ParseFromState(State state)
InitialStep.ParserSettings.HelpFlag?.Names).ConfigureAwait(false);
return false;
}
catch (InvalidStateException)
{
await InitialStep.ParserSettings!.ParsingErrorPrinter.PrintInvalidStateError(
InitialStep.ParserSettings.HelpFlag?.Names).ConfigureAwait(false);
return false;
}
}

private static IEnumerable<Action<State>> GetPostValidations(ParserSettings? settings)
Expand Down
8 changes: 8 additions & 0 deletions source/FluentArgs/Help/SimpleParsingErrorPrinter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,14 @@ await errorLineWriter
await WriteHelpFlagInfo(helpFlagAliases).ConfigureAwait(false);
}

public async Task PrintInvalidStateError(IReadOnlyCollection<string>? helpFlagAliases)
{
await errorLineWriter
.WriteLine("The used parameter combination is invalid.")
.ConfigureAwait(false);
await WriteHelpFlagInfo(helpFlagAliases).ConfigureAwait(false);
}

public async Task PrintNotAllArgumentsAreUsedError(IReadOnlyCollection<string> remainingArguments, IReadOnlyCollection<string>? helpFlagAliases)
{
await errorLineWriter
Expand Down
3 changes: 3 additions & 0 deletions source/FluentArgs/IParsingErrorPrinter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,8 @@ Task PrintInvalidCommandValueError(
IReadOnlyCollection<string> aliases,
string value,
IReadOnlyCollection<string>? helpFlagAliases);

Task PrintInvalidStateError(
IReadOnlyCollection<string>? helpFlagAliases);
}
}

0 comments on commit f81184f

Please sign in to comment.