19 auto project_opt = parser.
GetString(
"project_name");
21 if (!project_opt.has_value()) {
22 return absl::InvalidArgumentError(
23 "Missing required argument: project_name");
26 std::string project_name = project_opt.value();
29 auto status = project.
Create(project_name,
".");
34 formatter.
AddField(
"status",
"success");
36 "Successfully initialized project: " + project_name);
37 formatter.
AddField(
"project_name", project_name);
39 return absl::OkStatus();
46 auto status = project.
Open(
".");
58 namespace fs = std::filesystem;
59 std::vector<std::string> bps_files;
62 for (
const auto& entry : fs::directory_iterator(project.
patches_folder)) {
63 if (entry.path().extension() ==
".bps") {
64 bps_files.push_back(entry.path().string());
67 }
catch (
const fs::filesystem_error& e) {
71 for (
const auto& patch_file : bps_files) {
72 std::vector<uint8_t> patch_data;
74 std::copy(patch_contents.begin(), patch_contents.end(),
75 std::back_inserter(patch_data));
76 std::vector<uint8_t> patched_rom;
82 std::vector<std::string> asm_files;
84 for (
const auto& entry : fs::directory_iterator(project.
patches_folder)) {
85 if (entry.path().extension() ==
".asm") {
86 asm_files.push_back(entry.path().string());
89 }
catch (
const fs::filesystem_error& e) {
94 if (!asm_files.empty()) {
97 if (!init_status.ok()) {
99 "Asar not available, skipping ASM patches: " +
100 std::string(init_status.message()));
102 for (
const auto& asm_file : asm_files) {
103 auto rom_data = build_rom.
vector();
104 auto result = asar.
ApplyPatch(asm_file, rom_data);
107 return absl::InternalError(
108 "ASM patch failed for " + asm_file +
": " +
109 std::string(result.status().message()));
112 if (result->success) {
114 formatter.
AddField(
"asm_applied", asm_file);
117 if (!result->symbols.empty()) {
119 "symbols_" + fs::path(asm_file).stem().
string(),
120 std::to_string(result->symbols.size()) +
" symbols");
124 std::string error_msg =
"Errors in " + asm_file +
":";
125 for (
const auto& error : result->errors) {
126 error_msg +=
"\n " + error;
128 formatter.
AddField(
"error", error_msg);
129 return absl::InternalError(error_msg);
135 std::string output_file = project.
name +
".sfc";
136 status = build_rom.
SaveToFile({.save_new =
true, .filename = output_file});
141 formatter.
AddField(
"status",
"success");
142 formatter.
AddField(
"message",
"Successfully built project: " + project.
name);
144 formatter.
AddField(
"output_file", output_file);
146 return absl::OkStatus();
The Rom class is used to load, save, and modify Rom data. This is a generic SNES ROM container and do...
absl::Status LoadFromFile(const std::string &filename, const LoadOptions &options=LoadOptions::Defaults())
const auto & vector() const
absl::Status SaveToFile(const SaveSettings &settings)
absl::Status LoadFromData(const std::vector< uint8_t > &data, const LoadOptions &options=LoadOptions::Defaults())
absl::Status Execute(Rom *rom, const resources::ArgumentParser &parser, resources::OutputFormatter &formatter) override
Execute the command business logic.
absl::Status Execute(Rom *rom, const resources::ArgumentParser &parser, resources::OutputFormatter &formatter) override
Execute the command business logic.
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)
Modern C++ wrapper for Asar 65816 assembler integration.
absl::StatusOr< AsarPatchResult > ApplyPatch(const std::string &patch_path, std::vector< uint8_t > &rom_data, const std::vector< std::string > &include_paths={})
absl::Status Initialize()
absl::Status ApplyBpsPatch(const std::vector< uint8_t > &source, const std::vector< uint8_t > &patch, std::vector< uint8_t > &output)
std::string LoadFile(const std::string &filename)
Loads the entire contents of a file into a string.
Modern project structure with comprehensive settings consolidation.
std::string patches_folder
absl::Status Create(const std::string &project_name, const std::string &base_path)
absl::Status Open(const std::string &project_path)