Bind error

class val BindError
  """
  Error binding a parameter value.
  """
  let _kind: BindErrorKind
  let _param_index: ParamIndex
  let _diag: DiagChain

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

  fun kind(): BindErrorKind => _kind
  fun param_index(): ParamIndex => _param_index

  fun string(): String iso^ =>
    recover iso
      String
        .> append("BindError: ")
        .> append(_kind.string())
        .> append(" (param ")
        .> append(_param_index.apply().string())
        .> append(")")
    end

  fun unsafe_diag(): DiagChain => _diag

type BindErrorKind is
  ( ParamIndexOutOfRange
  | ParamTooLarge
  | DriverRejected
  | BindStatementClosed
  | BindConnectionClosed
  )

primitive ParamIndexOutOfRange
  """
  Parameter index is zero or exceeds param count.
  """
  fun string(): String val => "index out of range"

primitive ParamTooLarge
  """
  Parameter value exceeds maximum size.
  """
  fun string(): String val => "parameter too large"

primitive DriverRejected
  """
  ODBC driver rejected the bind call.
  """
  fun string(): String val => "driver rejected"

primitive BindStatementClosed
  """
  Bind attempted on a closed statement.
  """
  fun string(): String val => "statement closed"

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