yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
command_handler.h
Go to the documentation of this file.
1#ifndef YAZE_SRC_CLI_SERVICE_RESOURCES_COMMAND_HANDLER_H_
2#define YAZE_SRC_CLI_SERVICE_RESOURCES_COMMAND_HANDLER_H_
3
4#include <filesystem>
5#include <map>
6#include <optional>
7#include <string>
8#include <vector>
9
10#include "absl/status/status.h"
11#include "absl/status/statusor.h"
12#include "absl/strings/string_view.h"
14#include "core/asar_wrapper.h" // For AsarWrapper
15#include "core/project.h" // For YazeProject
16#include "rom/rom.h"
17
18namespace yaze {
19namespace cli {
20namespace resources {
21
22// Immutable ROM path identity captured for one CommandHandler::Run invocation.
23// The source path remains the caller's ROM when sandbox mode swaps the active
24// path to a command-local copy.
26 std::optional<std::filesystem::path> source_rom_path;
27 std::optional<std::filesystem::path> active_rom_path;
28 bool sandbox_enabled = false;
29};
30
31// Resolve an artifact destination once and reject aliases of either ROM used
32// by the invocation, including the original source when sandboxing is enabled.
33absl::StatusOr<std::filesystem::path> ResolveStableArtifactPath(
34 const std::filesystem::path& path);
35absl::StatusOr<bool> PathsAlias(const std::filesystem::path& lhs,
36 const std::filesystem::path& rhs);
37absl::Status RejectArtifactRomAliases(
38 absl::string_view option_name, const std::filesystem::path& artifact_path,
39 const CommandInvocationContext& invocation_context);
40
70 public:
71 virtual ~CommandHandler() = default;
72
74 std::string name;
75 std::string description;
76 std::string todo_reference;
77 };
78
79 struct Descriptor {
80 std::string display_name;
81 std::string summary;
82 std::string todo_reference;
83 std::vector<DescriptorEntry> entries;
84 };
85
96 absl::Status Run(const std::vector<std::string>& args, Rom* rom_context,
97 std::string* captured_output = nullptr);
98
105 virtual std::string GetName() const = 0;
106
110 virtual Descriptor Describe() const;
111
115 virtual std::string GetUsage() const = 0;
116
122 virtual bool RequiresRom() const { return true; }
123
129 virtual bool RequiresLabels() const { return false; }
130
136 project_ = project;
137 }
138
143 virtual void SetAsarWrapper(core::AsarWrapper* asar_wrapper) {
144 asar_wrapper_ = asar_wrapper;
145 }
146
151 virtual void SetRomContext(Rom* rom) { rom_ = rom; }
152
157 const std::map<std::string, core::AsarSymbol>* table) {
159 }
160
165 symbol_provider_ = provider;
166 }
167
168 protected:
172 virtual absl::Status ValidateArgs(const ArgumentParser& parser) = 0;
173
180 virtual absl::Status Execute(Rom* rom, const ArgumentParser& parser,
181 OutputFormatter& formatter) = 0;
182
190 virtual absl::Status ExecuteWithContext(
191 Rom* rom, const ArgumentParser& parser, OutputFormatter& formatter,
192 const CommandInvocationContext& invocation_context) {
193 return Execute(rom, parser, formatter);
194 }
195
199 virtual std::string GetDefaultFormat() const { return "json"; }
200
204 virtual std::string GetOutputTitle() const { return "Result"; }
205
206 Rom* rom_ = nullptr;
210 const std::map<std::string, core::AsarSymbol>* assembly_symbol_table_ =
211 nullptr;
212};
213
234#define DEFINE_COMMAND_HANDLER(name, usage_str, validate_body, execute_body) \
235 class name##CommandHandler : public CommandHandler { \
236 public: \
237 std::string GetName() const override { return #name; } \
238 std::string GetUsage() const override { return usage_str; } \
239 \
240 protected: \
241 absl::Status ValidateArgs(const ArgumentParser& parser) override \
242 validate_body absl::Status \
243 Execute(Rom* rom, const ArgumentParser& parser, \
244 OutputFormatter& formatter) override execute_body \
245 };
246
247} // namespace resources
248} // namespace cli
249} // namespace yaze
250
251#endif // YAZE_SRC_CLI_SERVICE_RESOURCES_COMMAND_HANDLER_H_
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
Definition rom.h:28
Utility for parsing common CLI argument patterns.
Base class for CLI command handlers.
const std::map< std::string, core::AsarSymbol > * assembly_symbol_table_
virtual bool RequiresLabels() const
Check if the command requires ROM labels.
virtual std::string GetUsage() const =0
Get the command usage string.
virtual std::string GetName() const =0
Get the command name.
virtual void SetRomContext(Rom *rom)
Set the ROM context for tools that need ROM access. Default implementation stores the ROM pointer for...
virtual absl::Status Execute(Rom *rom, const ArgumentParser &parser, OutputFormatter &formatter)=0
Execute the command business logic.
virtual void SetSymbolProvider(emu::debug::SymbolProvider *provider)
Set the SymbolProvider context.
absl::Status Run(const std::vector< std::string > &args, Rom *rom_context, std::string *captured_output=nullptr)
Execute the command.
virtual std::string GetOutputTitle() const
Get the output title for formatting.
virtual void SetAsarWrapper(core::AsarWrapper *asar_wrapper)
Set the AsarWrapper context. Default implementation does nothing, override if tool needs Asar access.
emu::debug::SymbolProvider * symbol_provider_
virtual std::string GetDefaultFormat() const
Get the default output format ("json" or "text")
virtual bool RequiresRom() const
Check if the command requires a loaded ROM.
virtual void SetProjectContext(project::YazeProject *project)
Set the YazeProject context. Default implementation does nothing, override if tool needs project info...
virtual void SetAssemblySymbolTable(const std::map< std::string, core::AsarSymbol > *table)
Optional Asar symbol table for assembly-aware tools.
virtual Descriptor Describe() const
Provide metadata for TUI/help summaries.
virtual absl::Status ExecuteWithContext(Rom *rom, const ArgumentParser &parser, OutputFormatter &formatter, const CommandInvocationContext &invocation_context)
Execute with immutable, invocation-scoped ROM path identity.
virtual absl::Status ValidateArgs(const ArgumentParser &parser)=0
Validate command arguments.
Utility for consistent output formatting across commands.
Modern C++ wrapper for Asar 65816 assembler integration.
Provider for symbol (label) resolution in disassembly.
absl::StatusOr< std::filesystem::path > ResolveStableArtifactPath(const std::filesystem::path &path)
absl::Status RejectArtifactRomAliases(absl::string_view option_name, const std::filesystem::path &artifact_path, const CommandInvocationContext &invocation_context)
absl::StatusOr< bool > PathsAlias(const std::filesystem::path &lhs, const std::filesystem::path &rhs)
std::optional< std::filesystem::path > active_rom_path
std::optional< std::filesystem::path > source_rom_path
Modern project structure with comprehensive settings consolidation.
Definition project.h:172