///|
pub fn Diagnostic::to_text(self : Diagnostic) -> String {
  let level = match self.severity {
    Error => "error"
    Warning => "warning"
  }
  "\{self.span.source}:\{self.span.line}:\{self.span.column}: \{level}[\{self.code}]: \{self.message}"
}

///|
pub fn has_errors(diagnostics : ArrayView[Diagnostic]) -> Bool {
  diagnostics.any(item => item.severity is Error)
}

///|
pub fn Definition::kind(self : Definition) -> String {
  match self {
    Const(..) => "const"
    Typedef(..) => "typedef"
    Enum(..) => "enum"
    Struct(..) => "struct"
    Union(..) => "union"
    Exception(..) => "exception"
    Service(..) => "service"
  }
}

///|
/// Produces a compact human-readable schema outline for CLIs and build logs.
pub fn Schema::to_outline(self : Schema) -> String {
  let output = StringBuilder()
  output.write_string("schema \{self.source}\n")
  output.write_string("  headers: \{self.headers.length()}\n")
  output.write_string("  definitions: \{self.definitions.length()}\n")
  for definition in self.definitions {
    output.write_string("    \{definition.kind()} \{definition.name()}\n")
  }
  output.to_string()
}