* It is tough to contribute to a project that doesn't use a formatter, * It is extra hard to contribute to a project which has configured the formatter, but ignores it for some files * Code formatting makes it harder to hide obscure / weird bugs by accident or on purpose, Let's rip the bandaid off? Note that PRs currently in flight should be able to be merged relatively easily by applying `clang-format` to their tip prior to merge.
51 lines
1.2 KiB
C++
51 lines
1.2 KiB
C++
#pragma once
|
|
/// @file
|
|
|
|
#include "nix/util/finally.hh"
|
|
#include "nix/util/types.hh"
|
|
#include <functional>
|
|
#include <string>
|
|
|
|
namespace nix {
|
|
|
|
namespace detail {
|
|
/** Provides the completion hooks for the repl, without exposing its complete
|
|
* internals. */
|
|
struct ReplCompleterMixin
|
|
{
|
|
virtual StringSet completePrefix(const std::string & prefix) = 0;
|
|
};
|
|
}; // namespace detail
|
|
|
|
enum class ReplPromptType {
|
|
ReplPrompt,
|
|
ContinuationPrompt,
|
|
};
|
|
|
|
class ReplInteracter
|
|
{
|
|
public:
|
|
using Guard = Finally<std::function<void()>>;
|
|
|
|
virtual Guard init(detail::ReplCompleterMixin * repl) = 0;
|
|
/** Returns a boolean of whether the interacter got EOF */
|
|
virtual bool getLine(std::string & input, ReplPromptType promptType) = 0;
|
|
virtual ~ReplInteracter() {};
|
|
};
|
|
|
|
class ReadlineLikeInteracter : public virtual ReplInteracter
|
|
{
|
|
std::string historyFile;
|
|
public:
|
|
ReadlineLikeInteracter(std::string historyFile)
|
|
: historyFile(historyFile)
|
|
{
|
|
}
|
|
|
|
virtual Guard init(detail::ReplCompleterMixin * repl) override;
|
|
virtual bool getLine(std::string & input, ReplPromptType promptType) override;
|
|
virtual ~ReadlineLikeInteracter() override;
|
|
};
|
|
|
|
}; // namespace nix
|