diff --git a/source/RobotAPI/libraries/skills/core/FluxioResult.cpp b/source/RobotAPI/libraries/skills/core/FluxioResult.cpp index 457081a9d161d1e351a6d12a7134e47781f9e4ba..c76c3293c01bad54f27042b3c857276538ecbc07 100644 --- a/source/RobotAPI/libraries/skills/core/FluxioResult.cpp +++ b/source/RobotAPI/libraries/skills/core/FluxioResult.cpp @@ -1,30 +1,36 @@ #include <stdexcept> -template<typename T, typename E = std::exception> +namespace armarx { -class Result { - private: bool success_; T result_; E error_; //maybe even an error list for a better stacktrace + namespace skills { + + template<typename T, typename E = std::exception> - public: - Result(const T& res) : success_(true), result_(res) {} + class Result { + private: bool success_; T result_; E error_; //maybe even an error list for a better stacktrace - Result(const E& err) : success_(false), error_(err) {} + public: + Result(const T& res) : success_(true), result_(res) {} - bool isSuccess() const { - return success_; - } + Result(const E& err) : success_(false), error_(err) {} - T getResult() const { - if (!success_) { - throw std::logic_error("Result is not successful"); - } - return result_; - } + bool isSuccess() const { + return success_; + } + + T getResult() const { + if (!success_) { + throw std::logic_error("Result is not successful"); + } + return result_; + } - E getError() const { - if (success_) { - throw std::logic_error("Result does not contain an error"); - } - return error_; + E getError() const { + if (success_) { + throw std::logic_error("Result does not contain an error"); + } + return error_; + } + }; } -}; \ No newline at end of file +} \ No newline at end of file diff --git a/source/RobotAPI/libraries/skills/core/FluxioResult.h b/source/RobotAPI/libraries/skills/core/FluxioResult.h index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..a607e85aa897a52fea0aa037bd181f2b90918650 100644 --- a/source/RobotAPI/libraries/skills/core/FluxioResult.h +++ b/source/RobotAPI/libraries/skills/core/FluxioResult.h @@ -0,0 +1,25 @@ +#include <stdexcept> + +namespace armarx { + namespace skills { + + template<typename T, typename E = std::exception> + class Result { + private: + bool success_; + T result_; + E error_; + + public: + Result(const T& res) : success_(true), result_(res) {} + + Result(const E& err) : success_(false), error_(err) {} + + bool isSuccess() const {} + + T getResult() const {} + + E getError() const {} + }; + } +} diff --git a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp index 9a788ad0ff59771af0871c81cef612aa669fe8bb..06ffe161de696137517ead9c740e276c1058ff35 100644 --- a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp +++ b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.cpp @@ -614,16 +614,17 @@ namespace armarx::plugins FluxioExecutor* SkillManagerComponentPlugin::executeFluxioSkill(std::string skillId, std::string executorName) { - const auto& skill = getSkill(skillId); - if (!skill.has_value()) + const auto& result = getSkill(skillId); + if (!result.isSuccess()) { ARMARX_WARNING << "Skill with id '" << skillId << "' not found."; return nullptr; } + const auto& skill = result.getResult(); std::string executionId = IceUtil::generateUUID(); - if (!skill.value().native) + if (!skill.native) { // currently empty parameters armarx::aron::data::DictPtr emptyParameters = {}; @@ -639,8 +640,8 @@ namespace armarx::plugins else { skills::SkillID sID = skills::SkillID{ - .providerId = skills::ProviderID{.providerName = skill->skillProviderPtr->id}, - .skillName = skill->id}; + .providerId = skills::ProviderID{.providerName = skill.skillProviderPtr->id}, + .skillName = skill.id}; auto skillDescr = getSkillDescription(sID); if (!skillDescr.has_value()) @@ -923,16 +924,19 @@ namespace armarx::plugins return convertMapValuesToVector(fluxioDC.skills); } - std::optional<skills::FluxioSkill> + + skills::Result<skills::FluxioSkill, skills::error::SkillException> SkillManagerComponentPlugin::getSkill(const std::string& id) { const auto& skillsEntry = fluxioDC.skills.find(id); if (skillsEntry != fluxioDC.skills.end()) { - return skillsEntry->second; + skills::Result<skills::FluxioSkill, skills::error::SkillException> result(skillsEntry->second); + return result; } - - return std::nullopt; + skills::Result<skills::FluxioSkill, skills::error::SkillException> + result(skills::error::SkillNotFoundException("Skill not found", "Reason: ")); + return result; } void diff --git a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.h b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.h index fd27f9a2642cee745ad9902315622e03d48aeb65..760395ae92f2e42d7a61cf74dce4e65cac531b1e 100644 --- a/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.h +++ b/source/RobotAPI/libraries/skills/manager/SkillManagerComponentPlugin.h @@ -8,6 +8,7 @@ #include <ArmarXCore/core/time/DateTime.h> #include "RobotAPI/libraries/skills/core/FluxioSkillStatusUpdate.h" +#include "RobotAPI/libraries/skills/core/error/Exception.h" #include <RobotAPI/interface/skills/SkillManagerInterface.h> #include <RobotAPI/libraries/skills/core/FluxioEdge.h> #include <RobotAPI/libraries/skills/core/FluxioNode.h> @@ -18,6 +19,7 @@ #include <RobotAPI/libraries/skills/core/FluxioValue.h> #include <RobotAPI/libraries/skills/core/ProviderID.h> #include <RobotAPI/libraries/skills/core/ProviderInfo.h> +#include <RobotAPI/libraries/skills/core/FluxioResult.h> #include <RobotAPI/libraries/skills/core/SkillExecutionRequest.h> #include <RobotAPI/libraries/skills/core/SkillStatusUpdate.h> @@ -84,7 +86,7 @@ namespace armarx::plugins std::vector<skills::FluxioSkill> getSkillList(); - std::optional<skills::FluxioSkill> getSkill(const std::string& id); + skills::Result<skills::FluxioSkill, skills::error::SkillException>getSkill(const std::string& id); void removeSkill(const std::string& id);