3573d5e0fa
Note that changes in test expectation come from a more verbose error diagnostics for expected errors around input parameter validation. Original change: https://chromium-review.googlesource.com/c/deps/inspector_protocol/+/2270757 Bug: chromium:1099809 Change-Id: I4fc2efc9c89d0af645dad937d719fa36e1d33489 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2277142 Reviewed-by: Yang Guo <yangguo@chromium.org> Commit-Queue: Andrey Kosyakov <caseq@chromium.org> Cr-Commit-Position: refs/heads/master@{#68657}
139 lines
4.3 KiB
C++
139 lines
4.3 KiB
C++
// Copyright 2019 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef V8_CRDTP_STATUS_H_
|
|
#define V8_CRDTP_STATUS_H_
|
|
|
|
#include <cassert>
|
|
#include <cstddef>
|
|
#include <limits>
|
|
#include <string>
|
|
|
|
#include "export.h"
|
|
|
|
namespace v8_crdtp {
|
|
// =============================================================================
|
|
// Status and Error codes
|
|
// =============================================================================
|
|
|
|
enum class Error {
|
|
OK = 0,
|
|
|
|
// JSON parsing errors; checked when parsing / converting from JSON.
|
|
// See json.{h,cc}.
|
|
JSON_PARSER_UNPROCESSED_INPUT_REMAINS = 0x01,
|
|
JSON_PARSER_STACK_LIMIT_EXCEEDED = 0x02,
|
|
JSON_PARSER_NO_INPUT = 0x03,
|
|
JSON_PARSER_INVALID_TOKEN = 0x04,
|
|
JSON_PARSER_INVALID_NUMBER = 0x05,
|
|
JSON_PARSER_INVALID_STRING = 0x06,
|
|
JSON_PARSER_UNEXPECTED_ARRAY_END = 0x07,
|
|
JSON_PARSER_COMMA_OR_ARRAY_END_EXPECTED = 0x08,
|
|
JSON_PARSER_STRING_LITERAL_EXPECTED = 0x09,
|
|
JSON_PARSER_COLON_EXPECTED = 0x0a,
|
|
JSON_PARSER_UNEXPECTED_MAP_END = 0x0b,
|
|
JSON_PARSER_COMMA_OR_MAP_END_EXPECTED = 0x0c,
|
|
JSON_PARSER_VALUE_EXPECTED = 0x0d,
|
|
|
|
// CBOR parsing errors; checked when parsing / converting from CBOR.
|
|
CBOR_INVALID_INT32 = 0x0e,
|
|
CBOR_INVALID_DOUBLE = 0x0f,
|
|
CBOR_INVALID_ENVELOPE = 0x10,
|
|
CBOR_ENVELOPE_CONTENTS_LENGTH_MISMATCH = 0x11,
|
|
CBOR_MAP_OR_ARRAY_EXPECTED_IN_ENVELOPE = 0x12,
|
|
CBOR_INVALID_STRING8 = 0x13,
|
|
CBOR_INVALID_STRING16 = 0x14,
|
|
CBOR_INVALID_BINARY = 0x15,
|
|
CBOR_UNSUPPORTED_VALUE = 0x16,
|
|
CBOR_NO_INPUT = 0x17,
|
|
CBOR_INVALID_START_BYTE = 0x18,
|
|
CBOR_UNEXPECTED_EOF_EXPECTED_VALUE = 0x19,
|
|
CBOR_UNEXPECTED_EOF_IN_ARRAY = 0x1a,
|
|
CBOR_UNEXPECTED_EOF_IN_MAP = 0x1b,
|
|
CBOR_INVALID_MAP_KEY = 0x1c,
|
|
CBOR_DUPLICATE_MAP_KEY = 0x1d,
|
|
CBOR_STACK_LIMIT_EXCEEDED = 0x1e,
|
|
CBOR_TRAILING_JUNK = 0x1f,
|
|
CBOR_MAP_START_EXPECTED = 0x20,
|
|
CBOR_MAP_STOP_EXPECTED = 0x21,
|
|
CBOR_ARRAY_START_EXPECTED = 0x22,
|
|
CBOR_ENVELOPE_SIZE_LIMIT_EXCEEDED = 0x23,
|
|
|
|
// Message errors are constraints we place on protocol messages coming
|
|
// from a protocol client; these are checked in crdtp::Dispatchable
|
|
// (see dispatch.h) as it performs a shallow parse.
|
|
MESSAGE_MUST_BE_AN_OBJECT = 0x24,
|
|
MESSAGE_MUST_HAVE_INTEGER_ID_PROPERTY = 0x25,
|
|
MESSAGE_MUST_HAVE_STRING_METHOD_PROPERTY = 0x26,
|
|
MESSAGE_MAY_HAVE_STRING_SESSION_ID_PROPERTY = 0x27,
|
|
MESSAGE_MAY_HAVE_OBJECT_PARAMS_PROPERTY = 0x28,
|
|
MESSAGE_HAS_UNKNOWN_PROPERTY = 0x29,
|
|
|
|
BINDINGS_MANDATORY_FIELD_MISSING = 0x30,
|
|
BINDINGS_BOOL_VALUE_EXPECTED = 0x31,
|
|
BINDINGS_INT32_VALUE_EXPECTED = 0x32,
|
|
BINDINGS_DOUBLE_VALUE_EXPECTED = 0x33,
|
|
BINDINGS_STRING_VALUE_EXPECTED = 0x34,
|
|
BINDINGS_STRING8_VALUE_EXPECTED = 0x35,
|
|
BINDINGS_BINARY_VALUE_EXPECTED = 0x36,
|
|
};
|
|
|
|
// A status value with position that can be copied. The default status
|
|
// is OK. Usually, error status values should come with a valid position.
|
|
struct Status {
|
|
static constexpr size_t npos() { return std::numeric_limits<size_t>::max(); }
|
|
|
|
bool ok() const { return error == Error::OK; }
|
|
|
|
Error error = Error::OK;
|
|
size_t pos = npos();
|
|
Status(Error error, size_t pos) : error(error), pos(pos) {}
|
|
Status() = default;
|
|
|
|
bool IsMessageError() const {
|
|
return error >= Error::MESSAGE_MUST_BE_AN_OBJECT &&
|
|
error <= Error::MESSAGE_HAS_UNKNOWN_PROPERTY;
|
|
}
|
|
|
|
// Returns 7 bit US-ASCII string, either "OK" or an error message without
|
|
// position.
|
|
std::string Message() const;
|
|
|
|
// Returns a 7 bit US-ASCII string, either "OK" or an error message that
|
|
// includes the position.
|
|
std::string ToASCIIString() const;
|
|
};
|
|
|
|
template <typename T>
|
|
class StatusOr {
|
|
public:
|
|
explicit StatusOr(const T& value) : value_(value) {}
|
|
explicit StatusOr(T&& value) : value_(std::move(value)) {}
|
|
explicit StatusOr(const Status& status) : status_(status) {}
|
|
|
|
bool ok() const { return status_.ok(); }
|
|
T& operator*() & {
|
|
assert(ok());
|
|
return value_;
|
|
}
|
|
const T& operator*() const& { return value(); }
|
|
T&& operator*() && { return value(); }
|
|
const Status& status() const { return status_; }
|
|
|
|
T& value() & { return *this; }
|
|
T&& value() && {
|
|
assert(ok());
|
|
return std::move(value_);
|
|
}
|
|
const T& value() const& { return *this; }
|
|
|
|
private:
|
|
Status status_;
|
|
T value_;
|
|
};
|
|
|
|
} // namespace v8_crdtp
|
|
|
|
#endif // V8_CRDTP_STATUS_H_
|