status.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef CRDTP_STATUS_H_
  5. #define CRDTP_STATUS_H_
  6. #include <cassert>
  7. #include <cstddef>
  8. #include <limits>
  9. #include <string>
  10. #include "export.h"
  11. namespace crdtp {
  12. // =============================================================================
  13. // Status and Error codes
  14. // =============================================================================
  15. enum class Error {
  16. OK = 0,
  17. // JSON parsing errors; checked when parsing / converting from JSON.
  18. // See json.{h,cc}.
  19. JSON_PARSER_UNPROCESSED_INPUT_REMAINS = 0x01,
  20. JSON_PARSER_STACK_LIMIT_EXCEEDED = 0x02,
  21. JSON_PARSER_NO_INPUT = 0x03,
  22. JSON_PARSER_INVALID_TOKEN = 0x04,
  23. JSON_PARSER_INVALID_NUMBER = 0x05,
  24. JSON_PARSER_INVALID_STRING = 0x06,
  25. JSON_PARSER_UNEXPECTED_ARRAY_END = 0x07,
  26. JSON_PARSER_COMMA_OR_ARRAY_END_EXPECTED = 0x08,
  27. JSON_PARSER_STRING_LITERAL_EXPECTED = 0x09,
  28. JSON_PARSER_COLON_EXPECTED = 0x0a,
  29. JSON_PARSER_UNEXPECTED_MAP_END = 0x0b,
  30. JSON_PARSER_COMMA_OR_MAP_END_EXPECTED = 0x0c,
  31. JSON_PARSER_VALUE_EXPECTED = 0x0d,
  32. // CBOR parsing errors; checked when parsing / converting from CBOR.
  33. CBOR_INVALID_INT32 = 0x0e,
  34. CBOR_INVALID_DOUBLE = 0x0f,
  35. CBOR_INVALID_ENVELOPE = 0x10,
  36. CBOR_ENVELOPE_CONTENTS_LENGTH_MISMATCH = 0x11,
  37. CBOR_MAP_OR_ARRAY_EXPECTED_IN_ENVELOPE = 0x12,
  38. CBOR_INVALID_STRING8 = 0x13,
  39. CBOR_INVALID_STRING16 = 0x14,
  40. CBOR_INVALID_BINARY = 0x15,
  41. CBOR_UNSUPPORTED_VALUE = 0x16,
  42. CBOR_UNEXPECTED_EOF_IN_ENVELOPE = 0x17,
  43. CBOR_INVALID_START_BYTE = 0x18,
  44. CBOR_UNEXPECTED_EOF_EXPECTED_VALUE = 0x19,
  45. CBOR_UNEXPECTED_EOF_IN_ARRAY = 0x1a,
  46. CBOR_UNEXPECTED_EOF_IN_MAP = 0x1b,
  47. CBOR_INVALID_MAP_KEY = 0x1c,
  48. CBOR_DUPLICATE_MAP_KEY = 0x1d,
  49. CBOR_STACK_LIMIT_EXCEEDED = 0x1e,
  50. CBOR_TRAILING_JUNK = 0x1f,
  51. CBOR_MAP_START_EXPECTED = 0x20,
  52. CBOR_MAP_STOP_EXPECTED = 0x21,
  53. CBOR_ARRAY_START_EXPECTED = 0x22,
  54. CBOR_ENVELOPE_SIZE_LIMIT_EXCEEDED = 0x23,
  55. // Message errors are constraints we place on protocol messages coming
  56. // from a protocol client; these are checked in crdtp::Dispatchable
  57. // (see dispatch.h) as it performs a shallow parse.
  58. MESSAGE_MUST_BE_AN_OBJECT = 0x24,
  59. MESSAGE_MUST_HAVE_INTEGER_ID_PROPERTY = 0x25,
  60. MESSAGE_MUST_HAVE_STRING_METHOD_PROPERTY = 0x26,
  61. MESSAGE_MAY_HAVE_STRING_SESSION_ID_PROPERTY = 0x27,
  62. MESSAGE_MAY_HAVE_OBJECT_PARAMS_PROPERTY = 0x28,
  63. MESSAGE_HAS_UNKNOWN_PROPERTY = 0x29,
  64. BINDINGS_MANDATORY_FIELD_MISSING = 0x30,
  65. BINDINGS_BOOL_VALUE_EXPECTED = 0x31,
  66. BINDINGS_INT32_VALUE_EXPECTED = 0x32,
  67. BINDINGS_DOUBLE_VALUE_EXPECTED = 0x33,
  68. BINDINGS_STRING_VALUE_EXPECTED = 0x34,
  69. BINDINGS_STRING8_VALUE_EXPECTED = 0x35,
  70. BINDINGS_BINARY_VALUE_EXPECTED = 0x36,
  71. BINDINGS_DICTIONARY_VALUE_EXPECTED = 0x37,
  72. BINDINGS_INVALID_BASE64_STRING = 0x38,
  73. };
  74. // A status value with position that can be copied. The default status
  75. // is OK. Usually, error status values should come with a valid position.
  76. struct CRDTP_EXPORT Status {
  77. static constexpr size_t npos() { return std::numeric_limits<size_t>::max(); }
  78. bool ok() const { return error == Error::OK; }
  79. Error error = Error::OK;
  80. size_t pos = npos();
  81. [[nodiscard]] Status(Error error, size_t pos) : error(error), pos(pos) {}
  82. Status() = default;
  83. bool IsMessageError() const {
  84. return error >= Error::MESSAGE_MUST_BE_AN_OBJECT &&
  85. error <= Error::MESSAGE_HAS_UNKNOWN_PROPERTY;
  86. }
  87. // Returns 7 bit US-ASCII string, either "OK" or an error message without
  88. // position.
  89. std::string Message() const;
  90. // Returns a 7 bit US-ASCII string, either "OK" or an error message that
  91. // includes the position.
  92. std::string ToASCIIString() const;
  93. };
  94. template <typename T>
  95. class StatusOr {
  96. public:
  97. explicit StatusOr(const T& value) : value_(value) {}
  98. explicit StatusOr(T&& value) : value_(std::move(value)) {}
  99. explicit StatusOr(const Status& status) : status_(status) {}
  100. bool ok() const { return status_.ok(); }
  101. T& operator*() & {
  102. assert(ok());
  103. return value_;
  104. }
  105. const T& operator*() const& { return value(); }
  106. T&& operator*() && { return value(); }
  107. const Status& status() const { return status_; }
  108. T& value() & { return *this; }
  109. T&& value() && {
  110. assert(ok());
  111. return std::move(value_);
  112. }
  113. const T& value() const& { return *this; }
  114. private:
  115. Status status_;
  116. T value_;
  117. };
  118. } // namespace crdtp
  119. #endif // CRDTP_STATUS_H_