///|
fn Prompt::run_cancel_prompt_handler(
  self : Prompt,
  info : @console.ConsoleKeyInfo,
) -> PromptResult {
  self.pane_state.completion_state = None
  self.pane_state.overload_state = None
  self.pane_state.selection = None
  self.console.write_line("")
  self.cancel_controller.set_mode(AllowCancelSignal)
  PromptResult::cancelled(info)
}

///|
async fn Prompt::run_submit_or_cancel_handler(
  self : Prompt,
  state : InputState,
  key_bindings : KeyBindings,
  key_press : KeyPress,
) -> KeyProcessingResult {
  let info = key_press.console_key_info
  self.history.reset_navigation()

  if key_bindings.cancel_prompt.matches(info) || is_control_c_key(info) {
    return Return(self.run_cancel_prompt_handler(info))
  }

  if key_bindings.new_line.matches(info) {
    return self.insert_soft_newline(state)
  }

  if key_bindings.submit_prompt.matches(info) {
    let snapshot = self.snapshot_of(state.left, state.right)
    let should_insert_soft_newline = (self.configuration.callbacks.should_insert_soft_newline)(
      snapshot, key_press,
    )
    if should_insert_soft_newline {
      return self.insert_soft_newline(state)
    }

    self.pane_state.completion_state = None
    self.pane_state.overload_state = None
    self.pane_state.selection = None
    let line = line_from_buffers(state.left, state.right)
    self.history.track_submission(line)
    self.console.write_line("")
    self.cancel_controller.set_mode(AllowCancelSignal)
    return Return(PromptResult::submitted(line, info))
  }
  NotHandled
}

///|
fn Prompt::insert_soft_newline(
  self : Prompt,
  state : InputState,
) -> KeyProcessingResult {
  self.pane_state.completion_state = None
  self.pane_state.overload_state = None
  self.delete_selection(state.left, state.right)
  state.left.push('\n')
  self.track_undo(state.left, state.right)
  state.request_render()
  state.last_was_yank = false
  Handled
}