57 lines
1.8 KiB
C++
57 lines
1.8 KiB
C++
#pragma once
|
||
#include <functional>
|
||
#include <QObject>
|
||
#include <QPointer>
|
||
#include <QString>
|
||
#include <QTimer>
|
||
#include <QVariant>
|
||
#include "IApiCall.hpp"
|
||
|
||
namespace geopro::data {
|
||
|
||
// 单请求异步句柄(抽象基,可测试缝):payload 经 QVariant 承载,控制器侧 qvariant_cast<T> 取出。
|
||
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<QVariant(const geopro::net::ApiResponse&)>;
|
||
using Predicate = std::function<bool(const geopro::net::ApiResponse&)>;
|
||
ApiNavRequest(geopro::net::IApiCall* call, Parser parse, Predicate isFailure,
|
||
QObject* parent = nullptr); // 持有非拥有引用(QPointer);call 完成(finished)或 abort 后自行 deleteLater 自管理生命周期,本类不得 delete 它
|
||
void abort() override;
|
||
private:
|
||
QPointer<geopro::net::IApiCall> 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
|