using System; using System.Collections.Generic; using Newtonsoft.Json.Linq; namespace ShrinkDataSaver { public static class MigrationChain { private static readonly SortedDictionary Migrations = new(); private struct Migration { public int ToVersion; public Func Migrate; } public static void Register(int fromVersion, int toVersion, Func migrate) { if (fromVersion >= toVersion) throw new ArgumentException( $"[ShrinkDataSaver] fromVersion({fromVersion}) 必须小于 toVersion({toVersion})"); Migrations[fromVersion] = new Migration { ToVersion = toVersion, Migrate = migrate }; } internal static (JObject data, int finalVersion) Apply(JObject data, int currentVersion, int targetVersion) { var version = currentVersion; var backup = (JObject)data.DeepClone(); while (version < targetVersion) { if (!Migrations.TryGetValue(version, out var migration)) { ShrinkDataSaverPlatform.Warning($"[ShrinkDataSaver] 未找到 v{version} → v{version + 1} 的迁移逻辑,数据可能不完整。"); break; } try { var fromV = version; data = migration.Migrate(data) ?? data; version = migration.ToVersion; ShrinkDataSaverPlatform.Info($"[ShrinkDataSaver] 存档已迁移 v{fromV} → v{version}"); } catch (Exception e) { ShrinkDataSaverPlatform.Error( $"[ShrinkDataSaver] 迁移 v{version} → v{migration.ToVersion} 失败: {e.Message},已回滚至 v{currentVersion}"); return (backup, currentVersion); } } return (data, version); } internal static void Clear() => Migrations.Clear(); } }