| // Copyright 2018 The Fuchsia Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include <cstdint> | |
| #include <limits> | |
| #include "lib/fit/function.h" | |
| #include "src/developer/debug/zxdb/common/err.h" | |
| #include "src/developer/debug/zxdb/console/console.h" | |
| #include "src/lib/fxl/command_line.h" | |
| #ifndef SRC_DEVELOPER_DEBUG_ZXDB_CONSOLE_ACTIONS_H_ | |
| #define SRC_DEVELOPER_DEBUG_ZXDB_CONSOLE_ACTIONS_H_ | |
| namespace zxdb { | |
| class Session; | |
| // The flag processing will generate actions that will be run after the flag | |
| // processing. A global ActionFlow | |
| // is used and PostActionCallback is used as the overall callback. | |
| // See PostActionCallback below for details. | |
| class Action { | |
| public: | |
| // The functor to be called for each action. | |
| using ActionFunction = fit::function<void(const Action&, const Session&, Console*)>; | |
| Action(); | |
| explicit Action(std::string name, ActionFunction action); | |
| // Movable | |
| Action(Action&&); | |
| Action& operator=(Action&&); | |
| // Action is a functor that receives the session and console state to run | |
| // commands. They also receive an option test callback that can be used to | |
| // modify behaviour when running on tests. | |
| void operator()(const Session&, Console*) const; | |
| const std::string& name() const { return name_; } | |
| private: | |
| std::string name_; // For debug and error purposes | |
| ActionFunction action_; | |
| }; | |
| // Owner of generated actions processed by command line. It will keep the | |
| // actions sorted by priority, | |
| class ActionFlow { | |
| public: | |
| // The callback that will be called on complete or error of a particular | |
| // action. | |
| using Callback = fit::callback<void(Err)>; | |
| // This singleton is the one that should be used for running Actions outside | |
| // of a testing environment. It will hook up the correct callback. | |
| static ActionFlow& Singleton(); | |
| ActionFlow(); | |
| // Will schedule the processed actions into the MessageLoop, linking them with | |
| // the correct callback to get the flow connected. The given callbacks are the | |
| // way the scheduling uses to run post action events. They must be set. | |
| // The given callback will be called with the result of the actions. If the | |
| // Err has ErrType::kCanceled, it means that a command wants to stop the | |
| // action processing and the caller might want to react accordingly. | |
| void ScheduleActions(std::vector<Action>&& actions, const Session*, Console*, Callback); | |
| // This function is the one that ties all the Actions together. Each of | |
| // generated flag actions will run this function as their callback. This | |
| // function obtains a reference to the ActionFlow singleton and is able | |
| // to determine which action to run next. If no action is left or the current | |
| // once failed, the console will be initiated and interactive mode will be | |
| // run. Interactive mode will also run if any action called a command that | |
| // does not receive a callback (eg. DoStep). The calling action also provides | |
| // information about whether the console should continue processing the | |
| // actions. This is different than a failure: eg. help will stop processing | |
| // anything else, but it has not failed. This is indicated by | |
| // ErrType::kCanceled | |
| static void PostActionCallback(Err); | |
| // Useful for tests, that require a clean slate every time | |
| void Clear(); | |
| const std::vector<Action>& flow() const { return flow_; } | |
| const Action& current_action() const { return flow_[current_action_index_]; } | |
| const std::vector<Err>& callbacks() const { return callbacks_; } | |
| private: | |
| std::vector<Action> flow_; | |
| size_t current_action_index_ = 0; | |
| const Session* session_; | |
| Console* console_; | |
| Callback callback_; | |
| // Useful for test verification | |
| std::vector<Err> callbacks_; | |
| FXL_DISALLOW_COPY_AND_ASSIGN(ActionFlow); | |
| }; | |
| // Parses the given input as newline-separated commands. | |
| std::vector<Action> CommandsToActions(const std::string& input); | |
| // Loads the given script file and parses it as as a sequence of actions. | |
| Err ScriptFileToActions(const std::string& path, std::vector<Action>* actions); | |
| } // namespace zxdb | |
| #endif // SRC_DEVELOPER_DEBUG_ZXDB_CONSOLE_ACTIONS_H_ |