////////////////////////////////////////////////////////////////////////// // // DATAPACK // // Invocations contain a field 'datapack' which contains additional // data for the invocation, packed up in a serialized format. Executing // the invocation involves unpacking the datapack. // // The actual contents of the datapack depends on the type of invocation: // // KIND_INVALID: // // Nothing. // // KIND_LUA_CALL: // // A lua function call. The class name, the function name, and then // the function arguments. // // KIND_LUA: // // A block of lua source code, in plaintext. // // KIND_FLUSH_PRINTS: // // Line number in ascii. // // KIND_TICK: // // Nothing. // // KIND_LUA_SOURCE: // // Packaged lua sourcecode. See drvutil::package_lua_source. // ////////////////////////////////////////////////////////////////////////// #ifndef INVOCATION_HPP #define INVOCATION_HPP #include "wrap-string.hpp" #include "wrap-map.hpp" #include "wrap-deque.hpp" #include "streambuffer.hpp" class Invocation : public eng::opnew { public: enum Kind { KIND_INVALID, KIND_LUA_CALL, KIND_LUA, KIND_FLUSH_PRINTS, KIND_TICK, KIND_LUA_SOURCE, }; private: Kind kind_; int64_t actor_; int64_t place_; eng::string datapack_; public: Invocation(); Invocation(Kind kind, int64_t actor, int64_t place, std::string_view datapack); bool valid() const { return kind_ != KIND_INVALID; } Kind kind() const { return kind_; } int64_t actor() const { return actor_; } int64_t place() const { return place_; } const eng::string &datapack() const { return datapack_; } void serialize(StreamBuffer *sb) const; void deserialize(StreamBuffer *sb); eng::string debug_string() const; }; using UniqueInvocation = std::unique_ptr; class InvocationQueue : public eng::deque { }; #endif // INVOCATION_HPP