// 移植自 github.com/milvus-io/milvus client/internal/merr (Apache-2.0)
// Copyright (c) LF AI & Data Foundation

///|
/// `Status` 是否代表成功,对应上游 `merr.Ok`。
///
/// 两个字段都要满足:`error_code == Success` 且 `code == 0`。
/// `None` 视为成功(上游对 `nil` Status 返回 true)。
pub fn is_ok(status : @common.Status?) -> Bool {
  match status {
    None => true
    Some(s) => s.error_code == @common.ErrorCode::Success && s.code == 0
  }
}

///|
/// 成功状态,对应上游 `merr.Success`。
pub fn success(reason? : String = "") -> @common.Status {
  @common.Status::{
    error_code: @common.ErrorCode::Success,
    reason,
    code: 0,
    retriable: false,
    detail: "",
    extra_info: {},
  }
}

///|
/// Milvus `Status` → `MerError`,对应上游 `merr.Error`。
///
/// 双轨码的补齐规则与上游完全一致:
/// - `code == 0` 时用 legacy 推导 modern 码
/// - legacy 为 `Success` 时用 modern 码反推 legacy
///
/// 成功状态返回 `None`(上游返回 `nil`)。`reason` 与 `detail` 都过一遍脱敏。
pub fn from_status(status : @common.Status) -> MerError? {
  if is_ok(Some(status)) {
    return None
  }
  let code = if status.code == 0 {
    modern_code_from_legacy(status.error_code)
  } else {
    status.code
  }
  let legacy = if status.error_code == @common.ErrorCode::Success {
    legacy_code_from_modern(code)
  } else {
    status.error_code
  }
  Some(
    RpcError(
      code~,
      legacy_code=legacy,
      message=redact(status.reason),
      detail=redact(status.detail),
      retriable=status.retriable,
      input=status.extra_info.get(input_error_flag_key) == Some("true"),
    ),
  )
}

///|
/// 把 `MerError?` 还原成 `Status`,对应上游 `merr.Status`。
///
/// 主要给 mock 与测试用;`None` 返回成功 `Status`。
pub fn to_status(err : MerError?) -> @common.Status {
  match err {
    None => success()
    Some(RpcError(code~, legacy_code~, message~, detail~, retriable~, input~)) =>
      @common.Status::{
        error_code: legacy_code,
        reason: message,
        code,
        retriable,
        detail,
        extra_info: if input {
          Map::from_array([(input_error_flag_key, "true")])
        } else {
          {}
        },
      }
  }
}