using System.Text; namespace NubLang.Diagnostics; public class Diagnostic { public class DiagnosticBuilder { private readonly DiagnosticSeverity _severity; private readonly string _message; private string? _help; public DiagnosticBuilder(DiagnosticSeverity severity, string message) { _severity = severity; _message = message; } public DiagnosticBuilder WithHelp(string help) { _help = help; return this; } public Diagnostic Build() => new(_severity, _message, _help); } public static DiagnosticBuilder Error(string message) => new(DiagnosticSeverity.Error, message); public static DiagnosticBuilder Warning(string message) => new(DiagnosticSeverity.Warning, message); public static DiagnosticBuilder Info(string message) => new(DiagnosticSeverity.Info, message); public DiagnosticSeverity Severity { get; } public string Message { get; } public string? Help { get; } private Diagnostic(DiagnosticSeverity severity, string message, string? help) { Severity = severity; Message = message; Help = help; } public string FormatANSI() { var sb = new StringBuilder(); var severityText = GetSeverityText(Severity); sb.Append(severityText); sb.Append(": "); sb.Append(ConsoleColors.Colorize(Message, ConsoleColors.BrightWhite)); if (!string.IsNullOrEmpty(Help)) { sb.AppendLine(); sb.Append(ConsoleColors.Colorize($"help: {Help}", ConsoleColors.Cyan)); } return sb.ToString(); } private static string GetSeverityText(DiagnosticSeverity severity) { return severity switch { DiagnosticSeverity.Error => ConsoleColors.Colorize("error", ConsoleColors.Bold + ConsoleColors.Red), DiagnosticSeverity.Warning => ConsoleColors.Colorize("warning", ConsoleColors.Bold + ConsoleColors.Yellow), DiagnosticSeverity.Info => ConsoleColors.Colorize("info", ConsoleColors.Bold + ConsoleColors.Blue), _ => throw new ArgumentOutOfRangeException(nameof(severity), severity, "Unknown diagnostic severity") }; } } public enum DiagnosticSeverity { Info, Warning, Error }