///|
/// 资源限制的类型。
pub(all) enum LimitKind {
  Depth
  TokenBytes
  Nodes
  TotalBytes
} derive(Eq, Debug, ToJson)

///|
/// UTF-8 解码失败的类别。
pub(all) enum Utf8ErrorKind {
  /// 首字节不在合法范围内(0x80..0xC1、0xF5..0xFF)。
  InvalidLeadByte
  /// 续字节不是 0x80..0xBF。
  InvalidContinuation
  /// 过度长编码,例如用两字节编码 ASCII。
  OverlongEncoding
  /// 编码了 UTF-16 代理项码位(U+D800..U+DFFF)。
  SurrogateCodePoint
  /// 码点超过 U+10FFFF。
  OutOfRange
} derive(Eq, Debug, ToJson)

///|
/// 解析器可以抛出的错误。
///
/// 任何一次抛出都使解析器进入终止状态:不会“尽力恢复”后继续产出事件。
pub(all) suberror ParseError {
  /// 语法不符合 JSON 文法。
  InvalidSyntax(pos~ : Int, expected~ : String, found~ : String)
  /// 输入不是合法 UTF-8。
  InvalidUtf8(pos~ : Int, kind~ : Utf8ErrorKind)
  /// 字符串里出现非法转义或未转义控制字符。
  InvalidEscape(pos~ : Int, detail~ : String)
  /// 数字词法非法。
  InvalidNumber(pos~ : Int, lexeme~ : String)
  /// `\u` 转义非法,或出现孤立代理项。
  InvalidUnicodeEscape(pos~ : Int, detail~ : String)
  /// 同一对象内出现重复键(V1 严格拒绝)。
  DuplicateKey(pos~ : Int, key~ : String, path~ : Path)
  /// 根值之后又出现非空白内容。
  TrailingContent(pos~ : Int)
  /// 触发资源限制。
  LimitExceeded(kind~ : LimitKind, pos~ : Int, allowed~ : Int, actual~ : Int)
  /// 调用顺序错误(例如 finish 之后再次 feed)。
  AlreadyFinished(op~ : String)
  /// 限制参数本身不合法。
  InvalidLimits(detail~ : String)
} derive(Eq, Debug, ToJson)