#pragma once #include #include #include #include #include #include "ast/ast.hpp" #include "cmd/args/arg.hpp" namespace fsh { class Command { using FlagNode = std::optional&; using ArgNodes = std::vector >; public: void execute(FlagNode flag, ArgNodes& vec, std::istream& in, std::ostream& out); template static std::unique_ptr register_cmd() { std::unique_ptr cmd = std::make_unique(); cmd->register_flags(); return cmd; } protected: virtual void register_flags() {}; virtual void run(std::istream& in, std::ostream& out, ArgManager& args) {}; ArgFactory& get_factory() { return arg_factory; } private: ArgFactory arg_factory; }; }