Fetch error

class val FetchError
  """
  Error fetching a row from a result set.
  """
  let _kind: FetchErrorKind
  let _diag: DiagChain

  new val create(kind': FetchErrorKind, diag': DiagChain =
    recover val Array[DiagRecord] end) =>
    _kind = kind'
    _diag = diag'

  fun kind(): FetchErrorKind => _kind

  fun string(): String iso^ =>
    recover iso
      let s = String
      s.append("FetchError: ")
      s.append(_kind.string())
      try
        let rec = _diag(0)?
        s.append(" [")
        s.append(rec.sqlstate)
        s.append("]")
      end
      s
    end

  fun unsafe_diag(): DiagChain => _diag

type FetchErrorKind is
  ( DriverFetchError
  | ColumnTooLarge
  | UnsupportedColumnType
  | InvalidUtf8
  | FetchConnectionLost
  | FetchConnectionClosed
  | CursorClosed
  )

primitive DriverFetchError
  """
  General driver-reported fetch failure.
  """
  fun string(): String val => "fetch failed"

primitive ColumnTooLarge
  """
  Column data exceeds maximum size.
  """
  fun string(): String val => "column too large"

primitive UnsupportedColumnType
  """
  Column SQL type has no SqlValue mapping.
  """
  fun string(): String val => "unsupported column type"

primitive InvalidUtf8
  """
  Text column data failed UTF-8 validation.
  """
  fun string(): String val => "invalid UTF-8"

primitive FetchConnectionLost
  """
  Connection lost during fetch.
  """
  fun string(): String val => "connection lost"

primitive FetchConnectionClosed
  """
  Fetch attempted after connection closed.
  """
  fun string(): String val => "connection closed"

primitive CursorClosed
  """
  Fetch attempted on a closed cursor.
  """
  fun string(): String val => "cursor closed"