ResourceYamlMigrationService.cs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. namespace RackPeek.Domain.Persistence.Yaml;
  2. public interface IResourceYamlMigrationService {
  3. Task<YamlRoot> DeserializeAsync(
  4. string yaml,
  5. Func<string, Task>? preMigrationAction = null,
  6. Func<YamlRoot, Task>? postMigrationAction = null);
  7. }
  8. public sealed class ResourceYamlMigrationService(
  9. RackPeekConfigMigrationDeserializer deserializer)
  10. : IResourceYamlMigrationService {
  11. private static readonly int _currentSchemaVersion =
  12. RackPeekConfigMigrationDeserializer.ListOfMigrations.Count;
  13. public async Task<YamlRoot> DeserializeAsync(
  14. string yaml,
  15. Func<string, Task>? preMigrationAction = null,
  16. Func<YamlRoot, Task>? postMigrationAction = null) {
  17. if (string.IsNullOrWhiteSpace(yaml))
  18. return new YamlRoot();
  19. var version = deserializer.GetSchemaVersion(yaml);
  20. if (version > _currentSchemaVersion)
  21. throw new InvalidOperationException(
  22. $"Config schema version {version} is newer than this application supports ({_currentSchemaVersion}).");
  23. YamlRoot? root;
  24. if (version < _currentSchemaVersion) {
  25. if (preMigrationAction != null)
  26. await preMigrationAction(yaml);
  27. root = await deserializer.Deserialize(yaml) ?? new YamlRoot();
  28. if (postMigrationAction != null)
  29. await postMigrationAction(root);
  30. }
  31. else {
  32. root = await deserializer.Deserialize(yaml);
  33. }
  34. return root ?? new YamlRoot();
  35. }
  36. }