Skip to content

Commit 2cb04da

Browse files
committed
Add XDelimitedBy for better error message on failure.
1 parent 50d3199 commit 2cb04da

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

src/Sprache.Tests/ParseTests.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
23
using System.Linq;
34
using NUnit.Framework;
45

@@ -357,6 +358,17 @@ public void CanParseSequence()
357358
Assert.IsTrue(r.Remainder.AtEnd);
358359
}
359360

361+
[Test]
362+
public void FailGracefullyOnSequence()
363+
{
364+
var sequence = Parse.Char('a').XDelimitedBy(Parse.Char(','));
365+
AssertParser.FailsWith(sequence, "a,a,b", result =>
366+
{
367+
StringAssert.Contains("unexpected 'b'", result.Message);
368+
CollectionAssert.Contains(result.Expectations, "a");
369+
});
370+
}
371+
360372
[Test]
361373
public void CanParseContained()
362374
{

src/Sprache/Parse.Sequence.cs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,28 @@ from item in parser
2828
select head.Concat(tail);
2929
}
3030

31+
/// <summary>
32+
/// Fails on the first itemParser failure, if it reads at least one character.
33+
/// </summary>
34+
/// <param name="itemParser"></param>
35+
/// <param name="delimiter"></param>
36+
/// <typeparam name="T"></typeparam>
37+
/// <typeparam name="U"></typeparam>
38+
/// <returns></returns>
39+
/// <exception cref="ArgumentNullException"></exception>
40+
public static Parser<IEnumerable<T>> XDelimitedBy<T, U>(this Parser<T> itemParser, Parser<U> delimiter)
41+
{
42+
if (itemParser == null) throw new ArgumentNullException("itemParser");
43+
if (delimiter == null) throw new ArgumentNullException("delimiter");
44+
45+
return from head in itemParser.Once()
46+
from tail in
47+
(from separator in delimiter
48+
from item in itemParser
49+
select item).XMany()
50+
select head.Concat(tail);
51+
}
52+
3153
/// <summary>
3254
///
3355
/// </summary>

0 commit comments

Comments
 (0)