///|
pub(all) struct ParseLimits {
  max_source_units : Int
  max_lines : Int
} derive(Eq, Debug)

///|
pub fn default_limits() -> ParseLimits {
  { max_source_units: 1048576, max_lines: 50000 }
}

///|
fn budget_diagnostic(source : String, limits : ParseLimits) -> Diagnostic? {
  if limits.max_source_units < 0 || limits.max_lines < 0 {
    return Some(
      diagnostic("LIMIT001", "limits must be nonnegative", span(0, 0, 1, 1)),
    )
  }
  if source.length() > limits.max_source_units {
    return Some(
      diagnostic(
        "LIMIT002",
        "source exceeds UTF-16 unit budget",
        span(0, source.length(), 1, 1),
      ),
    )
  }
  None
}