ladybird/Userland/Libraries/LibWeb/WebDriver/Response.h
Timothy Flynn ab99ed5fba LibIPC+Everywhere: Change IPC::encode's return type to ErrorOr
In doing so, this removes all uses of the Encoder's stream operator,
except for where it is currently still used in the generated IPC code.
So the stream operator currently discards any errors, which is the
existing behavior. A subsequent commit will propagate the errors.
2023-01-04 11:49:15 +01:00

55 lines
1.5 KiB
C++

/*
* Copyright (c) 2022, Tim Flynn <trflynn89@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/JsonValue.h>
#include <AK/Variant.h>
#include <LibIPC/Forward.h>
#include <LibWeb/WebDriver/Error.h>
namespace Web::WebDriver {
// FIXME: Ideally, this could be `using Response = ErrorOr<JsonValue, Error>`, but that won't be
// default-constructible, which is a requirement for the generated IPC.
struct Response {
Response() = default;
Response(JsonValue&&);
Response(Error&&);
JsonValue& value() { return m_value_or_error.template get<JsonValue>(); }
JsonValue const& value() const { return m_value_or_error.template get<JsonValue>(); }
Error& error() { return m_value_or_error.template get<Error>(); }
Error const& error() const { return m_value_or_error.template get<Error>(); }
bool is_error() const { return m_value_or_error.template has<Error>(); }
JsonValue release_value() { return move(value()); }
Error release_error() { return move(error()); }
template<typename... Visitors>
decltype(auto) visit(Visitors&&... visitors) const
{
return m_value_or_error.visit(forward<Visitors>(visitors)...);
}
private:
// Note: Empty is only a possible state until the Response has been decoded by IPC.
Variant<Empty, JsonValue, Error> m_value_or_error;
};
}
namespace IPC {
template<>
ErrorOr<void> encode(Encoder&, Web::WebDriver::Response const&);
template<>
ErrorOr<Web::WebDriver::Response> decode(Decoder&);
}