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

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

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

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

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

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