Response.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /*
  2. * Copyright (c) 2022, Tim Flynn <trflynn89@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/JsonValue.h>
  8. #include <AK/Variant.h>
  9. #include <LibIPC/Forward.h>
  10. #include <LibWeb/WebDriver/Error.h>
  11. namespace Web::WebDriver {
  12. // FIXME: Ideally, this could be `using Response = ErrorOr<JsonValue, Error>`, but that won't be
  13. // default-constructible, which is a requirement for the generated IPC.
  14. struct [[nodiscard]] Response {
  15. Response() = default;
  16. Response(JsonValue&&);
  17. Response(Error&&);
  18. JsonValue& value() { return m_value_or_error.template get<JsonValue>(); }
  19. JsonValue const& value() const { return m_value_or_error.template get<JsonValue>(); }
  20. Error& error() { return m_value_or_error.template get<Error>(); }
  21. Error const& error() const { return m_value_or_error.template get<Error>(); }
  22. bool is_error() const { return m_value_or_error.template has<Error>(); }
  23. JsonValue release_value() { return move(value()); }
  24. Error release_error() { return move(error()); }
  25. template<typename... Visitors>
  26. decltype(auto) visit(Visitors&&... visitors) const
  27. {
  28. return m_value_or_error.visit(forward<Visitors>(visitors)...);
  29. }
  30. private:
  31. // Note: Empty is only a possible state until the Response has been decoded by IPC.
  32. Variant<Empty, JsonValue, Error> m_value_or_error;
  33. };
  34. }
  35. namespace IPC {
  36. template<>
  37. ErrorOr<void> encode(Encoder&, Web::WebDriver::Response const&);
  38. template<>
  39. ErrorOr<Web::WebDriver::Response> decode(Decoder&);
  40. }