// mooncassette/sanitize —— 已弃用的公开项。
//
// 0.10.0 起把「对外承诺的 API」与「碰巧可见的内部实现」分开。下面两个名字都属于
// 后者的两种典型:
//
//   * `is_sensitive_key` 把**判定口径**暴露成了 API —— 口径一改就是破坏性变更,
//     而使用方真正要的是「按策略脱敏」这个结果。
//   * `sanitize_interaction` 是 `sanitize_cassette` 的**中间步骤**:单独脱敏一条
//     记录看似有用,但它绕开了 `meta` 的处理约定,容易让使用方拼出
//     「一半脱敏、一半没脱敏」的文件。
//
// 保留它们是为了旧版本的使用方不会突然编译不过,预计在未来大版本移除。
// 两者**仍被本包使用**(见 `sanitize_json` / `sanitize_cassette`),因此
// `skip_current_package=true` 是刻意的:弃用约束的是使用方。

///|
/// 判断某个键名是否需要脱敏(精确名匹配,或命中 `_key` / `_token` 一类后缀)。
///
/// 这是脱敏的**内部判据**,不是对外契约:把它公开,等于承诺「键名怎么算敏感」
/// 这个口径永不改变,而它显然会随实践调整(新增后缀、改写匹配规则)。
///
/// 对外请用 `sanitize_cassette` / `sanitize_json`:给它们策略,拿回脱敏后的结果,
/// 不需要、也不应该关心中间的判定过程。
#deprecated("内部实现细节:请用 `sanitize_json` / `sanitize_cassette`;本函数不在对外承诺范围内", skip_current_package=true)
pub fn is_sensitive_key(key : String, policy : SanitizePolicy) -> Bool {
  let lowered = ascii_lowercase(key)
  for i = 0; i < policy.exact_keys.length(); i = i + 1 {
    if lowered == ascii_lowercase(policy.exact_keys[i]) {
      return true
    }
  }
  for i = 0; i < policy.key_suffixes.length(); i = i + 1 {
    let suffix = ascii_lowercase(policy.key_suffixes[i])
    if lowered.length() >= suffix.length() && lowered.has_suffix(suffix) {
      return true
    }
  }
  false
}

///|
/// 脱敏一条交互记录(请求与响应各走一遍各自的脱敏路径)。
///
/// 它是 `sanitize_cassette` 的内部一步。单独暴露会诱使使用方自己遍历记录 ——
/// 而 `sanitize_cassette` 同时约定了「`meta` 原样保留」这条规则,逐条脱敏会
/// 悄悄丢掉它,产出边界不一致的文件。
///
/// 对外请用 `sanitize_cassette`:一次处理整份录制,`version` 与 `meta` 的处置
/// 由库负责。
#deprecated("内部实现细节:请用 `sanitize_cassette`;本函数不在对外承诺范围内", skip_current_package=true)
pub fn sanitize_interaction(
  interaction : @core.Interaction,
  policy : SanitizePolicy,
) -> @core.Interaction {
  {
    request: sanitize_request(interaction.request, policy),
    response: sanitize_response(interaction.response, policy),
  }
}