feat(configmanager): add DiffService with tests

This commit is contained in:
Joseph Doherty
2026-01-19 17:44:28 -05:00
parent c8f3c0060d
commit 68da728cdf
3 changed files with 276 additions and 0 deletions
@@ -0,0 +1,65 @@
using DiffPlex;
using DiffPlex.DiffBuilder;
using DiffPlex.DiffBuilder.Model;
namespace JdeScoping.ConfigManager.Services;
/// <summary>
/// Service for generating diffs between text content.
/// </summary>
public class DiffService : IDiffService
{
public DiffResult GenerateDiff(string original, string modified)
{
var diffBuilder = new InlineDiffBuilder(new Differ());
var diff = diffBuilder.BuildDiffModel(original, modified);
var lines = new List<DiffLine>();
int oldLineNum = 1;
int newLineNum = 1;
int insertions = 0;
int deletions = 0;
foreach (var line in diff.Lines)
{
var diffLine = new DiffLine
{
Text = line.Text,
Type = line.Type switch
{
ChangeType.Inserted => DiffLineType.Added,
ChangeType.Deleted => DiffLineType.Removed,
_ => DiffLineType.Unchanged
},
OldLineNumber = line.Type == ChangeType.Inserted ? null : oldLineNum,
NewLineNumber = line.Type == ChangeType.Deleted ? null : newLineNum
};
lines.Add(diffLine);
switch (line.Type)
{
case ChangeType.Inserted:
newLineNum++;
insertions++;
break;
case ChangeType.Deleted:
oldLineNum++;
deletions++;
break;
default:
oldLineNum++;
newLineNum++;
break;
}
}
return new DiffResult
{
HasChanges = insertions > 0 || deletions > 0,
Lines = lines,
Insertions = insertions,
Deletions = deletions
};
}
}
@@ -0,0 +1,38 @@
namespace JdeScoping.ConfigManager.Services;
/// <summary>
/// Represents a line in a diff output.
/// </summary>
public class DiffLine
{
public required int? OldLineNumber { get; init; }
public required int? NewLineNumber { get; init; }
public required string Text { get; init; }
public required DiffLineType Type { get; init; }
}
public enum DiffLineType
{
Unchanged,
Added,
Removed
}
/// <summary>
/// Result of a diff operation.
/// </summary>
public class DiffResult
{
public bool HasChanges { get; init; }
public List<DiffLine> Lines { get; init; } = [];
public int Insertions { get; init; }
public int Deletions { get; init; }
}
/// <summary>
/// Service for generating diffs between text content.
/// </summary>
public interface IDiffService
{
DiffResult GenerateDiff(string original, string modified);
}