GetAvailableWorldsServiceHandler.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include "GetAvailableWorldsServiceHandler.h"
  9. #include "SimulationInterfaces/TagFilter.h"
  10. #include "SimulationInterfaces/WorldResource.h"
  11. #include <AzCore/std/iterator.h>
  12. #include <AzCore/std/ranges/ranges_algorithm.h>
  13. #include <AzCore/std/string/string.h>
  14. #include <Clients/CommonUtilities.h>
  15. #include <SimulationInterfaces/LevelManagerRequestBus.h>
  16. #include <simulation_interfaces/msg/result.hpp>
  17. #include <simulation_interfaces/msg/tags_filter.hpp>
  18. #include <simulation_interfaces/msg/world_resource.hpp>
  19. namespace ROS2SimulationInterfaces
  20. {
  21. namespace
  22. {
  23. [[nodiscard]] SimulationInterfaces::GetWorldsRequest ConvertROS2Request(
  24. const GetAvailableWorldsServiceHandler::Request& ros2Request)
  25. {
  26. SimulationInterfaces::GetWorldsRequest request;
  27. request.continueOnError = ros2Request.continue_on_error;
  28. request.offlineOnly = ros2Request.offline_only;
  29. // copy additional sources
  30. AZStd::ranges::transform(ros2Request.additional_sources, AZStd::back_inserter(request.additionalSources), &std::string::c_str);
  31. request.filter.m_mode = ros2Request.filter.filter_mode;
  32. AZStd::ranges::transform(
  33. ros2Request.filter.tags, AZStd::inserter(request.filter.m_tags, request.filter.m_tags.end()), &std::string::c_str);
  34. return request;
  35. }
  36. } // namespace
  37. AZStd::unordered_set<SimulationFeatureType> GetAvailableWorldsServiceHandler::GetProvidedFeatures()
  38. {
  39. return AZStd::unordered_set<SimulationFeatureType>{ SimulationFeatures::AVAILABLE_WORLDS };
  40. }
  41. AZStd::optional<GetAvailableWorldsServiceHandler::Response> GetAvailableWorldsServiceHandler::HandleServiceRequest(
  42. const std::shared_ptr<rmw_request_id_t> header, const Request& request)
  43. {
  44. Response response;
  45. AZ::Outcome<SimulationInterfaces::WorldResourcesList, SimulationInterfaces::FailedResult> availableWorlds;
  46. const SimulationInterfaces::GetWorldsRequest getWorldsRequest = ConvertROS2Request(request);
  47. SimulationInterfaces::LevelManagerRequestBus::BroadcastResult(
  48. availableWorlds, &SimulationInterfaces::LevelManagerRequests::GetAvailableWorlds, getWorldsRequest);
  49. if (!availableWorlds.IsSuccess())
  50. {
  51. response.result.result = availableWorlds.GetError().m_errorCode;
  52. response.result.error_message = availableWorlds.GetError().m_errorString.c_str();
  53. }
  54. else
  55. {
  56. response.result.result = simulation_interfaces::msg::Result::RESULT_OK;
  57. const auto& worldsList = availableWorlds.GetValue();
  58. AZStd::ranges::transform(
  59. worldsList, AZStd::back_inserter(response.worlds), &SimulationInterfaces::Utils::ConvertToRos2WorldResource);
  60. }
  61. return response;
  62. }
  63. } // namespace ROS2SimulationInterfaces