7#include "absl/flags/declare.h"
8#include "absl/flags/flag.h"
20 std::string* captured_output) {
26 if (!validation_status.ok()) {
27 std::cerr <<
"Error: " << validation_status.message() <<
"\n\n";
28 std::cerr <<
"Usage: " <<
GetUsage() <<
"\n";
29 return validation_status;
34 std::string format_str =
39 if (!formatter_or.ok()) {
40 if (format_str ==
"hex" || format_str ==
"ascii" || format_str ==
"both" ||
41 format_str ==
"binary") {
44 return formatter_or.status();
52 config.
format = format_str;
56 if (
auto rom_path = parser.
GetString(
"rom"); rom_path.has_value()) {
61 if (
auto symbols_path = parser.
GetString(
"symbols");
62 symbols_path.has_value()) {
68 if (
auto project_path = parser.
GetString(
"project-context");
69 project_path.has_value()) {
80 std::optional<Rom> sandbox_rom;
81 bool sandbox_enabled =
false;
91 if (absl::GetFlag(FLAGS_sandbox) || parser.
HasFlag(
"sandbox")) {
92 sandbox_enabled =
true;
95 if (!sandbox_or.ok()) {
96 return sandbox_or.status();
98 sandbox_rom.emplace();
100 sandbox_rom->LoadFromFile(sandbox_or->rom_path.string());
101 if (!load_status.ok()) {
118 auto execute_status =
Execute(rom, parser, formatter);
119 if (!execute_status.ok()) {
123 if (captured_output) {
124 *captured_output = formatter.
GetOutput();
128 return execute_status;
131 if (sandbox_enabled && rom !=
nullptr && rom->
dirty()) {
132 auto save_status = rom->
SaveToFile({.save_new =
false});
133 if (!save_status.ok()) {
141 if (captured_output) {
142 *captured_output = formatter.
GetOutput();
147 return absl::OkStatus();
153 descriptor.
summary =
"Command summary not provided.";
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
absl::Status SaveToFile(const SaveSettings &settings)
absl::StatusOr< SandboxMetadata > CreateSandbox(Rom &rom, absl::string_view description)
static RomSandboxManager & Instance()
Utility for parsing common CLI argument patterns.
std::optional< std::string > GetString(const std::string &name) const
Parse a named argument (e.g., –format=json or –format json)
bool HasFlag(const std::string &name) const
Check if a flag is present.
Encapsulates common context for CLI command execution.
absl::StatusOr< Rom * > GetRom()
Get the ROM instance (loads if not already loaded)
absl::Status EnsureLabelsLoaded(Rom *rom)
Ensure resource labels are loaded.
project::YazeProject * GetProjectContext()
Returns loaded project context when –project-context was used.
emu::debug::SymbolProvider * GetSymbolProvider()
Get the SymbolProvider instance.
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 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 Descriptor Describe() const
Provide metadata for TUI/help summaries.
virtual absl::Status ValidateArgs(const ArgumentParser &parser)=0
Validate command arguments.
ABSL_DECLARE_FLAG(bool, sandbox)
#define ASSIGN_OR_RETURN(type_variable_name, expression)
#define RETURN_IF_ERROR(expr)
Configuration for command context.
std::optional< std::string > project_context_path
std::optional< std::string > symbols_path
std::optional< std::string > rom_path
Rom * external_rom_context
std::string todo_reference