#ifndef NEWSBOAT_CONFIGPARSER_H_ #define NEWSBOAT_CONFIGPARSER_H_ #include #include #include #include namespace newsboat { enum class ActionHandlerStatus { VALID = 0, INVALID_PARAMS, TOO_FEW_PARAMS, INVALID_COMMAND, FILENOTFOUND }; struct ConfigActionHandler { virtual void handle_action(const std::string& action, const std::vector& params) = 0; virtual void dump_config(std::vector& config_output) = 0; ConfigActionHandler() {} virtual ~ConfigActionHandler() {} }; class ConfigParser : public ConfigActionHandler { public: ConfigParser(); ~ConfigParser() override; void register_handler(const std::string& cmd, ConfigActionHandler* handler); void unregister_handler(const std::string& cmd); void handle_action(const std::string& action, const std::vector& params) override; void dump_config(std::vector&) override { /* nothing because ConfigParser itself only handles include */ } bool parse(const std::string& filename, bool double_include = true); static std::string evaluate_backticks(std::string token); private: void evaluate_backticks(std::vector& tokens); static std::string evaluate_cmd(const std::string& cmd); std::vector> parsed_content; std::map action_handlers; std::set included_files; }; class NullConfigActionHandler : public ConfigActionHandler { public: NullConfigActionHandler() {} ~NullConfigActionHandler() override {} void handle_action(const std::string&, const std::vector&) override { } void dump_config(std::vector&) override {} }; } // namespace newsboat #endif /* NEWSBOAT_CONFIGPARSER_H_ */