diff --git a/gpt4all-backend/include/gpt4all-backend/main.h b/gpt4all-backend/include/gpt4all-backend/main.h index ccf833d1..cd2137a3 100644 --- a/gpt4all-backend/include/gpt4all-backend/main.h +++ b/gpt4all-backend/include/gpt4all-backend/main.h @@ -2,23 +2,47 @@ #include // IWYU pragma: keep +#include #include #include #include +#include #include #include +#include namespace gpt4all::backend { -struct NetErr { - QNetworkReply::NetworkError error; - QString errorString; +struct ResponseError { +private: + using ErrorCode = std::variant< + QNetworkReply::NetworkError, + QJsonParseError::ParseError + >; + +public: + ErrorCode error; + QString errorString; + + ResponseError(const QNetworkReply *reply) + : error(reply->error()) + , errorString(reply->errorString()) + { + assert(reply->error()); + } + + ResponseError(const QJsonParseError &err) + : error(err.error) + , errorString(err.errorString()) + { + assert(err.error); + } }; template -using DataOrNetErr = std::expected; +using DataOrRespErr = std::expected; class LLMProvider { @@ -31,7 +55,7 @@ public: void getBaseUrl(QUrl value) { m_baseUrl = std::move(value); } /// Retrieve the Ollama version, e.g. "0.5.1" - auto getVersion() const -> QCoro::Task>; + auto getVersion() const -> QCoro::Task>; private: QUrl m_baseUrl; diff --git a/gpt4all-backend/src/main.cpp b/gpt4all-backend/src/main.cpp index 76e138de..1bf3f7a2 100644 --- a/gpt4all-backend/src/main.cpp +++ b/gpt4all-backend/src/main.cpp @@ -3,9 +3,11 @@ #include // IWYU pragma: keep #include +#include #include -#include #include +#include +#include #include #include @@ -16,15 +18,26 @@ using namespace Qt::Literals::StringLiterals; namespace gpt4all::backend { -auto LLMProvider::getVersion() const -> QCoro::Task> +auto LLMProvider::getVersion() const -> QCoro::Task> { QNetworkAccessManager nam; std::unique_ptr reply(co_await nam.get(QNetworkRequest(m_baseUrl.resolved(u"/api/version"_s)))); - if (auto err = reply->error()) - co_return std::unexpected(NetErr{ err, reply->errorString() }); + if (reply->error()) + co_return std::unexpected(reply.get()); - // TODO(jared): parse JSON here instead of just returning the data - co_return QString::fromUtf8(reply->readAll()); + QJsonParseError error; + auto doc = QJsonDocument::fromJson(reply->readAll(), &error); + if (doc.isNull()) + co_return std::unexpected(error); + + assert(doc.isObject()); + auto obj = doc.object(); + + auto version = std::as_const(obj).find("version"_L1); + assert(version != obj.constEnd()); + + assert(version->isString()); + co_return version->toString(); } } // namespace gpt4all::backend