blob: 8cf7b1e832c70f167901eb8ca73e58c302dcae25 [file] [log] [blame]
// Copyright 2024 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef QUICHE_QUIC_TOOLS_INTERACTIVE_CLI_H_
#define QUICHE_QUIC_TOOLS_INTERACTIVE_CLI_H_
#include <memory>
#include <string>
#include "absl/strings/string_view.h"
#include "quiche/quic/core/io/quic_event_loop.h"
#include "quiche/quic/core/io/socket.h"
#include "quiche/common/quiche_callbacks.h"
namespace quic {
// InteractiveCli is a tool that lets the user type input while the program is
// outputting things into the terminal. Only works on Unix-like platforms.
class InteractiveCli : public QuicSocketEventListener {
public:
using LineCallback = quiche::MultiUseCallback<void(absl::string_view)>;
// `event_loop` must outlive the object. `line_callback` is called whenever
// user enters a line of text into the terminal.
InteractiveCli(QuicEventLoop* event_loop, LineCallback line_callback);
~InteractiveCli();
InteractiveCli(InteractiveCli&) = delete;
InteractiveCli(InteractiveCli&&) = delete;
InteractiveCli& operator=(InteractiveCli&) = delete;
InteractiveCli& operator=(InteractiveCli&&) = delete;
// Outputs a line of text into the terminal, and then restores the user input
// prompt. Use this instead of std::cout and other I/O functions. Will crash
// if stdin or stdout is not a terminal. Does not support any form of
// terminal editing except for backspace.
void PrintLine(absl::string_view line);
// Process kSocketReadable events on STDIN.
void OnSocketEvent(QuicEventLoop* event_loop, SocketFd fd,
QuicSocketEventMask events) override;
private:
// Clears the current line in the terminal.
void ResetLine();
// Prints the pending user input.
void RestoreCurrentInputLine();
QuicEventLoop* event_loop_; // Not owned.
LineCallback line_callback_;
// Avoid including termios.h by storing the old termios as an array of bytes.
std::unique_ptr<char[]> old_termios_ = nullptr;
// Buffered user input.
std::string current_input_line_;
// Prompt printed before the user input line.
std::string prompt_ = "> ";
};
} // namespace quic
#endif // QUICHE_QUIC_TOOLS_INTERACTIVE_CLI_H_