using System; using System.Collections.Generic; using System.Linq; namespace NHSE.Core; /// /// Carries out a batch edit and contains information summarizing the results. /// public abstract class BatchProcessor(BatchMutator Mutator) where T : class { private int Modified { get; set; } private int Iterated { get; set; } private int Failed { get; set; } protected abstract bool CanModify(T item); protected abstract bool Finalize(T item); /// /// Tries to modify the . /// /// Object to modify. /// Filters which must be satisfied prior to any modifications being made. /// Modifications to perform on the item. /// Result of the attempted modification. public bool Process(T item, IEnumerable filters, IEnumerable modifications) { if (!CanModify(item)) return false; var result = Mutator.Modify(item, filters, modifications); if (result != ModifyResult.Invalid) Iterated++; if (result == ModifyResult.Error) Failed++; if (result != ModifyResult.Modified) return false; Finalize(item); Modified++; return true; } /// /// Gets a message indicating the overall result of all modifications performed across multiple Batch Edit jobs. /// /// Collection of modifications. /// Friendly (multi-line) string indicating the result of the batch edits. public string GetEditorResults(ICollection sets) { if (sets.Count == 0) return "No instructions present."; int ctr = Modified / sets.Count; int len = Iterated / sets.Count; string maybe = sets.Count == 1 ? string.Empty : "~"; string result = $"Success: {maybe}{ctr}/{len}"; if (Failed > 0) result += Environment.NewLine + maybe + $"Failed: {Failed} not processed."; return result; } public void Execute(ReadOnlySpan lines, IEnumerable data) { var sets = StringInstructionSet.GetBatchSets(lines).ToArray(); foreach (var pk in data) { foreach (var set in sets) Process(pk, set.Filters, set.Instructions); } } protected abstract void Initialize(ReadOnlySpan sets); public void Process(ReadOnlySpan sets, IReadOnlyList items) { Initialize(sets); foreach (var s in sets) { foreach (var i in items) Process(i, s.Filters, s.Instructions); } } }