using System; namespace MultiWheelC.TrajectoryPlanning.EMPlanner; /// Immutable longitudinal solve result; only successful statuses may expose a candidate profile. public sealed class LongitudinalPlanningResult { public LongitudinalPlanningResult(EmPlanningStatus status, LongitudinalCandidate candidate, string failureReason) { if (!Enum.IsDefined(typeof(EmPlanningStatus), status)) throw new ArgumentOutOfRangeException(nameof(status)); bool successful = status == EmPlanningStatus.Success || status == EmPlanningStatus.SuccessWithFallback; if (successful && candidate == null) throw new ArgumentException("Successful longitudinal results require a candidate.", nameof(candidate)); if (!successful && candidate != null) throw new ArgumentException("Failed longitudinal results cannot expose a candidate.", nameof(candidate)); Status = status; Candidate = candidate == null ? null : new LongitudinalCandidate(candidate.KnotTimes, candidate.S, candidate.U, candidate.A, candidate.J); FailureReason = failureReason ?? string.Empty; } public EmPlanningStatus Status { get; } public LongitudinalCandidate Candidate { get; } public string FailureReason { get; } }