| 
									
										
										
										
											2022-11-08 09:42:36 -05:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * 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.
 | 
					
						
							| 
									
										
										
										
											2023-03-07 07:37:06 -05:00
										 |  |  | struct [[nodiscard]] Response { | 
					
						
							| 
									
										
										
										
											2022-11-08 09:42:36 -05:00
										 |  |  |     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 { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-15 11:24:59 -05:00
										 |  |  | template<> | 
					
						
							| 
									
										
										
										
											2023-01-01 23:37:35 -05:00
										 |  |  | ErrorOr<void> encode(Encoder&, Web::WebDriver::Response const&); | 
					
						
							| 
									
										
										
										
											2022-11-15 11:24:59 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | template<> | 
					
						
							| 
									
										
										
										
											2022-12-22 20:40:33 -05:00
										 |  |  | ErrorOr<Web::WebDriver::Response> decode(Decoder&); | 
					
						
							| 
									
										
										
										
											2022-11-08 09:42:36 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | } |