From 23c82a738daeff9a8a501f181cdd5b9dc8a596df Mon Sep 17 00:00:00 2001 From: synacker Date: Sun, 26 Jul 2026 19:04:26 +0300 Subject: [PATCH] Replace Result.hpp with std::expected --- src/DaggyCore/Core.cpp | 4 +- src/DaggyCore/Result.hpp | 61 +++--------------------- src/DaggyCore/Sources.cpp | 21 ++++---- src/DaggyCore/providers/CLocalFabric.cpp | 2 +- src/DaggyCore/providers/CSsh2Fabric.cpp | 13 ++--- src/DaggyCore/providers/CSshFabric.cpp | 13 ++--- src/DaggyCore/providers/IFabric.cpp | 5 +- 7 files changed, 30 insertions(+), 89 deletions(-) diff --git a/src/DaggyCore/Core.cpp b/src/DaggyCore/Core.cpp index d2c2a73b..d9334b03 100644 --- a/src/DaggyCore/Core.cpp +++ b/src/DaggyCore/Core.cpp @@ -311,8 +311,8 @@ try { auto provider = fabric->second->create(session_, {source_id, properties}, this); if (!provider) { - throw std::system_error(provider.error, - provider.message.toStdString()); + throw std::system_error(provider.error().error, + provider.error().message.toStdString()); } connect(*provider, &providers::IProvider::stateChanged, this, &Core::onDataProviderStateChanged); diff --git a/src/DaggyCore/Result.hpp b/src/DaggyCore/Result.hpp index b84c0c2c..2d9ac35a 100644 --- a/src/DaggyCore/Result.hpp +++ b/src/DaggyCore/Result.hpp @@ -22,9 +22,9 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #pragma once +#include #include #include -#include #include #include @@ -32,61 +32,12 @@ SOFTWARE. namespace daggy { -template -class Result -{ -public: - Result() = delete; - Result(Data data) - : data_(std::move(data)) - , error(errors::success) - {} - - Result(std::error_code error, - QString message = QString()) - : data_{} - , error(std::move(error)) - , message(std::move(message)) - {} - - Result(const Result&) = delete; - Result(Result&&) = default; - - operator bool() const - { - return !error; - } - - Data&& operator*() { - return std::move(data_.operator*()); - } - - const Data& operator *() const { - return data_.operator*(); - } - - const Data* operator->() const { - return data_.operator->(); - } - - Data* operator->() { - return data_.operator->(); - } - - const Data* data() const { - return &data_.value(); - } - - Data* data() { - return &data_.value(); - } - - const std::error_code error; - const QString message; - -private: - std::optional data_; +struct ResultError { + std::error_code error; + QString message; }; +template +using Result = std::expected; } diff --git a/src/DaggyCore/Sources.cpp b/src/DaggyCore/Sources.cpp index 1825ba00..19ea3e8a 100644 --- a/src/DaggyCore/Sources.cpp +++ b/src/DaggyCore/Sources.cpp @@ -57,28 +57,25 @@ daggy::Result getCommands(const QVariantMap& commands_ const auto& keys = commands_map.keys(); for (const QString& command_id : keys) { if (commands_map[command_id].metaType() != QMetaType(QMetaType::QVariantMap)) - return - { + return std::unexpected(daggy::ResultError{ daggy::errors::make_error_code(DaggyErrorSourceConvertion), QString("%1 command is not a map").arg(command_id) - }; + }); const QVariantMap& command_map = commands_map[command_id].toMap(); static const auto& requeried_fields = required_commands_field.keys(); for (const auto& field : requeried_fields) { if (!command_map.contains(field)) { - return - { + return std::unexpected(daggy::ResultError{ daggy::errors::make_error_code(DaggyErrorSourceConvertion), QString("%1 command don't have required %2 field").arg(command_id, field) - }; + }); } if (command_map[field].metaType() != QMetaType(required_commands_field.value(field))) { - return - { + return std::unexpected(daggy::ResultError{ daggy::errors::make_error_code(DaggyErrorSourceConvertion), QString("%1 command have incorrect type for %2 field").arg(command_id, field) - }; + }); } } daggy::sources::Command command{command_id, @@ -90,7 +87,7 @@ daggy::Result getCommands(const QVariantMap& commands_ }}; commands[command.first] = command.second; } - return {std::move(commands)}; + return commands; } } @@ -244,7 +241,7 @@ struct convert const auto& commands = getCommands(source_fields[g_commandsField].as()); if (!commands) { - throw std::runtime_error(commands.error.message()); + throw std::runtime_error(commands.error().message.toStdString()); return false; } @@ -360,7 +357,7 @@ std::optional daggy::sources::convertors::json(const QString& da if (!commands) { error = QString("%1 data source have incorrect commands. %2") - .arg(source_id, std::move(commands.message)); + .arg(source_id, commands.error().message); return {}; } diff --git a/src/DaggyCore/providers/CLocalFabric.cpp b/src/DaggyCore/providers/CLocalFabric.cpp index 225044a5..88428b0e 100644 --- a/src/DaggyCore/providers/CLocalFabric.cpp +++ b/src/DaggyCore/providers/CLocalFabric.cpp @@ -39,5 +39,5 @@ const QString& daggy::providers::CLocalFabric::type() const daggy::Result daggy::providers::CLocalFabric::createProvider(const QString& session, const Source& source, QObject* parent) { - return new CLocal(session, source.second.commands, parent); + return Result(new CLocal(session, source.second.commands, parent)); } diff --git a/src/DaggyCore/providers/CSsh2Fabric.cpp b/src/DaggyCore/providers/CSsh2Fabric.cpp index 7deb4d3e..ca856cb9 100644 --- a/src/DaggyCore/providers/CSsh2Fabric.cpp +++ b/src/DaggyCore/providers/CSsh2Fabric.cpp @@ -57,10 +57,10 @@ daggy::Result convert(const QVariantMap& parameters) for (const auto& field : parameters_field) { if (parameters.contains(field.first) && parameters[field.first].metaType() != QMetaType(field.second)) - return { + return std::unexpected(daggy::ResultError{ daggy::errors::make_error_code(DaggyErrorSourceConvertion), QString("Parameters field '%1' has invalid type").arg(field.first) - }; + }); } if (parameters.contains(g_userField)) @@ -107,10 +107,7 @@ daggy::Result daggy::providers::CSsh2Fabric::creat { const auto parameters = convert(source.second.parameters); if (!parameters) - return - { - parameters.error, parameters.message - }; + return std::unexpected(parameters.error()); const auto& properties = source.second; @@ -120,9 +117,9 @@ daggy::Result daggy::providers::CSsh2Fabric::creat else host = QHostAddress(properties.host); - return new CSsh2(session, + return Result(new CSsh2(session, std::move(host), std::move(*parameters), properties.commands, - parent); + parent)); } diff --git a/src/DaggyCore/providers/CSshFabric.cpp b/src/DaggyCore/providers/CSshFabric.cpp index c815eaa9..13ddbad9 100644 --- a/src/DaggyCore/providers/CSshFabric.cpp +++ b/src/DaggyCore/providers/CSshFabric.cpp @@ -29,10 +29,10 @@ daggy::Result convert(const QVariantMap& param for (const auto& field : parameters_field) { if (parameters.contains(field.first) && parameters[field.first].metaType() != QMetaType(field.second)) - return { + return std::unexpected(daggy::ResultError{ daggy::errors::make_error_code(DaggyErrorSourceConvertion), QString("Parameters field '%1' has invalid type").arg(field.first) - }; + }); } if (parameters.contains(g_configField)) @@ -68,10 +68,7 @@ daggy::Result CSshFabric::createProvider(const QString& session, con { auto parameters = convert(source.second.parameters); if (!parameters) { - return - { - parameters.error, parameters.message - }; + return std::unexpected(parameters.error()); } const auto& properties = source.second; @@ -79,11 +76,11 @@ daggy::Result CSshFabric::createProvider(const QString& session, con if (host.isEmpty()) host = source.first; - return new CSsh(session, + return Result(new CSsh(session, host, std::move(*parameters), properties.commands, - parent); + parent)); } } } diff --git a/src/DaggyCore/providers/IFabric.cpp b/src/DaggyCore/providers/IFabric.cpp index 5f6095ad..4f69ea55 100644 --- a/src/DaggyCore/providers/IFabric.cpp +++ b/src/DaggyCore/providers/IFabric.cpp @@ -41,11 +41,10 @@ daggy::Result daggy::providers::IFabric::create(co { const auto& properties = source.second; if (properties.type != type()) { - return - { + return std::unexpected(daggy::ResultError{ errors::make_error_code(DaggyErrorSourceIncorrectProviderType), QString("Source %1 has incorrect provider type %2 - type %3 is required").arg(source.first, properties.type, type()) - }; + }); } return createProvider(session, source, parent); }