79 lines
2.3 KiB
C#
79 lines
2.3 KiB
C#
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
|
|
} |