Program Listing for File parameter_handler.hpp

Return to documentation for file (foxglove/include/foxglove/parameter_handler.hpp)

#pragma once

#include <foxglove/parameter.hpp>

#include <cstdint>
#include <functional>
#include <memory>
#include <optional>
#include <string_view>
#include <vector>

struct foxglove_get_parameters_responder;
struct foxglove_set_parameters_responder;

namespace foxglove {

namespace internal {
struct ForwarderAccess;
}

class GetParametersResponder final {
public:
  void respond(std::vector<Parameter>&& params) &&;

  ~GetParametersResponder() = default;
  GetParametersResponder(GetParametersResponder&&) noexcept = default;
  GetParametersResponder& operator=(GetParametersResponder&&) noexcept = default;
  GetParametersResponder(const GetParametersResponder&) = delete;
  GetParametersResponder& operator=(const GetParametersResponder&) = delete;

private:
  friend class WebSocketServer;
  friend class RemoteAccessGateway;
  friend struct internal::ForwarderAccess;

  struct Deleter {
    void operator()(foxglove_get_parameters_responder* ptr) const noexcept;
  };

  std::unique_ptr<foxglove_get_parameters_responder, Deleter> impl_;

  explicit GetParametersResponder(foxglove_get_parameters_responder* ptr)
      : impl_(ptr) {}
};

class SetParametersResponder final {
public:
  void respond(std::vector<Parameter>&& params) &&;

  ~SetParametersResponder() = default;
  SetParametersResponder(SetParametersResponder&&) noexcept = default;
  SetParametersResponder& operator=(SetParametersResponder&&) noexcept = default;
  SetParametersResponder(const SetParametersResponder&) = delete;
  SetParametersResponder& operator=(const SetParametersResponder&) = delete;

private:
  friend class WebSocketServer;
  friend class RemoteAccessGateway;
  friend struct internal::ForwarderAccess;

  struct Deleter {
    void operator()(foxglove_set_parameters_responder* ptr) const noexcept;
  };

  std::unique_ptr<foxglove_set_parameters_responder, Deleter> impl_;

  explicit SetParametersResponder(foxglove_set_parameters_responder* ptr)
      : impl_(ptr) {}
};

struct ParameterHandler {
  std::function<void(
    uint32_t client_id, std::optional<std::string_view> request_id,
    const std::vector<std::string_view>& param_names, GetParametersResponder&& responder
  )>
    onGet;

  std::function<void(
    uint32_t client_id, std::optional<std::string_view> request_id,
    const std::vector<ParameterView>& params, SetParametersResponder&& responder
  )>
    onSet;
};

}  // namespace foxglove