///|
/// JSONata 错误类型层级。
///
/// 单一 suberror,含 5 个变体。调用方用一次 `raise JsonataError` 即可传播所有错误,
/// 需要精细处理时用模式匹配区分变体。每个变体携带结构化字段,便于定位。
///
/// `code` 字段携带 JSONata 官方错误码(如 `T2001`、`S0101`),用于与官方
/// 测试集做错误码匹配。未设置时为 `None`。
pub(all) suberror JsonataError {
  SyntaxError(
    message~ : String,
    position~ : Int?,
    token~ : String?,
    code~ : String?
  )
  RuntimeError(message~ : String, code~ : String?)
  TypeError(
    message~ : String,
    expected~ : String?,
    actual~ : String?,
    code~ : String?
  )
  SignatureError(message~ : String, func~ : String?, code~ : String?)
  GuardrailError(message~ : String, limit~ : String?, code~ : String?)
} derive(Debug, Eq)

///|
/// 便捷构造语法错误。
pub fn syntax_error(
  message : String,
  position? : Int? = None,
  token? : String? = None,
  code? : String? = None,
) -> JsonataError {
  JsonataError::SyntaxError(message~, position~, token~, code~)
}

///|
/// 便捷构造运行时错误。
pub fn runtime_error(message : String, code? : String? = None) -> JsonataError {
  JsonataError::RuntimeError(message~, code~)
}

///|
/// 便捷构造类型错误。
pub fn type_error(
  message : String,
  expected? : String? = None,
  actual? : String? = None,
  code? : String? = None,
) -> JsonataError {
  JsonataError::TypeError(message~, expected~, actual~, code~)
}

///|
/// 便捷构造签名错误。
pub fn signature_error(
  message : String,
  func? : String? = None,
  code? : String? = None,
) -> JsonataError {
  JsonataError::SignatureError(message~, func~, code~)
}

///|
/// 便捷构造护栏错误。
pub fn guardrail_error(
  message : String,
  limit? : String? = None,
  code? : String? = None,
) -> JsonataError {
  JsonataError::GuardrailError(message~, limit~, code~)
}

///|
/// 提取错误码(若存在)。
pub fn JsonataError::error_code(self : JsonataError) -> String? {
  match self {
    SyntaxError(code~, ..) => code
    RuntimeError(code~, ..) => code
    TypeError(code~, ..) => code
    SignatureError(code~, ..) => code
    GuardrailError(code~, ..) => code
  }
}