#pragma once #include #include #include #include #include #include #include "IApiCall.hpp" namespace geopro::data { // 单请求异步句柄(抽象基,可测试缝):payload 经 QVariant 承载,控制器侧 qvariant_cast 取出。 class NavRequest : public QObject { Q_OBJECT public: using QObject::QObject; ~NavRequest() override = default; virtual void abort() = 0; signals: void done(const QVariant& value); void failed(const QString& message); }; // Api 实现:包一个 IApiCall + 注入的解析器(ApiResponse → QVariant)+ 失败谓词。 class ApiNavRequest : public NavRequest { Q_OBJECT public: using Parser = std::function; using Predicate = std::function; ApiNavRequest(geopro::net::IApiCall* call, Parser parse, Predicate isFailure, QObject* parent = nullptr); // 持有非拥有引用(QPointer);call 完成(finished)或 abort 后自行 deleteLater 自管理生命周期,本类不得 delete 它 void abort() override; private: QPointer call_; Parser parse_; Predicate isFailure_; bool aborted_ = false; }; // 立即失败句柄:本地前置条件不满足(如文件打开失败)时返回,异步 emit failed(message)。 class FailedNavRequest : public NavRequest { Q_OBJECT public: explicit FailedNavRequest(QString message, QObject* parent = nullptr) : NavRequest(parent), message_(std::move(message)) { QTimer::singleShot(0, this, [this]() { emit failed(message_); deleteLater(); }); } void abort() override { deleteLater(); } private: QString message_; }; } // namespace geopro::data