feat(configmanager): add DiffService with tests
This commit is contained in:
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user