// SPDX-License-Identifier: Apache-2.0
// Shared lexical bounds for the documented geometry ingestion profile.

///|
fn profile_integer_token(raw : StringView) -> Bool {
  if raw.length() == 0 {
    return false
  }
  let start = if raw.code_unit_at(0) == 43 || raw.code_unit_at(0) == 45 {
    1
  } else {
    0
  }
  if start == raw.length() {
    return false
  }
  for i = start; i < raw.length(); i = i + 1 {
    let c = raw.code_unit_at(i)
    if c < 48 || c > 57 {
      return false
    }
  }
  true
}

///|
fn profile_decimal_int(raw : StringView, minimum : Int) -> Result[Int, String] {
  if !profile_integer_token(raw) {
    return Err("需要十进制整数字面量:\{raw}")
  }
  let value = @string.parse_int(raw) catch {
    _ =>
      return Err("整数超出当前实现的 32 位有符号范围:\{raw}")
  }
  if value < minimum {
    return Err("整数小于允许下界 \{minimum}:\{raw}")
  }
  Ok(value)
}

///|
fn ply_integer_range(ty : StringView) -> (Double, Double)? {
  match ty {
    "char" | "int8" => Some((-128.0, 127.0))
    "uchar" | "uint8" => Some((0.0, 255.0))
    "short" | "int16" => Some((-32768.0, 32767.0))
    "ushort" | "uint16" => Some((0.0, 65535.0))
    "int" | "int32" => Some((-2147483648.0, 2147483647.0))
    "uint" | "uint32" => Some((0.0, 4294967295.0))
    _ => None
  }
}