///|
fn style_level(func_name : String) -> StyleLevel raise ParseFailure {
  match func_name {
    "\\displaystyle" => DisplayStyle
    "\\textstyle" => TextStyle
    "\\scriptstyle" => ScriptStyle
    "\\scriptscriptstyle" => ScriptScriptStyle
    _ =>
      raise InternalInvariant(message="Unknown styling command: " + func_name)
  }
}

///|
fn styling_spec() -> FunctionSpec {
  FunctionSpec::make(
    ["\\displaystyle", "\\textstyle", "\\scriptstyle", "\\scriptscriptstyle"],
    0,
    allowed_in_text=true,
    primitive=true,
    handler=styling_handler,
  )
}

///|
fn styling_handler(
  context : FunctionContext,
  _args : Array[ParseNode],
  _opt_args : Array[ParseNode?],
) -> ParseNode raise ParseFailure {
  Styling(
    mode=context.mode,
    body=(context.parse_expression)(true, context.break_on_token_text),
    style=style_level(context.func_name),
    reset_font=false,
  )
}