using System; using System.Threading; using System.Threading.Tasks; namespace Wabbajack.RateLimiter; public class Job : IJob, IDisposable { public ulong ID { get; internal init; } public string Description { get; internal init; } public bool Started { get; internal set; } public IResource Resource { get; init; } private bool _isFinished = false; public void Dispose() { if (_isFinished) return; _isFinished = true; Resource.Finish(this); } public long Current { get; internal set; } public long? Size { get; set; } public async ValueTask Report(int processedSize, CancellationToken token) { await Resource.Report(this, processedSize, token); Current += processedSize; OnUpdate?.Invoke(this, (Percent.FactoryPutInRange(Current, Size ?? 1), Current)); } public void ReportNoWait(int processedSize) { Resource.ReportNoWait(this, processedSize); OnUpdate?.Invoke(this, (Percent.FactoryPutInRange(Current, Size ?? 1), Current)); } public event EventHandler<(Percent Progress, long Processed)> OnUpdate; }