///|
let sizing_commands : Array[String] = [
  "\\tiny", "\\sixptsize", "\\scriptsize", "\\footnotesize", "\\small", "\\normalsize",
  "\\large", "\\Large", "\\LARGE", "\\huge", "\\Huge",
]

///|
fn sizing_index(func_name : String) -> Int raise ParseFailure {
  for index, command in sizing_commands {
    guard command == func_name else { continue }
    return index + 1
  }
  raise InternalInvariant(message="Unknown sizing command: " + func_name)
}

///|
fn sizing_spec() -> FunctionSpec {
  FunctionSpec::make(
    sizing_commands,
    0,
    allowed_in_text=true,
    handler=sizing_handler,
  )
}

///|
fn sizing_handler(
  context : FunctionContext,
  _args : Array[ParseNode],
  _opt_args : Array[ParseNode?],
) -> ParseNode raise ParseFailure {
  Sizing(
    mode=context.mode,
    size=sizing_index(context.func_name),
    body=(context.parse_expression)(false, context.break_on_token_text),
  )
}