///|
pub(all) enum Severity {
  Error
  Warning
  Info
} derive(Eq, Debug)

///|
pub(all) struct Diagnostic {
  code : String
  severity : Severity
  message : String
  file : String
  span : @source.Span
  rule : String
  notes : Array[String]
} derive(Eq, Debug)

///|
pub fn Diagnostic::new(
  code : String,
  severity : Severity,
  message : String,
  span : @source.Span,
) -> Diagnostic {
  { code, severity, message, file: "", span, rule: code, notes: [] }
}

///|
pub fn Diagnostic::with_file(self : Diagnostic, file : String) -> Diagnostic {
  { ..self, file, }
}

///|
pub fn Severity::label(self : Severity) -> String {
  match self {
    Error => "error"
    Warning => "warning"
    Info => "info"
  }
}

///|
pub fn Diagnostic::at_line_col(
  self : Diagnostic,
  source : @source.SourceFile,
) -> (Int, Int) {
  source.line_col(self.span.start)
}