Skip to content

Instantly share code, notes, and snippets.

using SharpDiff.FileStructure.Numstat;
using OMetaSharp;
ometa GitNumstatParser : Parser {
FileStats = Number:adds '\t' Number:subs -> { new FileStats(adds.As<int>(), subs.As<int>()) }
}
[Test]
public void ParsesFilename()
{
var result = Parse<string>("anotherFile.txt", x => x.Filename);
Assert.That(result, Is.EqualTo("anotherFile.txt"));
}
using SharpDiff.FileStructure.Numstat;
using OMetaSharp;
ometa GitNumstatParser : Parser {
FileStats = Number:adds '\t' Number:subs -> { new FileStats(adds.As<int>(), subs.As<int>()) },
Filename = LetterOrDigit+:name '.' LetterOrDigit+:ext -> { name.As<string>() + "." + ext.As<string>() }
}
[Test]
public void ParsesFullFileLine()
{
var result = Parse<FileStats>("3\t8\tmyFile.txt\r\n", x => x.FileStats);
Assert.That(result.Additions, Is.EqualTo(3));
Assert.That(result.Subtractions, Is.EqualTo(8));
Assert.That(result.Filename, Is.EqualTo("myFile.txt"));
}
public class FileStats
{
public FileStats(int additions, int subtractions, string filename)
{
Additions = additions;
Subtractions = subtractions;
Filename = filename;
}
public int Additions { get; private set; }
ometa GitNumstatParser : Parser {
FileStats = LineStats:lines '\t' Filename:name NewLine -> { new FileStats(lines[0].As<int>(), lines[1].As<int>(), name.As<string>()) },
LineStats = Number:adds '\t' Number:subs -> { adds, subs },
Filename = LetterOrDigit+:name '.' LetterOrDigit+:ext -> { name.As<string>() + "." + ext.As<string>() },
NewLine = '\r' '\n'
}
[Test]
public void CanParseMultipleLines()
{
var result = ParseList<FileStats>(
"3\t8\tfile.txt\r\n" +
"5\t1\tanotherFile.txt\r\n", x => x.FullFile);
Assert.That(result.Count, Is.EqualTo(2));
Assert.That(result[0].Filename, Is.EqualTo("file.txt"));
Assert.That(result[0].Additions, Is.EqualTo(3));
protected IList<T> ParseList<T>(string text, Func<GitNumstatParser, Rule<char>> ruleFetcher)
{
return new List<T>(Grammars.ParseWith(text, ruleFetcher).ToIEnumerable<T>());
}
FullFile = FileStats+:files -> { files },
Filename = LetterOrDigit+:name '.' LetterOrDigit+:ext -> { name.As<string>() + "." + ext.As<string>() }
| LetterOrDigit+:name -> { name.As<string>() },