Setup routing.

This commit is contained in:
2026-08-07 14:21:44 +01:00
parent fdb67b449d
commit 717c048d6f
7 changed files with 74 additions and 22 deletions
+13
View File
@@ -3,7 +3,20 @@
#include "pch.h" #include "pch.h"
namespace crib::cli { namespace crib::cli {
struct Command {
void (*run)(std::vector<std::string>);
std::string (*summary)();
void (*help)();
};
struct cli_error : std::runtime_error {
int exit_code;
cli_error(std::string msg, int code)
: std::runtime_error(std::move(msg)), exit_code(code) {}
};
extern bool use_colors; extern bool use_colors;
void help(); void help();
int execute(const std::string &name, const Command &cmd, int argc, char *argv[]);
int run(int argc, char *argv[]); int run(int argc, char *argv[]);
} // namespace crib::cli } // namespace crib::cli
+1 -1
View File
@@ -6,5 +6,5 @@
namespace crib::commands::ed { namespace crib::commands::ed {
std::string summary(); std::string summary();
void help(); void help();
void run(int argc, char *argv[]); void run(std::vector<std::string>);
} // namespace crib::commands::ed } // namespace crib::commands::ed
+52
View File
@@ -19,4 +19,56 @@ struct LineIterator {
bool next(std::string *line); bool next(std::string *line);
uint64_t byte_offset(); uint64_t byte_offset();
}; };
struct Iterator {
Shard *root;
std::string line;
Iterator(Shard *root, uint64_t line_num)
: root(root), it(root, line_num, Direction::Forward) {
Shard::retain(root);
}
~Iterator() {
Shard::release(root);
}
Iterator(const Iterator &other)
: root(other.root), it(other.it) {
Shard::retain(root);
}
Iterator &operator=(const Iterator &other) {
if (this != &other) {
Shard::retain(other.root);
Shard::release(root);
root = other.root;
it = other.it;
}
return *this;
}
Iterator(Iterator &&other) noexcept
: root(other.root), it(std::move(other.it)) {
other.root = nullptr;
}
Iterator &operator=(Iterator &&other) noexcept {
if (this != &other) {
Shard::release(root);
root = other.root;
it = std::move(other.it);
other.root = nullptr;
}
return *this;
}
std::string &next() {
it.next(&line);
return line;
}
private:
LineIterator it;
};
} // namespace crib::internal::vase } // namespace crib::internal::vase
+1 -3
View File
@@ -53,9 +53,7 @@ struct Vase {
std::string to_string(); std::string to_string();
std::string to_string(Range range); std::string to_string(Range range);
Point resolve_column(uint64_t line, uint64_t column); Iterator iterate(uint64_t line);
LineIterator iterate(uint64_t line);
void insert(Point *point, char key); void insert(Point *point, char key);
void insert(Point *point, const char *data, uint64_t len); void insert(Point *point, const char *data, uint64_t len);
+4 -15
View File
@@ -2,18 +2,6 @@
#include "commands/ed/ed.h" #include "commands/ed/ed.h"
namespace crib::cli { namespace crib::cli {
struct Command {
void (*run)(int, char **);
std::string (*summary)();
void (*help)();
};
struct cli_error : std::runtime_error {
int exit_code;
cli_error(std::string msg, int code)
: std::runtime_error(std::move(msg)), exit_code(code) {}
};
static const std::unordered_map<std::string, Command> commands = { static const std::unordered_map<std::string, Command> commands = {
{"ed", {"ed",
{crib::commands::ed::run, {crib::commands::ed::run,
@@ -45,9 +33,10 @@ void help() {
std::cout << " " << name << " - " << cmd.summary() << "\n"; std::cout << " " << name << " - " << cmd.summary() << "\n";
} }
int execute(const std::string &name, const Command &cmd, int argc, char **argv) { int execute(const std::string &name, const Command &cmd, int argc, char *argv[]) {
try { try {
cmd.run(argc - 1, argv + 1); std::vector<std::string> args(argv, argv + argc);
cmd.run(args);
return 0; return 0;
} catch (const cli_error &e) { } catch (const cli_error &e) {
std::cerr << "Error running " << name << ": " << e.what() << '\n'; std::cerr << "Error running " << name << ": " << e.what() << '\n';
@@ -69,7 +58,7 @@ int run(int argc, char *argv[]) {
if (argc > 1) if (argc > 1)
if (auto it = commands.find(argv[1]); it != commands.end()) if (auto it = commands.find(argv[1]); it != commands.end())
return execute(it->first, it->second, argc, argv); return execute(it->first, it->second, argc - 1, argv + 1);
if (argc > 1 && std::string(argv[1]) == "--help") { if (argc > 1 && std::string(argv[1]) == "--help") {
help(); help();
+1 -1
View File
@@ -5,7 +5,7 @@ std::string summary() {
return "A POSIX-compliant line editor."; return "A POSIX-compliant line editor.";
} }
void help() {} void help() {}
void run(int, char *[]) { void run(std::vector<std::string> args) {
return; return;
} }
} // namespace crib::commands::ed } // namespace crib::commands::ed
+2 -2
View File
@@ -55,8 +55,8 @@ std::string Vase::to_string(Range range) {
return out; return out;
} }
LineIterator Vase::iterate(uint64_t line) { Iterator Vase::iterate(uint64_t line) {
return LineIterator(root, line, Direction::Forward); return Iterator(root, line);
} }
bool Vase::undo() { bool Vase::undo() {