Skip to content

Commit

Permalink
Enum parser, variable case sensitive string parser (#126)
Browse files Browse the repository at this point in the history
* Enum parser

* API Consistency

* Tests

* Move enum tests to StringParserTests
  • Loading branch information
RomanSoloweow committed Apr 13, 2022
1 parent 14820a0 commit ae1153e
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 0 deletions.
26 changes: 26 additions & 0 deletions Pidgin.Tests/StringParserTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2506,5 +2506,31 @@ public void TestCurrentPos()
AssertSuccess(parser.Parse("f"), SourcePosDelta.Zero, false); // it should backtrack
}
}

internal enum TestEnum
{
Value1 = 0,
Value2,
Value3
}

[Fact]
public void EnumParseTest()
{
const string value1 = "value1";
var result = Parser.Enum<TestEnum>().Parse(value1);
Assert.False(result.Success);

result = Parser.CIEnum<TestEnum>().Parse(value1);
Assert.Equal(TestEnum.Value1, result.Value);

const string value2 = "Value2";
result = Parser.Enum<TestEnum>().Parse(value2);
Assert.Equal(TestEnum.Value2, result.Value);

result = Parser.CIEnum<TestEnum>().Parse(value2);
Assert.Equal(TestEnum.Value2, result.Value);

}
}
}
40 changes: 40 additions & 0 deletions Pidgin/Parser.Enum.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Linq;

namespace Pidgin
{
public static partial class Parser
{
/// <summary>
/// Creates a parser that parses and returns one of enum values
/// </summary>
/// <typeparam name="TEnum">Enum type</typeparam>
/// <returns>A parser that parses and returns one of enum values</returns>
public static Parser<char, TEnum> Enum<TEnum>()
where TEnum : struct, Enum
{
return OneOf(System.Enum.GetNames<TEnum>()
.Select(String)
.Select(Try))
.Select(System.Enum.Parse<TEnum>)
.Labelled("enum " + typeof(TEnum).Name);
}

/// <summary>
/// Creates a parser that parses and returns one of enum values, in a case insensitive manner.
/// </summary>
/// <typeparam name="TEnum">Enum type</typeparam>
/// <returns>A parser that parses and returns one of enum values</returns>
public static Parser<char, TEnum> CIEnum<TEnum>()
where TEnum : struct, Enum
{
return OneOf(System.Enum.GetNames<TEnum>()
.Select(CIString)
.Select(Try))
.Select(x=> System.Enum.Parse<TEnum>(x, true))
.Labelled("enum " + typeof(TEnum).Name);
}

}
}

0 comments on commit ae1153e

Please sign in to comment.