///|
/// format 断言检查(仅在 `assert_format` 开启时生效)。
/// 返回 `None` 表示引擎不认识该 format——按 2020-12 规范,
/// 未知 format 一律视为 annotation,不断言。
fn check_format(f : String, s : String) -> Bool? {
  match f {
    "email" => Some(is_email(s))
    "uuid" => Some(is_uuid(s))
    "ipv4" => Some(is_ipv4(s))
    _ => None
  }
}

///|
fn is_hex_digit(c : Char) -> Bool {
  (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')
}

///|
/// 简化版 email 检查:恰好一个 `@`,两端非空、无空白,domain 至少一个点。
/// (完整的 RFC 5322 语法验证不在 v0 目标内。)
fn is_email(s : String) -> Bool {
  let n = s.length()
  let chars = s.to_array()
  let mut at = -1
  for i in 0..= 0 {
        return false
      }
      at = i
    } else if c == ' ' || c == '\t' || c == '\n' || c == '\r' {
      return false
    }
  }
  if at <= 0 || at >= n - 1 {
    return false
  }
  let mut dots = 0
  for i in (at + 1)..= 1 && chars[at + 1] != '.' && chars[n - 1] != '.'
}

///|
fn is_uuid(s : String) -> Bool {
  if s.length() != 36 {
    return false
  }
  let chars = s.to_array()
  for i in 0..<36 {
    let c = chars[i]
    if i == 8 || i == 13 || i == 18 || i == 23 {
      if c != '-' {
        return false
      }
    } else if !is_hex_digit(c) {
      return false
    }
  }
  true
}

///|
fn is_ipv4(s : String) -> Bool {
  let chars = s.to_array()
  let n = chars.length()
  let mut octets = 0
  let mut val = 0
  let mut digits = 0
  for i in 0..= '0' && c <= '9' {
      val = val * 10 + (c.to_int() - '0'.to_int())
      digits += 1
      if digits > 3 || val > 255 {
        return false
      }
    } else if c == '.' {
      if digits == 0 {
        return false
      }
      octets += 1
      val = 0
      digits = 0
    } else {
      return false
    }
  }
  octets == 3 && digits > 0
}