geopro/src/data/api/NavRequest.hpp

57 lines
1.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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); // 持有非拥有引用QPointercall 完成(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