using System.Text.Json; namespace Zcbot.WindowsNode; internal enum JobRecoveryAction { ResumeExecution, ResumeOutputUpload, ReplayTerminal, None, } internal sealed record JobRecoveryDecision( RecoverableJob Job, JobRecoveryAction Action); internal sealed class JobRecoveryService(JobRepository repository) { internal IReadOnlyList Scan() => repository.ReadRecoverableJobs() .Select(job => new JobRecoveryDecision(job, Decide(job))) .ToArray(); internal static JobRecoveryAction Decide(RecoverableJob job) { if (job.Terminal is not JsonElement terminal) { return JobRecoveryAction.ResumeExecution; } if (terminal.GetProperty("status").GetString() != JobStateMachine.Succeeded) { return JobRecoveryAction.ReplayTerminal; } return job.UploadComplete || job.CloudTerminal ? JobRecoveryAction.None : JobRecoveryAction.ResumeOutputUpload; } }