Plan new document creation in app core

This commit is contained in:
2026-06-02 23:14:35 +02:00
parent fd1772a417
commit 853307697a
10 changed files with 284 additions and 21 deletions

View File

@@ -108,6 +108,13 @@ struct PlanDocumentFileArgs {
bool target_exists = false;
};
struct PlanNewDocumentArgs {
std::string work_directory;
std::string name;
std::uint32_t resolution_index = 0;
bool target_exists = false;
};
struct PlanDocumentVersionArgs {
std::string directory;
std::string document_name;
@@ -399,6 +406,7 @@ void print_help()
<< " inspect-project --path FILE\n"
<< " classify-open --path FILE\n"
<< " plan-open-route --path FILE [--unsaved]\n"
<< " plan-new-document --work-dir DIR --name NAME [--resolution-index N] [--target-exists]\n"
<< " plan-document-file --work-dir DIR --name NAME [--target-exists]\n"
<< " plan-document-version --directory DIR --doc-name NAME [--existing-path FILE]\n"
<< " plan-export-target --kind file|collection|stem|name --doc-name NAME [--work-dir DIR] [--directory DIR] [--extension EXT] [--suffix SUFFIX]\n"
@@ -1355,6 +1363,80 @@ int plan_document_file(int argc, char** argv)
return 0;
}
pp::foundation::Status parse_plan_new_document_args(
int argc,
char** argv,
PlanNewDocumentArgs& args)
{
for (int i = 2; i < argc; ++i) {
const std::string_view key(argv[i]);
if (key == "--work-dir") {
if (i + 1 >= argc) {
return pp::foundation::Status::invalid_argument("missing value for option");
}
args.work_directory = argv[++i];
} else if (key == "--name") {
if (i + 1 >= argc) {
return pp::foundation::Status::invalid_argument("missing value for option");
}
args.name = argv[++i];
} else if (key == "--resolution-index") {
if (i + 1 >= argc) {
return pp::foundation::Status::invalid_argument("missing value for option");
}
const auto parsed = pp::foundation::parse_u32(argv[++i]);
if (!parsed) {
return parsed.status();
}
args.resolution_index = parsed.value();
} else if (key == "--target-exists") {
args.target_exists = true;
} else {
return pp::foundation::Status::invalid_argument("unknown option");
}
}
if (args.work_directory.empty()) {
return pp::foundation::Status::invalid_argument("work directory must not be empty");
}
return pp::foundation::Status::success();
}
int plan_new_document(int argc, char** argv)
{
PlanNewDocumentArgs args;
const auto status = parse_plan_new_document_args(argc, argv, args);
if (!status.ok()) {
print_error("plan-new-document", status.message);
return 2;
}
const auto plan = pp::app::plan_new_document(
args.work_directory,
args.name,
static_cast<int>(args.resolution_index),
[&args](const std::string&) {
return args.target_exists;
});
if (!plan) {
print_error("plan-new-document", plan.status().message);
return 2;
}
std::cout << "{\"ok\":true,\"command\":\"plan-new-document\""
<< ",\"target\":{\"name\":\"" << json_escape(plan.value().target.name)
<< "\",\"directory\":\"" << json_escape(plan.value().target.directory)
<< "\",\"path\":\"" << json_escape(plan.value().target.path)
<< "\",\"exists\":" << json_bool(args.target_exists)
<< "},\"document\":{\"resolution\":" << plan.value().resolution
<< ",\"resolutionIndex\":" << args.resolution_index
<< "},\"decision\":\""
<< document_file_write_decision_name(plan.value().write_decision)
<< "\"}\n";
return 0;
}
pp::foundation::Status parse_plan_document_version_args(
int argc,
char** argv,
@@ -3559,6 +3641,10 @@ int main(int argc, char** argv)
return plan_document_file(argc, argv);
}
if (command == "plan-new-document") {
return plan_new_document(argc, argv);
}
if (command == "plan-document-version") {
return plan_document_version(argc, argv);
}