#pragma once #include #include #include #include #include #include "ast/ast.hpp" #include "cmd/args/arg.hpp" #include "util/error.hpp" namespace fsh { class Command { public: using FlagNode = std::optional&; using ArgNodes = std::vector >; virtual void execute(FlagNode flag, ArgNodes& vec, std::istream& in, std::ostream& out, ArgFactory &arg_factory); virtual 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: // Register_flags se zove jednom pri registraciji komande i sluzi da u ArgFactory postavis // pravila za argumente i opcije virtual void register_flags() {}; // Korisnik u ovoj funkciju implementira glavnu funkcionalnost komande virtual void run(std::istream& in, std::ostream& out, ArgManager& args) {}; ArgFactory& get_factory() { return arg_factory; } private: ArgFactory arg_factory; }; }