Add image import service boundary

This commit is contained in:
2026-06-03 13:17:31 +02:00
parent a6306c2759
commit 6d0cc4eb15
5 changed files with 188 additions and 19 deletions

View File

@@ -2,6 +2,8 @@
#include "foundation/result.h"
#include <string_view>
namespace pp::app {
enum class DocumentImageImportAction {
@@ -17,13 +19,31 @@ struct DocumentImageImportPlan {
bool enters_transform_mode = false;
};
[[nodiscard]] inline pp::foundation::Result<DocumentImageImportPlan> plan_document_image_import(
class DocumentImageImportServices {
public:
virtual ~DocumentImageImportServices() = default;
virtual void import_equirectangular(std::string_view path) = 0;
virtual void enter_transform_import(std::string_view path) = 0;
};
[[nodiscard]] inline pp::foundation::Status validate_document_image_import_dimensions(
int width,
int height) noexcept
{
if (width <= 0 || height <= 0) {
return pp::foundation::Result<DocumentImageImportPlan>::failure(
pp::foundation::Status::invalid_argument("image dimensions must be positive"));
return pp::foundation::Status::invalid_argument("image dimensions must be positive");
}
return pp::foundation::Status::success();
}
[[nodiscard]] inline pp::foundation::Result<DocumentImageImportPlan> plan_document_image_import(
int width,
int height) noexcept
{
const auto dimensions = validate_document_image_import_dimensions(width, height);
if (!dimensions.ok()) {
return pp::foundation::Result<DocumentImageImportPlan>::failure(dimensions);
}
const auto wide_equirect = static_cast<long long>(width) == static_cast<long long>(height) * 2LL;
@@ -40,4 +60,29 @@ struct DocumentImageImportPlan {
return pp::foundation::Result<DocumentImageImportPlan>::success(plan);
}
[[nodiscard]] inline pp::foundation::Status execute_document_image_import_plan(
const DocumentImageImportPlan& plan,
std::string_view path,
DocumentImageImportServices& services)
{
const auto dimensions = validate_document_image_import_dimensions(plan.width, plan.height);
if (!dimensions.ok()) {
return dimensions;
}
if (path.empty()) {
return pp::foundation::Status::invalid_argument("image import path must not be empty");
}
switch (plan.action) {
case DocumentImageImportAction::import_equirectangular:
services.import_equirectangular(path);
return pp::foundation::Status::success();
case DocumentImageImportAction::place_transform:
services.enter_transform_import(path);
return pp::foundation::Status::success();
}
return pp::foundation::Status::invalid_argument("unknown image import action");
}
} // namespace pp::app