using StabilityMatrix.Core.Processes; namespace StabilityMatrix.Core.Models.Progress; public record struct ProgressReport { /// /// Progress value as percentage between 0 and 1. /// public double? Progress { get; init; } = 0; /// /// Current progress count. /// public ulong? Current { get; init; } = 0; /// /// Total progress count. /// public ulong? Total { get; init; } = 0; public string? Title { get; init; } public string? Message { get; init; } public ProcessOutput? ProcessOutput { get; init; } public bool IsIndeterminate { get; init; } = false; public float Percentage => (float)Math.Ceiling(Math.Clamp(Progress ?? 0, 0, 1) * 100); public ProgressType Type { get; init; } = ProgressType.Generic; public ProgressReport( double progress, string? title = null, string? message = null, bool isIndeterminate = false, ProgressType type = ProgressType.Generic ) { Progress = progress; Title = title; Message = message; IsIndeterminate = isIndeterminate; Type = type; } public ProgressReport( ulong current, ulong total, string? title = null, string? message = null, bool isIndeterminate = false, ProgressType type = ProgressType.Generic ) { Current = current; Total = total; Progress = (double)current / total; Title = title; Message = message; IsIndeterminate = isIndeterminate; Type = type; } public ProgressReport( int current, int total, string? title = null, string? message = null, bool isIndeterminate = false, ProgressType type = ProgressType.Generic ) { if (current < 0) throw new ArgumentOutOfRangeException(nameof(current), "Current progress cannot negative."); if (total < 0) throw new ArgumentOutOfRangeException(nameof(total), "Total progress cannot be negative."); Current = (ulong)current; Total = (ulong)total; Progress = (double)current / total; Title = title; Message = message; IsIndeterminate = isIndeterminate; Type = type; } public ProgressReport( ulong current, string? title = null, string? message = null, ProgressType type = ProgressType.Generic ) { Current = current; Title = title; Message = message; IsIndeterminate = true; Type = type; } // Implicit conversion from action }