Serenity Operating System
at master 70 lines 1.8 kB view raw
1/* 2 * Copyright (c) 2022, Tim Flynn <trflynn89@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <LibIPC/Decoder.h> 8#include <LibIPC/Encoder.h> 9#include <LibWeb/WebDriver/Response.h> 10 11enum class ResponseType : u8 { 12 Success, 13 Error, 14}; 15 16namespace Web::WebDriver { 17 18Response::Response(JsonValue&& value) 19 : m_value_or_error(move(value)) 20{ 21} 22 23Response::Response(Error&& error) 24 : m_value_or_error(move(error)) 25{ 26} 27 28} 29 30template<> 31ErrorOr<void> IPC::encode(Encoder& encoder, Web::WebDriver::Response const& response) 32{ 33 return response.visit( 34 [](Empty) -> ErrorOr<void> { VERIFY_NOT_REACHED(); }, 35 [&](JsonValue const& value) -> ErrorOr<void> { 36 TRY(encoder.encode(ResponseType::Success)); 37 TRY(encoder.encode(value)); 38 return {}; 39 }, 40 [&](Web::WebDriver::Error const& error) -> ErrorOr<void> { 41 TRY(encoder.encode(ResponseType::Error)); 42 TRY(encoder.encode(error.http_status)); 43 TRY(encoder.encode(error.error)); 44 TRY(encoder.encode(error.message)); 45 TRY(encoder.encode(error.data)); 46 return {}; 47 }); 48} 49 50template<> 51ErrorOr<Web::WebDriver::Response> IPC::decode(Decoder& decoder) 52{ 53 auto type = TRY(decoder.decode<ResponseType>()); 54 55 switch (type) { 56 case ResponseType::Success: 57 return TRY(decoder.decode<JsonValue>()); 58 59 case ResponseType::Error: { 60 auto http_status = TRY(decoder.decode<unsigned>()); 61 auto error = TRY(decoder.decode<DeprecatedString>()); 62 auto message = TRY(decoder.decode<DeprecatedString>()); 63 auto data = TRY(decoder.decode<Optional<JsonValue>>()); 64 65 return Web::WebDriver::Error { http_status, move(error), move(message), move(data) }; 66 } 67 } 68 69 VERIFY_NOT_REACHED(); 70}