From aae8a2c2a159a15e70e92a1d7008f3194821f414 Mon Sep 17 00:00:00 2001 From: Alex Kremer Date: Fri, 25 Sep 2026 14:36:31 +0100 Subject: [PATCH 1/4] Fix windows compilation --- CMakeLists.txt | 2 +- include/rpcspec/FieldSpec.hpp | 19 ++++++++--- include/rpcspec/RpcSpec.hpp | 14 ++++++-- include/rpcspec/Typed.hpp | 50 +++++++++++++++++++--------- include/rpcspec/detail/XrplParse.hpp | 21 ++++++++++-- tests/SpecLedgerIndexTests.cpp | 16 +++++++++ 6 files changed, 96 insertions(+), 26 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5434f3e..928321a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.20) -project(xrpl-rpc-spec VERSION 0.1.18 LANGUAGES CXX) +project(xrpl-rpc-spec VERSION 0.1.19 LANGUAGES CXX) add_library(rpcspec INTERFACE) add_library(rpcspec::rpcspec ALIAS rpcspec) diff --git a/include/rpcspec/FieldSpec.hpp b/include/rpcspec/FieldSpec.hpp index 71da829..fa8ff62 100644 --- a/include/rpcspec/FieldSpec.hpp +++ b/include/rpcspec/FieldSpec.hpp @@ -4,8 +4,10 @@ #include #include +#include #include #include +#include namespace rpc::spec { @@ -148,11 +150,7 @@ struct FieldSpec [[nodiscard]] consteval auto operator|(Item item) const { - return std::apply( - [&](auto const&... existing) { - return FieldSpec{key, existing..., item}; - }, - items); + return appendItem(item, std::index_sequence_for{}); } /** @@ -225,6 +223,17 @@ struct FieldSpec runChecks(items, childView, out); return out; } + +private: + // Expanded with an index sequence rather than std::apply and a lambda: the lambda is not an + // immediate function, so calling a consteval constructor from it relies on P2564, which + // MSVC does not implement. + template + [[nodiscard]] consteval auto + appendItem(Item item, std::index_sequence) const + { + return FieldSpec{key, std::get(items)..., item}; + } }; /** diff --git a/include/rpcspec/RpcSpec.hpp b/include/rpcspec/RpcSpec.hpp index bb63846..8087a33 100644 --- a/include/rpcspec/RpcSpec.hpp +++ b/include/rpcspec/RpcSpec.hpp @@ -282,12 +282,22 @@ RpcSpec(Fs...) -> RpcSpec; * @param extra Additional fields appended after the base fields. * @return A new `RpcSpec` combining base and extra fields. */ +namespace detail { + +template +[[nodiscard]] consteval auto +extendUntyped(RpcSpec const& base, std::index_sequence, Extra... extra) +{ + return RpcSpec{std::get(base.fields)..., extra...}; +} + +} // namespace detail + template [[nodiscard]] consteval auto extend(RpcSpec const& base, Extra... extra) { - return std::apply( - [&](auto const&... existing) { return RpcSpec{existing..., extra...}; }, base.fields); + return detail::extendUntyped(base, std::index_sequence_for{}, extra...); } /** diff --git a/include/rpcspec/Typed.hpp b/include/rpcspec/Typed.hpp index 3eba3e6..afb0518 100644 --- a/include/rpcspec/Typed.hpp +++ b/include/rpcspec/Typed.hpp @@ -250,12 +250,7 @@ struct PartialBoundField [[nodiscard]] consteval auto operator|(Item item) const { - return std::apply( - [&](auto const&... existing) { - return PartialBoundField{ - key, member, existing..., item}; - }, - items); + return appendItem(item, std::index_sequence_for{}); } /** @@ -269,11 +264,27 @@ struct PartialBoundField [[nodiscard]] consteval auto operator|(Conv conv) const { - return std::apply( - [&](auto const&... existing) { - return BoundField{key, member, conv, existing...}; - }, - items); + return complete(conv, std::index_sequence_for{}); + } + +private: + // Expanded with an index sequence rather than std::apply and a lambda: the lambda is not an + // immediate function, so calling a consteval constructor from it relies on P2564, which + // MSVC does not implement. + template + [[nodiscard]] consteval auto + appendItem(Item item, std::index_sequence) const + { + return PartialBoundField{ + key, member, std::get(items)..., item}; + } + + template + [[nodiscard]] consteval auto + complete(Conv conv, std::index_sequence) const + { + return BoundField{ + key, member, conv, std::get(items)...}; } }; @@ -632,15 +643,22 @@ spec(Fields... fields) * @param extra Fields appended after the base fields. * @return A new spec combining base and extra fields. */ +namespace detail { + +template +[[nodiscard]] consteval auto +extendTyped(TypedSpec const& base, std::index_sequence, Extra... extra) +{ + return TypedSpec{std::get(base.fields)..., extra...}; +} + +} // namespace detail + template [[nodiscard]] consteval auto extend(TypedSpec const& base, Extra... extra) { - return std::apply( - [&](auto const&... existing) { - return TypedSpec{existing..., extra...}; - }, - base.fields); + return detail::extendTyped(base, std::index_sequence_for{}, extra...); } } // namespace rpc::spec diff --git a/include/rpcspec/detail/XrplParse.hpp b/include/rpcspec/detail/XrplParse.hpp index db044ba..c0a28a7 100644 --- a/include/rpcspec/detail/XrplParse.hpp +++ b/include/rpcspec/detail/XrplParse.hpp @@ -16,7 +16,10 @@ #include #include #include +#include +#include #include +#include #include #include #include @@ -174,10 +177,24 @@ issuerFromValidated(std::string const& issuer) [[nodiscard]] inline std::optional systemTpFromUtcStr(std::string const& dateStr, std::string const& format) { + // std::get_time rather than strptime, and calendar arithmetic rather than timegm: neither + // POSIX function exists on MSVC. + // + // The sentinel makes input that ends before the format does fail, as strptime does: + // std::get_time only sets eofbit there, which would accept a timestamp missing its suffix. std::tm ts{}; - if (strptime(dateStr.c_str(), format.c_str(), &ts) == nullptr) + std::istringstream in{dateStr + '\x01'}; + in.imbue(std::locale::classic()); + in >> std::get_time(&ts, format.c_str()); + if (in.fail()) return std::nullopt; - return std::chrono::system_clock::from_time_t(timegm(&ts)); + + using namespace std::chrono; + // Not checked with ok(): an out-of-range day such as Feb 30 converts to the equivalent later + // date, which is how timegm normalised it. + auto const date = year{ts.tm_year + 1900} / month{static_cast(ts.tm_mon + 1)} / + day{static_cast(ts.tm_mday)}; + return sys_days{date} + hours{ts.tm_hour} + minutes{ts.tm_min} + seconds{ts.tm_sec}; } } // namespace rpc::spec::detail diff --git a/tests/SpecLedgerIndexTests.cpp b/tests/SpecLedgerIndexTests.cpp index 9b8460c..4ce9fb1 100644 --- a/tests/SpecLedgerIndexTests.cpp +++ b/tests/SpecLedgerIndexTests.cpp @@ -16,6 +16,7 @@ #include // IWYU pragma: keep +#include #include #include @@ -49,6 +50,21 @@ TEST(LedgerIndexSpec, WellFormedDateParses) ASSERT_TRUE(result->date.has_value()); } +TEST(LedgerIndexSpec, DateMapsToExactUtcInstant) +{ + auto const seconds = [](char const* date) { + auto const result = parse(std::format(R"JSON({{"date": "{}"}})JSON", date)); + EXPECT_TRUE(result.has_value() and result->date.has_value()) << "date=" << date; + return std::chrono::duration_cast(result->date->time_since_epoch()) + .count(); + }; + + EXPECT_EQ(seconds("1970-01-01T00:00:00Z"), 0); + EXPECT_EQ(seconds("2024-01-15T12:30:45Z"), 1705321845); + // An out-of-range day rolls forward, as timegm normalised it: Feb 30 is Mar 1. + EXPECT_EQ(seconds("2024-02-30T00:00:00Z"), seconds("2024-03-01T00:00:00Z")); +} + TEST(LedgerIndexSpec, DistinctDatesProduceDistinctTimePoints) { auto const a = parse(R"JSON({"date": "2024-01-15T12:30:45Z"})JSON"); From f98c6b5ae890993e9f16307ba5701ac41a83db3d Mon Sep 17 00:00:00 2001 From: Alex Kremer Date: Fri, 25 Sep 2026 15:14:37 +0100 Subject: [PATCH 2/4] Rename Rippled to Xrpld --- include/rpcspec/Converters.hpp | 12 ++-- include/rpcspec/Errors.hpp | 24 +++---- include/rpcspec/Section.hpp | 2 +- include/rpcspec/Validators.hpp | 68 +++++++++--------- .../rpcspec/handlers/account_lines/Spec.hpp | 6 +- .../rpcspec/handlers/account_offers/Spec.hpp | 2 +- include/rpcspec/handlers/account_tx/Spec.hpp | 15 ++-- include/rpcspec/handlers/amm_info/Spec.hpp | 20 +++--- include/rpcspec/handlers/book_offers/Spec.hpp | 34 ++++----- include/rpcspec/handlers/feature/Spec.hpp | 2 +- .../handlers/gateway_balances/Spec.hpp | 19 +++-- .../handlers/get_aggregate_price/Spec.hpp | 20 +++--- .../rpcspec/handlers/ledger_entry/Spec.hpp | 4 +- .../mptoken_issuance_history/Spec.hpp | 6 +- include/rpcspec/handlers/nft_history/Spec.hpp | 2 +- .../rpcspec/handlers/noripple_check/Spec.hpp | 2 +- include/rpcspec/handlers/subscribe/Spec.hpp | 71 +++++++++---------- include/rpcspec/handlers/unsubscribe/Spec.hpp | 67 +++++++++-------- include/rpcspec/handlers/vault_info/Spec.hpp | 4 +- tests/SpecAccountLinesTests.cpp | 16 ++--- tests/SpecAccountOffersTests.cpp | 16 ++--- tests/SpecAccountTxDelegateTests.cpp | 10 +-- tests/SpecAmmInfoTests.cpp | 16 ++--- tests/SpecBookOffersTests.cpp | 16 ++--- tests/SpecClioErrorsTests.cpp | 8 +-- tests/SpecClioHandlerErrorsTests.cpp | 4 +- tests/SpecCoreTests.cpp | 10 +-- tests/SpecDepositAuthorizedTests.cpp | 12 ++-- tests/SpecGatewayBalancesTests.cpp | 14 ++-- tests/SpecGetAggregatePriceTests.cpp | 18 ++--- tests/SpecLedgerDataTests.cpp | 8 +-- tests/SpecLedgerEntryTests.cpp | 6 +- tests/SpecLedgerIndexTests.cpp | 4 +- tests/SpecLedgerTests.cpp | 16 ++--- tests/SpecMPTHoldersTests.cpp | 2 +- tests/SpecMPTokenIssuanceHistoryTests.cpp | 6 +- tests/SpecMockBackendTests.cpp | 6 +- tests/SpecModifierTests.cpp | 34 ++++----- tests/SpecNftHistoryTests.cpp | 2 +- tests/SpecNoRippleCheckTests.cpp | 6 +- tests/SpecServerConditionalTests.cpp | 12 ++-- tests/SpecSubscribeTests.cpp | 28 ++++---- tests/SpecValidatorTests.cpp | 68 +++++++++--------- tests/SpecVaultInfoTests.cpp | 12 ++-- 44 files changed, 362 insertions(+), 368 deletions(-) diff --git a/include/rpcspec/Converters.hpp b/include/rpcspec/Converters.hpp index 9a47b4d..50d7549 100644 --- a/include/rpcspec/Converters.hpp +++ b/include/rpcspec/Converters.hpp @@ -66,13 +66,13 @@ struct AccountIdConverter if (not fieldView.isString()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, std::string{fieldView.key()} + "NotString"}}; + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "NotString"}}; } auto id = detail::accountFromStringStrict(std::string{fieldView.asString()}); if (not id.has_value()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcActMalformed, std::string{fieldView.key()} + "Malformed"}}; + rpc::XrpldError::RpcActMalformed, std::string{fieldView.key()} + "Malformed"}}; } return *id; } @@ -204,7 +204,7 @@ struct JsonBoolConverterT if constexpr (Strict) { if (not fieldView.isBool()) - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; return JsonBool{fieldView.asBool()}; } else @@ -261,7 +261,7 @@ struct Uint32Converter parse(View const& fieldView) const { if (not fieldView.isUint32()) - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; return fieldView.asUint32(); } }; @@ -293,7 +293,7 @@ struct StringConverter parse(View const& fieldView) const { if (not fieldView.isString()) - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; return std::string{fieldView.asString()}; } }; @@ -335,7 +335,7 @@ struct AccountIdActMalformedConverter id.has_value()) return *id; } - return std::unexpected{rpc::Status{rpc::RippledError::RpcActMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcActMalformed}}; } }; diff --git a/include/rpcspec/Errors.hpp b/include/rpcspec/Errors.hpp index ac695fb..d21626d 100644 --- a/include/rpcspec/Errors.hpp +++ b/include/rpcspec/Errors.hpp @@ -51,24 +51,24 @@ enum class ClioError { #endif /** - * @brief Clio uses compatible Rippled error codes for most RPC errors. + * @brief xrpld's RPC error codes, which Clio also uses for most of its errors. */ -using RippledError = xrpl::ErrorCodeI; +using XrpldError = xrpl::ErrorCodeI; #if defined(RPCSPEC_IS_CLIO) /** - * @brief Clio operates on a combination of Rippled and custom Clio error codes. + * @brief Clio operates on a combination of xrpld and custom Clio error codes. * - * @see RippledError For xrpld error codes + * @see XrpldError For xrpld error codes * @see ClioError For custom clio error codes */ -using CombinedError = std::variant; +using CombinedError = std::variant; #else /** * @brief In xrpld builds the only error surface is xrpld's own; there are no Clio codes. - * @see RippledError For xrpld error codes + * @see XrpldError For xrpld error codes */ -using CombinedError = std::variant; +using CombinedError = std::variant; #endif // TODO: these are possibly worth unifying at some point instead of trying to keep separated and @@ -373,7 +373,7 @@ struct Status */ operator bool() const { - if (auto err = std::get_if(&code)) + if (auto err = std::get_if(&code)) return *err != xrpl::RpcSuccess; return true; @@ -381,15 +381,15 @@ struct Status /** * @brief Returns true if the @ref rpc::Status contains the desired @ref - * rpc::RippledError + * rpc::XrpldError * - * @param other The @ref rpc::RippledError to match + * @param other The @ref rpc::XrpldError to match * @return true if status matches given error; false otherwise */ bool - operator==(RippledError other) const + operator==(XrpldError other) const { - if (auto err = std::get_if(&code)) + if (auto err = std::get_if(&code)) return *err == other; return false; diff --git a/include/rpcspec/Section.hpp b/include/rpcspec/Section.hpp index 2d32f3b..85e0a45 100644 --- a/include/rpcspec/Section.hpp +++ b/include/rpcspec/Section.hpp @@ -61,7 +61,7 @@ struct Section if (not fieldView.present()) return {}; if (not fieldView.isObject()) - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; MaybeError result{}; std::apply( diff --git a/include/rpcspec/Validators.hpp b/include/rpcspec/Validators.hpp index 7252306..7f2a3a1 100644 --- a/include/rpcspec/Validators.hpp +++ b/include/rpcspec/Validators.hpp @@ -59,7 +59,7 @@ struct Required if (not fieldView.present()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, + rpc::XrpldError::RpcInvalidParams, "Required field '" + std::string{fieldView.key()} + "' missing"}}; } return {}; @@ -128,7 +128,7 @@ struct Type { if (not fieldView.present() or fieldView.template is()) return {}; - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; } }; @@ -175,7 +175,7 @@ struct Type if (fieldView.template is() or fieldView.template is() or (fieldView.template is() or ...)) return {}; - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; } }; @@ -276,7 +276,7 @@ struct Min { auto const value = detail::numericValue(fieldView); if (value.has_value() and *value < bound) - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; return {}; } }; @@ -507,12 +507,12 @@ struct AccountFormat if (not fieldView.isString()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, std::string{fieldView.key()} + "NotString"}}; + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "NotString"}}; } if (not detail::accountFromStringStrict(std::string{fieldView.asString()})) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcActMalformed, std::string{fieldView.key()} + "Malformed"}}; + rpc::XrpldError::RpcActMalformed, std::string{fieldView.key()} + "Malformed"}}; } return {}; } @@ -570,9 +570,9 @@ class TimeFormatValidator final if (not fieldView.present()) return {}; if (not fieldView.isString()) - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; if (not detail::systemTpFromUtcStr(std::string{fieldView.asString()}, std::string{format_})) - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; return {}; } }; @@ -699,8 +699,8 @@ struct LedgerIndexValidator return {}; auto const unrecognised = [] { - return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, rpc::malformedLedgerIndexMessage()}}; + return std::unexpected{ + rpc::Status{rpc::XrpldError::RpcInvalidParams, rpc::malformedLedgerIndexMessage()}}; }; if (not fieldView.isString()) @@ -713,7 +713,7 @@ struct LedgerIndexValidator } else { - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; } } @@ -759,7 +759,7 @@ struct AccountBase58Validator if (not fieldView.isString()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, std::string{fieldView.key()} + "NotString"}}; + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "NotString"}}; } auto const account = detail::parseBase58Wrapper(std::string{fieldView.asString()}); @@ -800,13 +800,13 @@ struct CurrencyValidator if (not fieldView.isString()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, std::string{fieldView.key()} + "NotString"}}; + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "NotString"}}; } auto const str = std::string{fieldView.asString()}; if (str.empty()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, std::string{fieldView.key()} + "IsEmpty"}}; + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "IsEmpty"}}; } xrpl::Currency currency; if (not xrpl::toCurrency(currency, str)) @@ -846,19 +846,19 @@ struct IssuerValidator if (not fieldView.isString()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, std::string{fieldView.key()} + "NotString"}}; + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "NotString"}}; } xrpl::AccountID issuer; if (not xrpl::toIssuer(issuer, std::string{fieldView.asString()})) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, + rpc::XrpldError::RpcInvalidParams, std::format("Invalid field '{}', bad issuer.", fieldView.key())}}; } if (issuer == xrpl::noAccount()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, + rpc::XrpldError::RpcInvalidParams, std::format("Invalid field '{}', bad issuer account one.", fieldView.key())}}; } return {}; @@ -895,7 +895,7 @@ struct CurrencyIssueValidator if (not fieldView.isObject()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, std::string{fieldView.key()} + "NotObject"}}; + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "NotObject"}}; } auto const currView = fieldView.child("currency"); if (not currView.present() or not currView.isString()) @@ -960,19 +960,19 @@ struct ToNumberModifier auto const sv = fieldView.asString(); if (sv.find('.') != std::string_view::npos) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; } int64_t val = 0; auto [ptr, ec] = std::from_chars(sv.data(), sv.data() + sv.size(), val); if (ec != std::errc() or ptr != sv.data() + sv.size()) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; } // Every consumer reads the result back through FieldView::asUint32(), which casts // without checking. Reject anything that would silently become a different number. if (val < 0 or val > int64_t{std::numeric_limits::max()}) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; } fieldView.set(val); return {}; @@ -1244,7 +1244,7 @@ struct NotSupported if (fieldView.present()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcNotSupported, + rpc::XrpldError::RpcNotSupported, "Not supported field '" + std::string{fieldView.key()} + "'"}}; } return {}; @@ -1309,7 +1309,7 @@ struct NotSupportedIfEqual if (not fieldView.present() or not fieldView.isBool() or fieldView.asBool() != value) return {}; return std::unexpected{rpc::Status{ - rpc::RippledError::RpcNotSupported, + rpc::XrpldError::RpcNotSupported, std::format("Not supported field '{}'s value '{}'", fieldView.key(), value)}}; } }; @@ -1369,11 +1369,11 @@ struct OneOfValidator return {}; if (not fieldView.isString()) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; } if (std::ranges::contains(values, fieldView.asString())) return {}; - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; } }; @@ -1474,7 +1474,7 @@ struct Between { auto const value = detail::numericValue(fieldView); if (value.has_value() and (*value < lo or *value > hi)) - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; return {}; } }; @@ -1578,7 +1578,7 @@ struct Hex256ArrayValidator { // Mirrors old behaviour: a non-array credentials field is rejected by the leading // Type check which produces a plain RpcInvalidParams ("Invalid parameters."). - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; } auto const size = fieldView.arraySize(); for (auto i = 0uz; i < size; ++i) @@ -1587,13 +1587,13 @@ struct Hex256ArrayValidator if (not elem.isString()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, "Item is not a valid uint256 type."}}; + rpc::XrpldError::RpcInvalidParams, "Item is not a valid uint256 type."}}; } xrpl::uint256 parsed; if (not parsed.parseHex(std::string{elem.asString()}.c_str())) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, "Item is not a valid uint256 type."}}; + rpc::XrpldError::RpcInvalidParams, "Item is not a valid uint256 type."}}; } } return {}; @@ -1629,7 +1629,7 @@ struct AccountMarkerValidator if (not fieldView.isString()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, std::string{fieldView.key()} + "NotString"}}; + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "NotString"}}; } auto const sv = fieldView.asString(); auto const commaPos = sv.find(','); @@ -1682,14 +1682,14 @@ struct AccountTypeValidator if (not fieldView.isString()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, + rpc::XrpldError::RpcInvalidParams, std::format("Invalid field '{}', not string.", fieldView.key())}}; } auto const type = accountOwnedLedgerTypeFromStr(std::string{fieldView.asString()}); if (type == xrpl::ltANY) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, + rpc::XrpldError::RpcInvalidParams, std::format("Invalid field '{}'.", fieldView.key())}}; } return {}; @@ -1788,14 +1788,14 @@ struct LedgerEntryTypeValidator if (not fieldView.isString()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, + rpc::XrpldError::RpcInvalidParams, std::format("Invalid field '{}', not string.", fieldView.key())}}; } auto const type = ledgerEntryTypeFromStr(std::string{fieldView.asString()}); if (type == xrpl::ltANY) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, + rpc::XrpldError::RpcInvalidParams, std::format("Invalid field '{}'.", fieldView.key())}}; } return {}; diff --git a/include/rpcspec/handlers/account_lines/Spec.hpp b/include/rpcspec/handlers/account_lines/Spec.hpp index 87a9a50..62676f6 100644 --- a/include/rpcspec/handlers/account_lines/Spec.hpp +++ b/include/rpcspec/handlers/account_lines/Spec.hpp @@ -44,10 +44,10 @@ struct AccountIdActMalformedConverter parse(View const& fieldView) const { if (not fieldView.isString()) - return std::unexpected{rpc::Status{rpc::RippledError::RpcActMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcActMalformed}}; auto id = detail::accountFromStringStrict(std::string{fieldView.asString()}); if (not id.has_value()) - return std::unexpected{rpc::Status{rpc::RippledError::RpcActMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcActMalformed}}; return *id; } }; @@ -79,7 +79,7 @@ struct AsBoolConverter parse(View const& fieldView) const { if (not fieldView.isBool()) - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; return fieldView.asBool(); } }; diff --git a/include/rpcspec/handlers/account_offers/Spec.hpp b/include/rpcspec/handlers/account_offers/Spec.hpp index f5020e7..2acfaeb 100644 --- a/include/rpcspec/handlers/account_offers/Spec.hpp +++ b/include/rpcspec/handlers/account_offers/Spec.hpp @@ -48,7 +48,7 @@ struct AccountMarkerStrConverter if (not fieldView.isString()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, std::string{fieldView.key()} + "NotString"}}; + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "NotString"}}; } auto const sv = fieldView.asString(); auto const malformed = [&] { diff --git a/include/rpcspec/handlers/account_tx/Spec.hpp b/include/rpcspec/handlers/account_tx/Spec.hpp index eb07f9a..f8f4c9a 100644 --- a/include/rpcspec/handlers/account_tx/Spec.hpp +++ b/include/rpcspec/handlers/account_tx/Spec.hpp @@ -29,14 +29,14 @@ namespace rpc::spec::handlers::account_tx { inline constexpr auto kTxTypeValidator = CustomValidator{[](auto const& fieldView) -> MaybeError { if (not fieldView.isString()) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; } auto const& validTypes = txTypesInLowercase(); auto const sv = fieldView.asString(); if (not validTypes.contains(std::string{sv})) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, + rpc::XrpldError::RpcInvalidParams, "Invalid field '" + std::string{fieldView.key()} + "'."}}; } return {}; @@ -114,22 +114,21 @@ inline constexpr auto kDelegateValidator = CustomValidator{[](auto const& fieldV if (not fieldView.isObject()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, std::string{fieldView.key()} + "NotObject"}}; + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "NotObject"}}; } auto const filterView = fieldView.child("delegate_filter"); if (not filterView.present()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, - "Field 'delegate_filter' is required but missing."}}; + rpc::XrpldError::RpcInvalidParams, "Field 'delegate_filter' is required but missing."}}; } if (not filterView.isString() or (filterView.asString() != "actor" and filterView.asString() != "authorizer")) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, + rpc::XrpldError::RpcInvalidParams, "Field 'delegate_filter' value must be 'actor' or 'authorizer'."}}; } @@ -139,7 +138,7 @@ inline constexpr auto kDelegateValidator = CustomValidator{[](auto const& fieldV if (auto const err = AccountFormat::verify(counterPartyView); not err.has_value()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcActMalformed, + rpc::XrpldError::RpcActMalformed, "Field 'counter_party' value must be a valid account."}}; } } @@ -223,7 +222,7 @@ inline constexpr auto kInputSpecV1 = spec( field( "marker", &Input::marker, - withCustomError(type, rpc::RippledError::RpcInvalidParams, "invalidMarker"), + withCustomError(type, rpc::XrpldError::RpcInvalidParams, "invalidMarker"), ifType(section( field("ledger", required, type), field("seq", required, type))), diff --git a/include/rpcspec/handlers/amm_info/Spec.hpp b/include/rpcspec/handlers/amm_info/Spec.hpp index aa6fa33..92dc8b4 100644 --- a/include/rpcspec/handlers/amm_info/Spec.hpp +++ b/include/rpcspec/handlers/amm_info/Spec.hpp @@ -33,7 +33,7 @@ inline constexpr auto kStringIssueValidator = } catch (std::runtime_error const&) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcIssueMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcIssueMalformed}}; } return {}; }}; @@ -72,7 +72,7 @@ struct IssueConverter } catch (std::runtime_error const&) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcIssueMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcIssueMalformed}}; } } if (fieldView.isObject()) @@ -82,21 +82,21 @@ struct IssueConverter auto const currSv = fieldView.child("currency").asString(); xrpl::Currency currency{}; if (not xrpl::toCurrency(currency, std::string{currSv})) - return std::unexpected{rpc::Status{rpc::RippledError::RpcIssueMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcIssueMalformed}}; if (xrpl::isXRP(currency)) return xrpl::xrpIssue(); auto const issuerSv = fieldView.child("issuer").asString(); xrpl::AccountID issuer{}; if (not xrpl::toIssuer(issuer, std::string{issuerSv})) - return std::unexpected{rpc::Status{rpc::RippledError::RpcIssueMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcIssueMalformed}}; return xrpl::Issue{currency, issuer}; } catch (...) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcIssueMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcIssueMalformed}}; } } - return std::unexpected{rpc::Status{rpc::RippledError::RpcIssueMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcIssueMalformed}}; } }; @@ -114,16 +114,16 @@ inline constexpr auto kInputSpec = spec( field( "asset", &Input::issue1, - withCustomError(type, rpc::RippledError::RpcIssueMalformed), + withCustomError(type, rpc::XrpldError::RpcIssueMalformed), ifType(kStringIssueValidator), - ifType(withCustomError(currencyIssue, rpc::RippledError::RpcIssueMalformed)), + ifType(withCustomError(currencyIssue, rpc::XrpldError::RpcIssueMalformed)), issueConv), field( "asset2", &Input::issue2, - withCustomError(type, rpc::RippledError::RpcIssueMalformed), + withCustomError(type, rpc::XrpldError::RpcIssueMalformed), ifType(kStringIssueValidator), - ifType(withCustomError(currencyIssue, rpc::RippledError::RpcIssueMalformed)), + ifType(withCustomError(currencyIssue, rpc::XrpldError::RpcIssueMalformed)), issueConv), field("amm_account", &Input::ammAccount, accountIdActMalformed), field("account", &Input::accountID, accountIdActMalformed)); diff --git a/include/rpcspec/handlers/book_offers/Spec.hpp b/include/rpcspec/handlers/book_offers/Spec.hpp index 4761faf..eb1fa6a 100644 --- a/include/rpcspec/handlers/book_offers/Spec.hpp +++ b/include/rpcspec/handlers/book_offers/Spec.hpp @@ -22,7 +22,7 @@ namespace rpc::spec::handlers::book_offers { /** * @brief Converts the taker asset field into its strongly-typed value. */ -template +template struct TakerAssetConverter { /** @@ -110,7 +110,7 @@ struct TakerConverter { auto const err = [] { return std::unexpected{ - rpc::Status{rpc::RippledError::RpcInvalidParams, "Invalid field 'taker'."}}; + rpc::Status{rpc::XrpldError::RpcInvalidParams, "Invalid field 'taker'."}}; }; if (not fieldView.isString()) return err(); @@ -136,14 +136,14 @@ inline constexpr auto kTakerValidator = CustomValidator{[](auto const& fieldView if (not hasCurrency and not hasMptId) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, + rpc::XrpldError::RpcInvalidParams, "Missing field '" + std::string{fieldView.key()} + ".currency'."}}; } if (hasMptId and (hasCurrency or fieldView.child("issuer").present())) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, + rpc::XrpldError::RpcInvalidParams, "Invalid field '" + std::string{fieldView.key()} + "'."}}; } @@ -155,14 +155,14 @@ inline constexpr auto kTakerValidator = CustomValidator{[](auto const& fieldView if (hasCurrency and not currencyView.isString()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, + rpc::XrpldError::RpcInvalidParams, "Invalid field '" + std::string{fieldView.key()} + ".currency', not string."}}; } if (hasMptId and not mptView.isString()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, + rpc::XrpldError::RpcInvalidParams, "Invalid field '" + std::string{fieldView.key()} + ".mpt_issuance_id', not string."}}; } @@ -173,12 +173,12 @@ inline constexpr auto kTakerValidator = CustomValidator{[](auto const& fieldView /** * @brief Converter instance: taker asset. */ -inline constexpr auto takerPaysConv = TakerAssetConverter{}; +inline constexpr auto takerPaysConv = TakerAssetConverter{}; /** * @brief Converter instance: taker asset. */ -inline constexpr auto takerGetsConv = TakerAssetConverter{}; +inline constexpr auto takerGetsConv = TakerAssetConverter{}; /** * @brief Converter instance: taker. @@ -197,9 +197,9 @@ inline constexpr auto kInputSpec = spec( type, kTakerValidator, section( - field("currency", withCustomError(currency, RippledError::RpcDstAmtMalformed)), - field("mpt_issuance_id", withCustomError(uint192Hex, RippledError::RpcDstAmtMalformed)), - field("issuer", withCustomError(issuer, RippledError::RpcDstIsrMalformed))), + field("currency", withCustomError(currency, XrpldError::RpcDstAmtMalformed)), + field("mpt_issuance_id", withCustomError(uint192Hex, XrpldError::RpcDstAmtMalformed)), + field("issuer", withCustomError(issuer, XrpldError::RpcDstIsrMalformed))), takerGetsConv), field( "taker_pays", @@ -208,23 +208,23 @@ inline constexpr auto kInputSpec = spec( type, kTakerValidator, section( - field("currency", withCustomError(currency, RippledError::RpcSrcCurMalformed)), - field("mpt_issuance_id", withCustomError(uint192Hex, RippledError::RpcSrcCurMalformed)), - field("issuer", withCustomError(issuer, RippledError::RpcSrcIsrMalformed))), + field("currency", withCustomError(currency, XrpldError::RpcSrcCurMalformed)), + field("mpt_issuance_id", withCustomError(uint192Hex, XrpldError::RpcSrcCurMalformed)), + field("issuer", withCustomError(issuer, XrpldError::RpcSrcIsrMalformed))), takerPaysConv), field( "taker", &Input::taker, - withCustomError(account, RippledError::RpcInvalidParams, "Invalid field 'taker'."), + withCustomError(account, XrpldError::RpcInvalidParams, "Invalid field 'taker'."), takerConv), field( "domain", &Input::domain, withCustomError( type, - RippledError::RpcDomainMalformed, + XrpldError::RpcDomainMalformed, "Unable to parse domain."), - withCustomError(uint256Hex, RippledError::RpcDomainMalformed, "Unable to parse domain."), + withCustomError(uint256Hex, XrpldError::RpcDomainMalformed, "Unable to parse domain."), asString), field( "limit", diff --git a/include/rpcspec/handlers/feature/Spec.hpp b/include/rpcspec/handlers/feature/Spec.hpp index 4350245..dc3c2a1 100644 --- a/include/rpcspec/handlers/feature/Spec.hpp +++ b/include/rpcspec/handlers/feature/Spec.hpp @@ -22,7 +22,7 @@ inline constexpr auto kInputSpec = spec( "vetoed", withCustomError( notSupported, - RippledError::RpcNoPermission, + XrpldError::RpcNoPermission, "The admin portion of feature API is not available through Clio."))); /** diff --git a/include/rpcspec/handlers/gateway_balances/Spec.hpp b/include/rpcspec/handlers/gateway_balances/Spec.hpp index d9f4c78..dffdfc0 100644 --- a/include/rpcspec/handlers/gateway_balances/Spec.hpp +++ b/include/rpcspec/handlers/gateway_balances/Spec.hpp @@ -33,7 +33,7 @@ inline constexpr auto kHotWalletV1 = CustomValidator{[](auto const& fieldView) - if (not fieldView.isString() and not fieldView.isArray()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidHotwallet, + rpc::XrpldError::RpcInvalidHotwallet, std::string{fieldView.key()} + "NotStringOrArray"}}; } auto const getAccountID = [](auto const& elem) -> bool { @@ -53,7 +53,7 @@ inline constexpr auto kHotWalletV1 = CustomValidator{[](auto const& fieldView) - if (not getAccountID(fieldView.element(i))) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidHotwallet, + rpc::XrpldError::RpcInvalidHotwallet, std::string{fieldView.key()} + "Malformed"}}; } } @@ -63,8 +63,7 @@ inline constexpr auto kHotWalletV1 = CustomValidator{[](auto const& fieldView) - if (not getAccountID(fieldView)) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidHotwallet, - std::string{fieldView.key()} + "Malformed"}}; + rpc::XrpldError::RpcInvalidHotwallet, std::string{fieldView.key()} + "Malformed"}}; } } return {}; @@ -77,8 +76,7 @@ inline constexpr auto kHotWalletV2 = CustomValidator{[](auto const& fieldView) - if (not fieldView.isString() and not fieldView.isArray()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, - std::string{fieldView.key()} + "NotStringOrArray"}}; + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "NotStringOrArray"}}; } auto const getAccountID = [](auto const& elem) -> bool { if (not elem.isString()) @@ -97,8 +95,7 @@ inline constexpr auto kHotWalletV2 = CustomValidator{[](auto const& fieldView) - if (not getAccountID(fieldView.element(i))) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, - std::string{fieldView.key()} + "Malformed"}}; + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "Malformed"}}; } } } @@ -107,7 +104,7 @@ inline constexpr auto kHotWalletV2 = CustomValidator{[](auto const& fieldView) - if (not getAccountID(fieldView)) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, std::string{fieldView.key()} + "Malformed"}}; + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "Malformed"}}; } } return {}; @@ -153,14 +150,14 @@ struct HotWalletConverter if (fieldView.isString()) { if (not parseOne(fieldView)) - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; } else { for (auto i = 0uz; i < fieldView.arraySize(); ++i) { if (not parseOne(fieldView.element(i))) - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; } } return result; diff --git a/include/rpcspec/handlers/get_aggregate_price/Spec.hpp b/include/rpcspec/handlers/get_aggregate_price/Spec.hpp index e896c17..df9d19c 100644 --- a/include/rpcspec/handlers/get_aggregate_price/Spec.hpp +++ b/include/rpcspec/handlers/get_aggregate_price/Spec.hpp @@ -30,22 +30,22 @@ inline constexpr auto kOraclesMax = 200; inline constexpr auto kOraclesValidator = CustomModifier{[](auto& fieldView) -> MaybeError { if (not fieldView.isArray() or fieldView.arraySize() == 0 or fieldView.arraySize() > kOraclesMax) - return std::unexpected{rpc::Status{rpc::RippledError::RpcOracleMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcOracleMalformed}}; for (auto i = 0uz; i < fieldView.arraySize(); ++i) { auto elem = fieldView.element(i); if (not elem.isObject()) - return std::unexpected{rpc::Status{rpc::RippledError::RpcOracleMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcOracleMalformed}}; auto docIdView = elem.child("oracle_document_id"); auto accountView = elem.child("account"); if (not docIdView.present() or not accountView.present()) - return std::unexpected{rpc::Status{rpc::RippledError::RpcOracleMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcOracleMalformed}}; if (auto err = Type::verify(docIdView); not err.has_value()) - return std::unexpected{rpc::Status{rpc::RippledError::RpcOracleMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcOracleMalformed}}; // Mirrors the old behaviour: RpcInvalidParams when the string is not a valid // integer, e.g. "a". @@ -53,7 +53,7 @@ inline constexpr auto kOraclesValidator = CustomModifier{[](auto& fieldView) -> return err; if (auto err = AccountBase58Validator::verify(accountView); not err.has_value()) - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; } return {}; @@ -95,7 +95,7 @@ struct OraclesConverter // Both are guaranteed valid by kOraclesValidator; extract directly. auto id = detail::accountFromStringStrict(std::string{account.asString()}); if (not id.has_value()) - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; result.push_back( Oracle{ .documentId = docId.asUint32(), @@ -133,7 +133,7 @@ struct Uint8Converter parse(View const& fieldView) const { if (not fieldView.isUint32()) - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; return static_cast(fieldView.asUint32()); } }; @@ -168,7 +168,7 @@ struct CurrencyConverter xrpl::Currency currency; if (not fieldView.isString() or not xrpl::toCurrency(currency, std::string{fieldView.asString()})) - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; return currency; } }; @@ -199,13 +199,13 @@ inline constexpr auto kInputSpec = spec( "base_asset", &Input::baseAsset, required, - withCustomError(currency, RippledError::RpcInvalidParams), + withCustomError(currency, XrpldError::RpcInvalidParams), currencyConv), field( "quote_asset", &Input::quoteAsset, required, - withCustomError(currency, RippledError::RpcInvalidParams), + withCustomError(currency, XrpldError::RpcInvalidParams), currencyConv), field("oracles", &Input::oracles, required, kOraclesValidator, oraclesConv), field("time_threshold", &Input::timeThreshold, type, asUint32), diff --git a/include/rpcspec/handlers/ledger_entry/Spec.hpp b/include/rpcspec/handlers/ledger_entry/Spec.hpp index 358e941..4f652fa 100644 --- a/include/rpcspec/handlers/ledger_entry/Spec.hpp +++ b/include/rpcspec/handlers/ledger_entry/Spec.hpp @@ -30,14 +30,14 @@ inline constexpr auto kRippleStateAccountsValidator = if (not fieldView.isArray() or fieldView.arraySize() != 2) { return std::unexpected{ - rpc::Status{rpc::RippledError::RpcInvalidParams, "malformedAccounts"}}; + rpc::Status{rpc::XrpldError::RpcInvalidParams, "malformedAccounts"}}; } auto const elem0 = fieldView.element(0); auto const elem1 = fieldView.element(1); if (not elem0.isString() or not elem1.isString() or elem0.asString() == elem1.asString()) { return std::unexpected{ - rpc::Status{rpc::RippledError::RpcInvalidParams, "malformedAccounts"}}; + rpc::Status{rpc::XrpldError::RpcInvalidParams, "malformedAccounts"}}; } auto const id1 = rpc::spec::detail::parseBase58Wrapper(std::string{elem0.asString()}); diff --git a/include/rpcspec/handlers/mptoken_issuance_history/Spec.hpp b/include/rpcspec/handlers/mptoken_issuance_history/Spec.hpp index c190538..b14efbb 100644 --- a/include/rpcspec/handlers/mptoken_issuance_history/Spec.hpp +++ b/include/rpcspec/handlers/mptoken_issuance_history/Spec.hpp @@ -27,13 +27,13 @@ namespace rpc::spec::handlers::mptoken_issuance_history { */ inline constexpr auto kTxTypeValidator = CustomValidator{[](auto const& fieldView) -> MaybeError { if (not fieldView.isString()) - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; auto const& validTypes = txTypesInLowercase(); if (not validTypes.contains(std::string{fieldView.asString()})) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, + rpc::XrpldError::RpcInvalidParams, "Invalid field '" + std::string{fieldView.key()} + "'."}}; } return {}; @@ -138,7 +138,7 @@ inline constexpr auto kInputSpec = spec( field( "marker", &Input::marker, - withCustomError(type, rpc::RippledError::RpcInvalidParams, "invalidMarker"), + withCustomError(type, rpc::XrpldError::RpcInvalidParams, "invalidMarker"), ifType(section( field("ledger", required, type), field("seq", required, type))), diff --git a/include/rpcspec/handlers/nft_history/Spec.hpp b/include/rpcspec/handlers/nft_history/Spec.hpp index 09dcf8c..528debc 100644 --- a/include/rpcspec/handlers/nft_history/Spec.hpp +++ b/include/rpcspec/handlers/nft_history/Spec.hpp @@ -116,7 +116,7 @@ inline constexpr auto kInputSpecV1 = spec( field( "marker", &Input::marker, - withCustomError(type, rpc::RippledError::RpcInvalidParams, "invalidMarker"), + withCustomError(type, rpc::XrpldError::RpcInvalidParams, "invalidMarker"), ifType(section( field("ledger", required, type), field("seq", required, type))), diff --git a/include/rpcspec/handlers/noripple_check/Spec.hpp b/include/rpcspec/handlers/noripple_check/Spec.hpp index 3151c64..8609ea6 100644 --- a/include/rpcspec/handlers/noripple_check/Spec.hpp +++ b/include/rpcspec/handlers/noripple_check/Spec.hpp @@ -66,7 +66,7 @@ inline constexpr auto kInputSpecV1 = spec( required, withCustomError( oneOf("gateway", "user"), - rpc::RippledError::RpcInvalidParams, + rpc::XrpldError::RpcInvalidParams, "role field is invalid"), roleGateway), field( diff --git a/include/rpcspec/handlers/subscribe/Spec.hpp b/include/rpcspec/handlers/subscribe/Spec.hpp index 987467f..76ee94b 100644 --- a/include/rpcspec/handlers/subscribe/Spec.hpp +++ b/include/rpcspec/handlers/subscribe/Spec.hpp @@ -38,12 +38,12 @@ inline constexpr auto kSubscribeAccountsValidator = if (not fieldView.isArray()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, std::string{fieldView.key()} + "NotArray"}}; + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "NotArray"}}; } if (fieldView.arraySize() == 0) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcActMalformed, std::string{fieldView.key()} + " malformed."}}; + rpc::XrpldError::RpcActMalformed, std::string{fieldView.key()} + " malformed."}}; } for (auto i = 0uz; i < fieldView.arraySize(); ++i) { @@ -51,13 +51,13 @@ inline constexpr auto kSubscribeAccountsValidator = if (not elem.isString()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "'sItemNotString"}}; } if (not rpc::spec::detail::accountFromStringStrict(std::string{elem.asString()})) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcActMalformed, + rpc::XrpldError::RpcActMalformed, std::string{fieldView.key()} + "'sItemMalformed"}}; } } @@ -166,7 +166,7 @@ struct StreamsValidator if (not fieldView.isArray()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, std::string{fieldView.key()} + "NotArray"}}; + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "NotArray"}}; } for (auto i = 0uz; i < fieldView.arraySize(); ++i) { @@ -174,17 +174,17 @@ struct StreamsValidator if (not elem.isString()) { return std::unexpected{ - rpc::Status{rpc::RippledError::RpcInvalidParams, "streamNotString"}}; + rpc::Status{rpc::XrpldError::RpcInvalidParams, "streamNotString"}}; } auto const str = elem.asString(); #if RPCSPEC_IS_CLIO if (contains(kNotSupported, str)) - return std::unexpected{rpc::Status{rpc::RippledError::RpcNotSupported}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcNotSupported}}; if (not contains(kCommon, str)) - return std::unexpected{rpc::Status{rpc::RippledError::RpcStreamMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcStreamMalformed}}; #else if (not contains(kCommon, str) and not contains(kRippledExtra, str)) - return std::unexpected{rpc::Status{rpc::RippledError::RpcStreamMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcStreamMalformed}}; #endif } return {}; @@ -205,7 +205,7 @@ inline constexpr auto kBooksValidator = CustomValidator{[](auto const& fieldView if (not fieldView.isArray()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, std::string{fieldView.key()} + "NotArray"}}; + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "NotArray"}}; } for (auto i = 0uz; i < fieldView.arraySize(); ++i) { @@ -213,21 +213,20 @@ inline constexpr auto kBooksValidator = CustomValidator{[](auto const& fieldView if (not book.isObject()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, - std::string{fieldView.key()} + "ItemNotObject"}}; + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "ItemNotObject"}}; } auto const bothView = book.child("both"); if (bothView.present() and not bothView.isBool()) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams, "bothNotBool"}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams, "bothNotBool"}}; } auto const snapshotView = book.child("snapshot"); if (snapshotView.present() and not snapshotView.isBool()) { return std::unexpected{ - rpc::Status{rpc::RippledError::RpcInvalidParams, "snapshotNotBool"}}; + rpc::Status{rpc::XrpldError::RpcInvalidParams, "snapshotNotBool"}}; } auto const takerView = book.child("taker"); @@ -239,7 +238,7 @@ inline constexpr auto kBooksValidator = CustomValidator{[](auto const& fieldView not rpc::spec::detail::accountFromStringStrict(std::string{takerView.asString()})) { return std::unexpected{ - rpc::Status{rpc::RippledError::RpcBadIssuer, "Issuer account malformed."}}; + rpc::Status{rpc::XrpldError::RpcBadIssuer, "Issuer account malformed."}}; } } @@ -247,53 +246,53 @@ inline constexpr auto kBooksValidator = CustomValidator{[](auto const& fieldView if (not takerPaysView.present()) { return std::unexpected{ - rpc::Status{rpc::RippledError::RpcInvalidParams, "Missing field 'taker_pays'"}}; + rpc::Status{rpc::XrpldError::RpcInvalidParams, "Missing field 'taker_pays'"}}; } if (not takerPaysView.isObject()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, "Field 'taker_pays' is not an object"}}; + rpc::XrpldError::RpcInvalidParams, "Field 'taker_pays' is not an object"}}; } auto const takerGetsView = book.child("taker_gets"); if (not takerGetsView.present()) { return std::unexpected{ - rpc::Status{rpc::RippledError::RpcInvalidParams, "Missing field 'taker_gets'"}}; + rpc::Status{rpc::XrpldError::RpcInvalidParams, "Missing field 'taker_gets'"}}; } if (not takerGetsView.isObject()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, "Field 'taker_gets' is not an object"}}; + rpc::XrpldError::RpcInvalidParams, "Field 'taker_gets' is not an object"}}; } auto const paysCurView = takerPaysView.child("currency"); if (not paysCurView.present() or not paysCurView.isString()) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcSrcCurMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcSrcCurMalformed}}; } xrpl::Currency payCurrency; if (not xrpl::toCurrency(payCurrency, std::string{paysCurView.asString()})) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcSrcCurMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcSrcCurMalformed}}; } auto const getsCurView = takerGetsView.child("currency"); if (not getsCurView.present() or not getsCurView.isString()) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcDstAmtMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcDstAmtMalformed}}; } xrpl::Currency getCurrency; if (not xrpl::toCurrency(getCurrency, std::string{getsCurView.asString()})) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcDstAmtMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcDstAmtMalformed}}; } // book-level domain (mirrors parseBook): must be string if present auto const domainView = book.child("domain"); if (domainView.present() and not domainView.isString()) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcDomainMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcDomainMalformed}}; } xrpl::AccountID payIssuer; @@ -303,15 +302,15 @@ inline constexpr auto kBooksValidator = CustomValidator{[](auto const& fieldView if (not paysIssuerView.isString()) { return std::unexpected{ - rpc::Status{rpc::RippledError::RpcInvalidParams, "takerPaysIssuerNotString"}}; + rpc::Status{rpc::XrpldError::RpcInvalidParams, "takerPaysIssuerNotString"}}; } if (not xrpl::toIssuer(payIssuer, std::string{paysIssuerView.asString()})) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcSrcIsrMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcSrcIsrMalformed}}; } if (payIssuer == xrpl::noAccount()) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcSrcIsrMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcSrcIsrMalformed}}; } } else @@ -322,13 +321,13 @@ inline constexpr auto kBooksValidator = CustomValidator{[](auto const& fieldView if (xrpl::isXRP(payCurrency) and not xrpl::isXRP(payIssuer)) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcSrcIsrMalformed, + rpc::XrpldError::RpcSrcIsrMalformed, "Unneeded field 'taker_pays.issuer' for XRP currency specification."}}; } if (not xrpl::isXRP(payCurrency) and xrpl::isXRP(payIssuer)) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcSrcIsrMalformed, + rpc::XrpldError::RpcSrcIsrMalformed, "Invalid field 'taker_pays.issuer', expected non-XRP issuer."}}; } @@ -339,18 +338,18 @@ inline constexpr auto kBooksValidator = CustomValidator{[](auto const& fieldView if (not getsIssuerView.isString()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, "taker_gets.issuer should be string"}}; + rpc::XrpldError::RpcInvalidParams, "taker_gets.issuer should be string"}}; } if (not xrpl::toIssuer(getIssuer, std::string{getsIssuerView.asString()})) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcDstIsrMalformed, + rpc::XrpldError::RpcDstIsrMalformed, "Invalid field 'taker_gets.issuer', bad issuer."}}; } if (getIssuer == xrpl::noAccount()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcDstIsrMalformed, + rpc::XrpldError::RpcDstIsrMalformed, "Invalid field 'taker_gets.issuer', bad issuer account one."}}; } } @@ -362,19 +361,19 @@ inline constexpr auto kBooksValidator = CustomValidator{[](auto const& fieldView if (xrpl::isXRP(getCurrency) and not xrpl::isXRP(getIssuer)) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcDstIsrMalformed, + rpc::XrpldError::RpcDstIsrMalformed, "Unneeded field 'taker_gets.issuer' for XRP currency specification."}}; } if (not xrpl::isXRP(getCurrency) and xrpl::isXRP(getIssuer)) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcDstIsrMalformed, + rpc::XrpldError::RpcDstIsrMalformed, "Invalid field 'taker_gets.issuer', expected non-XRP issuer."}}; } if (payCurrency == getCurrency and payIssuer == getIssuer) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcBadMarket}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcBadMarket}}; } // book-level domain (mirrors inner parseBook overload): must parse as hex @@ -383,7 +382,7 @@ inline constexpr auto kBooksValidator = CustomValidator{[](auto const& fieldView xrpl::uint256 dom; if (not dom.parseHex(std::string{domainView.asString()})) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcDomainMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcDomainMalformed}}; } } } diff --git a/include/rpcspec/handlers/unsubscribe/Spec.hpp b/include/rpcspec/handlers/unsubscribe/Spec.hpp index 214d460..cb56460 100644 --- a/include/rpcspec/handlers/unsubscribe/Spec.hpp +++ b/include/rpcspec/handlers/unsubscribe/Spec.hpp @@ -39,12 +39,12 @@ inline constexpr auto kSubscribeAccountsValidator = if (not fieldView.isArray()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, std::string{fieldView.key()} + "NotArray"}}; + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "NotArray"}}; } if (fieldView.arraySize() == 0) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcActMalformed, std::string{fieldView.key()} + " malformed."}}; + rpc::XrpldError::RpcActMalformed, std::string{fieldView.key()} + " malformed."}}; } for (auto i = 0uz; i < fieldView.arraySize(); ++i) { @@ -52,13 +52,13 @@ inline constexpr auto kSubscribeAccountsValidator = if (not elem.isString()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "'sItemNotString"}}; } if (not rpc::spec::detail::accountFromStringStrict(std::string{elem.asString()})) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcActMalformed, + rpc::XrpldError::RpcActMalformed, std::string{fieldView.key()} + "'sItemMalformed"}}; } } @@ -167,7 +167,7 @@ struct StreamsValidator if (not fieldView.isArray()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, std::string{fieldView.key()} + "NotArray"}}; + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "NotArray"}}; } for (auto i = 0uz; i < fieldView.arraySize(); ++i) { @@ -175,17 +175,17 @@ struct StreamsValidator if (not elem.isString()) { return std::unexpected{ - rpc::Status{rpc::RippledError::RpcInvalidParams, "streamNotString"}}; + rpc::Status{rpc::XrpldError::RpcInvalidParams, "streamNotString"}}; } auto const str = elem.asString(); #if RPCSPEC_IS_CLIO if (contains(kNotSupported, str)) - return std::unexpected{rpc::Status{rpc::RippledError::RpcNotSupported}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcNotSupported}}; if (not contains(kCommon, str)) - return std::unexpected{rpc::Status{rpc::RippledError::RpcStreamMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcStreamMalformed}}; #else if (not contains(kCommon, str) and not contains(kRippledExtra, str)) - return std::unexpected{rpc::Status{rpc::RippledError::RpcStreamMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcStreamMalformed}}; #endif } return {}; @@ -207,7 +207,7 @@ inline constexpr auto kBooksValidator = CustomValidator{[](auto const& fieldView if (not fieldView.isArray()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, std::string{fieldView.key()} + "NotArray"}}; + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "NotArray"}}; } for (auto i = 0uz; i < fieldView.arraySize(); ++i) { @@ -215,67 +215,66 @@ inline constexpr auto kBooksValidator = CustomValidator{[](auto const& fieldView if (not book.isObject()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, - std::string{fieldView.key()} + "ItemNotObject"}}; + rpc::XrpldError::RpcInvalidParams, std::string{fieldView.key()} + "ItemNotObject"}}; } auto const bothView = book.child("both"); if (bothView.present() and not bothView.isBool()) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams, "bothNotBool"}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams, "bothNotBool"}}; } auto const takerPaysView = book.child("taker_pays"); if (not takerPaysView.present()) { return std::unexpected{ - rpc::Status{rpc::RippledError::RpcInvalidParams, "Missing field 'taker_pays'"}}; + rpc::Status{rpc::XrpldError::RpcInvalidParams, "Missing field 'taker_pays'"}}; } if (not takerPaysView.isObject()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, "Field 'taker_pays' is not an object"}}; + rpc::XrpldError::RpcInvalidParams, "Field 'taker_pays' is not an object"}}; } auto const takerGetsView = book.child("taker_gets"); if (not takerGetsView.present()) { return std::unexpected{ - rpc::Status{rpc::RippledError::RpcInvalidParams, "Missing field 'taker_gets'"}}; + rpc::Status{rpc::XrpldError::RpcInvalidParams, "Missing field 'taker_gets'"}}; } if (not takerGetsView.isObject()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, "Field 'taker_gets' is not an object"}}; + rpc::XrpldError::RpcInvalidParams, "Field 'taker_gets' is not an object"}}; } auto const paysCurView = takerPaysView.child("currency"); if (not paysCurView.present() or not paysCurView.isString()) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcSrcCurMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcSrcCurMalformed}}; } xrpl::Currency payCurrency; if (not xrpl::toCurrency(payCurrency, std::string{paysCurView.asString()})) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcSrcCurMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcSrcCurMalformed}}; } auto const getsCurView = takerGetsView.child("currency"); if (not getsCurView.present() or not getsCurView.isString()) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcDstAmtMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcDstAmtMalformed}}; } xrpl::Currency getCurrency; if (not xrpl::toCurrency(getCurrency, std::string{getsCurView.asString()})) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcDstAmtMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcDstAmtMalformed}}; } // book-level domain (mirrors parseBook): must be string if present auto const domainView = book.child("domain"); if (domainView.present() and not domainView.isString()) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcDomainMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcDomainMalformed}}; } xrpl::AccountID payIssuer; @@ -285,15 +284,15 @@ inline constexpr auto kBooksValidator = CustomValidator{[](auto const& fieldView if (not paysIssuerView.isString()) { return std::unexpected{ - rpc::Status{rpc::RippledError::RpcInvalidParams, "takerPaysIssuerNotString"}}; + rpc::Status{rpc::XrpldError::RpcInvalidParams, "takerPaysIssuerNotString"}}; } if (not xrpl::toIssuer(payIssuer, std::string{paysIssuerView.asString()})) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcSrcIsrMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcSrcIsrMalformed}}; } if (payIssuer == xrpl::noAccount()) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcSrcIsrMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcSrcIsrMalformed}}; } } else @@ -304,13 +303,13 @@ inline constexpr auto kBooksValidator = CustomValidator{[](auto const& fieldView if (xrpl::isXRP(payCurrency) and not xrpl::isXRP(payIssuer)) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcSrcIsrMalformed, + rpc::XrpldError::RpcSrcIsrMalformed, "Unneeded field 'taker_pays.issuer' for XRP currency specification."}}; } if (not xrpl::isXRP(payCurrency) and xrpl::isXRP(payIssuer)) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcSrcIsrMalformed, + rpc::XrpldError::RpcSrcIsrMalformed, "Invalid field 'taker_pays.issuer', expected non-XRP issuer."}}; } @@ -321,18 +320,18 @@ inline constexpr auto kBooksValidator = CustomValidator{[](auto const& fieldView if (not getsIssuerView.isString()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcInvalidParams, "taker_gets.issuer should be string"}}; + rpc::XrpldError::RpcInvalidParams, "taker_gets.issuer should be string"}}; } if (not xrpl::toIssuer(getIssuer, std::string{getsIssuerView.asString()})) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcDstIsrMalformed, + rpc::XrpldError::RpcDstIsrMalformed, "Invalid field 'taker_gets.issuer', bad issuer."}}; } if (getIssuer == xrpl::noAccount()) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcDstIsrMalformed, + rpc::XrpldError::RpcDstIsrMalformed, "Invalid field 'taker_gets.issuer', bad issuer account one."}}; } } @@ -344,19 +343,19 @@ inline constexpr auto kBooksValidator = CustomValidator{[](auto const& fieldView if (xrpl::isXRP(getCurrency) and not xrpl::isXRP(getIssuer)) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcDstIsrMalformed, + rpc::XrpldError::RpcDstIsrMalformed, "Unneeded field 'taker_gets.issuer' for XRP currency specification."}}; } if (not xrpl::isXRP(getCurrency) and xrpl::isXRP(getIssuer)) { return std::unexpected{rpc::Status{ - rpc::RippledError::RpcDstIsrMalformed, + rpc::XrpldError::RpcDstIsrMalformed, "Invalid field 'taker_gets.issuer', expected non-XRP issuer."}}; } if (payCurrency == getCurrency and payIssuer == getIssuer) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcBadMarket}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcBadMarket}}; } // book-level domain (mirrors inner parseBook overload): must parse as hex @@ -365,7 +364,7 @@ inline constexpr auto kBooksValidator = CustomValidator{[](auto const& fieldView xrpl::uint256 dom; if (not dom.parseHex(std::string{domainView.asString()})) { - return std::unexpected{rpc::Status{rpc::RippledError::RpcDomainMalformed}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcDomainMalformed}}; } } } diff --git a/include/rpcspec/handlers/vault_info/Spec.hpp b/include/rpcspec/handlers/vault_info/Spec.hpp index 6e41b0b..1dca691 100644 --- a/include/rpcspec/handlers/vault_info/Spec.hpp +++ b/include/rpcspec/handlers/vault_info/Spec.hpp @@ -30,7 +30,7 @@ inline constexpr std::string_view kSeqMessage = {}; /** * @brief Vault field error. */ -inline constexpr auto kVaultFieldError = rpc::CombinedError{rpc::RippledError::RpcInvalidParams}; +inline constexpr auto kVaultFieldError = rpc::CombinedError{rpc::XrpldError::RpcInvalidParams}; /** * @brief Vault id message. @@ -40,7 +40,7 @@ inline constexpr std::string_view kVaultIdMessage = "Invalid field 'vault_id', n /** * @brief Owner error. */ -inline constexpr auto kOwnerError = rpc::CombinedError{rpc::RippledError::RpcActMalformed}; +inline constexpr auto kOwnerError = rpc::CombinedError{rpc::XrpldError::RpcActMalformed}; /** * @brief Owner message. diff --git a/tests/SpecAccountLinesTests.cpp b/tests/SpecAccountLinesTests.cpp index 4e7b477..e772682 100644 --- a/tests/SpecAccountLinesTests.cpp +++ b/tests/SpecAccountLinesTests.cpp @@ -69,14 +69,14 @@ TEST(AccountLinesSpec, MalformedAccountIsActMalformed) { auto const result = parse(R"JSON({"account": "notanaccount"})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcActMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcActMalformed); } TEST(AccountLinesSpec, NonStringAccountIsAlsoActMalformed) { auto const result = parse(R"JSON({"account": 5})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcActMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcActMalformed); } TEST(AccountLinesSpec, PeerParses) @@ -91,7 +91,7 @@ TEST(AccountLinesSpec, MalformedPeerIsActMalformed) { auto const result = parse(req(R"JSON(, "peer": "notanaccount")JSON")); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcActMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcActMalformed); } // --- AsBoolConverter -------------------------------------------------------- @@ -151,7 +151,7 @@ TEST(AccountLinesSpec, NonStringMarkerNamesTheField) { auto const result = parse(req(R"JSON(, "marker": 5)JSON")); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "markerNotString"); } @@ -159,7 +159,7 @@ TEST(AccountLinesSpec, MarkerWithoutCommaIsMalformedCursor) { auto const result = parse(req(std::format(R"JSON(, "marker": "{}")JSON", kHex1))); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'marker'."); } @@ -167,7 +167,7 @@ TEST(AccountLinesSpec, MarkerWithBadHexIsMalformedCursor) { auto const result = parse(req(R"JSON(, "marker": "NOTHEX,7")JSON")); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'marker'."); } @@ -175,7 +175,7 @@ TEST(AccountLinesSpec, MarkerWithNonNumericHintIsMalformedCursor) { auto const result = parse(req(std::format(R"JSON(, "marker": "{},abc")JSON", kHex1))); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'marker'."); } @@ -183,7 +183,7 @@ TEST(AccountLinesSpec, MarkerWithTrailingGarbageAfterHintIsMalformedCursor) { auto const result = parse(req(std::format(R"JSON(, "marker": "{},7x")JSON", kHex1))); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'marker'."); } diff --git a/tests/SpecAccountOffersTests.cpp b/tests/SpecAccountOffersTests.cpp index 487f367..8e117bf 100644 --- a/tests/SpecAccountOffersTests.cpp +++ b/tests/SpecAccountOffersTests.cpp @@ -67,7 +67,7 @@ TEST(AccountOffersSpec, MalformedAccountIsActMalformed) { auto const result = parse(R"JSON({"account": "notanaccount"})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcActMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcActMalformed); EXPECT_EQ(result.error().message, "accountMalformed"); } @@ -76,7 +76,7 @@ TEST(AccountOffersSpec, NonStringAccountIsInvalidParams) // The shared accountId converter distinguishes wrong-type from unparseable. auto const result = parse(R"JSON({"account": 5})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "accountNotString"); } @@ -125,7 +125,7 @@ TEST(AccountOffersSpec, NonStringMarkerNamesTheField) { auto const result = parse(req(R"JSON(, "marker": 5)JSON")); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "markerNotString"); } @@ -133,7 +133,7 @@ TEST(AccountOffersSpec, MarkerWithoutCommaIsMalformedCursor) { auto const result = parse(withMarker(kHex1)); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'marker'."); } @@ -141,7 +141,7 @@ TEST(AccountOffersSpec, MarkerWithBadHexIsMalformedCursor) { auto const result = parse(withMarker("NOTHEX,7")); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'marker'."); } @@ -149,7 +149,7 @@ TEST(AccountOffersSpec, MarkerWithEmptyHintIsMalformedCursor) { auto const result = parse(withMarker(std::format("{},", kHex1))); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'marker'."); } @@ -157,7 +157,7 @@ TEST(AccountOffersSpec, MarkerWithTrailingGarbageAfterHintIsMalformedCursor) { auto const result = parse(withMarker(std::format("{},7x", kHex1))); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'marker'."); } @@ -166,7 +166,7 @@ TEST(AccountOffersSpec, MarkerWithNegativeHintIsMalformedCursor) // from_chars into uint64_t rejects a leading '-'. auto const result = parse(withMarker(std::format("{},-1", kHex1))); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'marker'."); } diff --git a/tests/SpecAccountTxDelegateTests.cpp b/tests/SpecAccountTxDelegateTests.cpp index 06331c7..c5b811f 100644 --- a/tests/SpecAccountTxDelegateTests.cpp +++ b/tests/SpecAccountTxDelegateTests.cpp @@ -67,7 +67,7 @@ TEST(AccountTxDelegateSpec, NotAnObjectFails) { auto const result = parseAccountTx(R"JSON(, "delegate": "actor")JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "delegateNotObject"); } @@ -75,7 +75,7 @@ TEST(AccountTxDelegateSpec, MissingDelegateFilterFails) { auto const result = parseAccountTx(R"JSON(, "delegate": {})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Field 'delegate_filter' is required but missing."); } @@ -83,7 +83,7 @@ TEST(AccountTxDelegateSpec, UnknownDelegateFilterValueFails) { auto const result = parseAccountTx(R"JSON(, "delegate": {"delegate_filter": "bogus"})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ( result.error().message, "Field 'delegate_filter' value must be 'actor' or 'authorizer'."); } @@ -92,7 +92,7 @@ TEST(AccountTxDelegateSpec, NonStringDelegateFilterFails) { auto const result = parseAccountTx(R"JSON(, "delegate": {"delegate_filter": 1})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ( result.error().message, "Field 'delegate_filter' value must be 'actor' or 'authorizer'."); } @@ -102,6 +102,6 @@ TEST(AccountTxDelegateSpec, MalformedCounterPartyFails) auto const result = parseAccountTx( R"JSON(, "delegate": {"delegate_filter": "actor", "counter_party": "not-an-account"})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcActMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcActMalformed); EXPECT_EQ(result.error().message, "Field 'counter_party' value must be a valid account."); } diff --git a/tests/SpecAmmInfoTests.cpp b/tests/SpecAmmInfoTests.cpp index 44e1e9e..a044f26 100644 --- a/tests/SpecAmmInfoTests.cpp +++ b/tests/SpecAmmInfoTests.cpp @@ -88,7 +88,7 @@ TEST(AmmInfoSpec, AssetNeitherStringNorObjectIsIssueMalformed) { auto const result = parse(withAsset(bad)); ASSERT_FALSE(result.has_value()) << "asset=" << bad << " unexpectedly accepted"; - EXPECT_EQ(result.error(), rpc::RippledError::RpcIssueMalformed) << "asset=" << bad; + EXPECT_EQ(result.error(), rpc::XrpldError::RpcIssueMalformed) << "asset=" << bad; } } @@ -96,7 +96,7 @@ TEST(AmmInfoSpec, Asset2NeitherStringNorObjectIsIssueMalformed) { auto const result = parse(R"JSON({"asset": {"currency": "XRP"}, "asset2": 123})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcIssueMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcIssueMalformed); } // --- the object arm --------------------------------------------------------- @@ -105,7 +105,7 @@ TEST(AmmInfoSpec, ObjectAssetBadCurrencyIsIssueMalformed) { auto const result = parse(withAsset(R"JSON({"currency": "TOOLONGCURRENCY"})JSON")); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcIssueMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcIssueMalformed); } TEST(AmmInfoSpec, ObjectAssetBadIssuerIsIssueMalformed) @@ -113,21 +113,21 @@ TEST(AmmInfoSpec, ObjectAssetBadIssuerIsIssueMalformed) auto const result = parse(withAsset(R"JSON({"currency": "USD", "issuer": "notanaccount"})JSON")); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcIssueMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcIssueMalformed); } TEST(AmmInfoSpec, ObjectAssetMissingCurrencyIsIssueMalformed) { auto const result = parse(withAsset(std::format(R"JSON({{"issuer": "{}"}})JSON", kAcct1))); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcIssueMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcIssueMalformed); } TEST(AmmInfoSpec, ObjectAssetNonXrpMissingIssuerIsIssueMalformed) { auto const result = parse(withAsset(R"JSON({"currency": "USD"})JSON")); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcIssueMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcIssueMalformed); } // --- account fields --------------------------------------------------------- @@ -146,12 +146,12 @@ TEST(AmmInfoSpec, MalformedAccountIsActMalformed) { auto const result = parse(R"JSON({"account": "notanaccount"})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcActMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcActMalformed); } TEST(AmmInfoSpec, MalformedAmmAccountIsActMalformed) { auto const result = parse(R"JSON({"amm_account": "notanaccount"})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcActMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcActMalformed); } diff --git a/tests/SpecBookOffersTests.cpp b/tests/SpecBookOffersTests.cpp index 425092d..95fff51 100644 --- a/tests/SpecBookOffersTests.cpp +++ b/tests/SpecBookOffersTests.cpp @@ -77,7 +77,7 @@ TEST(BookOffersSpec, MptIssuanceIdWithCurrencyFails) }})JSON", kMptId)); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'taker_gets'."); } @@ -91,7 +91,7 @@ TEST(BookOffersSpec, MptIssuanceIdWithIssuerFails) }})JSON", kMptId)); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'taker_pays'."); } @@ -102,7 +102,7 @@ TEST(BookOffersSpec, NeitherCurrencyNorMptIssuanceIdFails) "taker_pays": {"currency": "XRP"} })JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Missing field 'taker_gets.currency'."); } @@ -113,7 +113,7 @@ TEST(BookOffersSpec, NonStringCurrencyIsInvalidParams) "taker_pays": {"currency": "XRP"} })JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'taker_gets.currency', not string."); } @@ -124,7 +124,7 @@ TEST(BookOffersSpec, MalformedTakerGetsMptIdIsDstAmtMalformed) "taker_pays": {"currency": "XRP"} })JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcDstAmtMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcDstAmtMalformed); } TEST(BookOffersSpec, MalformedTakerPaysMptIdIsSrcCurMalformed) @@ -134,7 +134,7 @@ TEST(BookOffersSpec, MalformedTakerPaysMptIdIsSrcCurMalformed) "taker_pays": {"mpt_issuance_id": "NOTAHEX"} })JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcSrcCurMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcSrcCurMalformed); } TEST(BookOffersSpec, NonStringMptIssuanceIdNamesMptIssuanceIdField) @@ -145,7 +145,7 @@ TEST(BookOffersSpec, NonStringMptIssuanceIdNamesMptIssuanceIdField) "taker_pays": {"currency": "XRP"} })JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'taker_gets.mpt_issuance_id', not string."); } @@ -156,6 +156,6 @@ TEST(BookOffersSpec, NonStringTakerPaysMptIssuanceIdNamesMptIssuanceIdField) "taker_pays": {"mpt_issuance_id": true} })JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'taker_pays.mpt_issuance_id', not string."); } diff --git a/tests/SpecClioErrorsTests.cpp b/tests/SpecClioErrorsTests.cpp index 6e59cc9..932482e 100644 --- a/tests/SpecClioErrorsTests.cpp +++ b/tests/SpecClioErrorsTests.cpp @@ -61,11 +61,11 @@ TEST(ClioErrors, Uint256ValidatorReportsNotStringThenMalformed) static constexpr auto kSpec = RpcSpec{field("nft_id", uint256Hex)}; auto const notString = statusOf(kSpec, R"JSON({"nft_id": 1})JSON"); - EXPECT_EQ(notString, rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(notString, rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(notString.message, "nft_idNotString"); auto const malformed = statusOf(kSpec, R"JSON({"nft_id": "xxx"})JSON"); - EXPECT_EQ(malformed, rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(malformed, rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(malformed.message, "nft_idMalformed"); } @@ -101,7 +101,7 @@ TEST(ClioErrors, LedgerHashReportsNotStringThenMalformed) auto notString = boost::json::parse(R"JSON({"ledger_hash": 1})JSON"); auto const r1 = kLedgerSpec.parse(notString); ASSERT_FALSE(r1.has_value()); - EXPECT_EQ(r1.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(r1.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(r1.error().message, "ledger_hashNotString"); auto malformed = boost::json::parse(R"JSON({"ledger_hash": "xxx"})JSON"); @@ -120,7 +120,7 @@ TEST(ClioErrors, LedgerIndexUsesOneTokenForEveryFailure) auto req = boost::json::parse(json); auto const result = kLedgerSpec.parse(req); ASSERT_FALSE(result.has_value()) << json; - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams) << json; + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams) << json; EXPECT_EQ(result.error().message, "ledgerIndexMalformed") << json; } } diff --git a/tests/SpecClioHandlerErrorsTests.cpp b/tests/SpecClioHandlerErrorsTests.cpp index 804761a..d25103a 100644 --- a/tests/SpecClioHandlerErrorsTests.cpp +++ b/tests/SpecClioHandlerErrorsTests.cpp @@ -117,7 +117,7 @@ TEST(LedgerDataSpecClio, OtherMarkerTypesAreMessageLess) { auto const result = parseLedgerData(std::format(R"JSON({{"marker": {}}})JSON", bad)); ASSERT_FALSE(result.has_value()) << "marker=" << bad << " unexpectedly accepted"; - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams) << "marker=" << bad; + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams) << "marker=" << bad; EXPECT_TRUE(result.error().message.empty()) << "marker=" << bad << " unexpected: " << result.error().message; } @@ -128,6 +128,6 @@ TEST(LedgerDataSpecClio, NonHexStringMarkerNamesTheField) // This arm is shared: malformedFieldMessage() gives "markerMalformed" on Clio. auto const result = parseLedgerData(R"JSON({"marker": "NOTHEX"})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "markerMalformed"); } diff --git a/tests/SpecCoreTests.cpp b/tests/SpecCoreTests.cpp index 52863cc..4aecaf4 100644 --- a/tests/SpecCoreTests.cpp +++ b/tests/SpecCoreTests.cpp @@ -52,7 +52,7 @@ TEST(RpcSpecDSL, MissingRequiredFieldFails) auto const result = kSpec.process(request); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Required field 'account' missing"); } @@ -70,7 +70,7 @@ TEST(RpcSpecDSL, WrongTypeFails) auto const result = kSpec.process(request); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_TRUE(result.error().message.empty()); } @@ -373,7 +373,7 @@ TEST(RpcSpecDSL, NonObjectRootWithRequiredFieldFails) auto arr = boost::json::parse(R"JSON([])JSON"); auto const result = kSpec.process(arr); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Required field 'account' missing"); } @@ -435,7 +435,7 @@ TEST(RpcSpecDSL_Ordering, StopsAtFirstItemFailureWithinAField) auto request = boost::json::parse(R"JSON({ "limit": "not-a-number" })JSON"); auto const result = kSpec.process(request); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_TRUE(result.error().message.empty()); } @@ -449,7 +449,7 @@ TEST(RpcSpecDSL_Ordering, LaterItemRunsWhenEarlierPasses) auto request = boost::json::parse(R"JSON({ "limit": 5 })JSON"); auto const result = kSpec.process(request); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(RpcSpecDSL, SpecIsConstantEvaluable) diff --git a/tests/SpecDepositAuthorizedTests.cpp b/tests/SpecDepositAuthorizedTests.cpp index 6d7c91f..3c07916 100644 --- a/tests/SpecDepositAuthorizedTests.cpp +++ b/tests/SpecDepositAuthorizedTests.cpp @@ -76,7 +76,7 @@ TEST(DepositAuthorizedSpec, MalformedSourceAccountIsActMalformed) R"JSON({{"source_account": "notanaccount", "destination_account": "{}"}})JSON", kAcct2)); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcActMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcActMalformed); EXPECT_EQ(result.error().message, "source_accountMalformed"); } @@ -85,7 +85,7 @@ TEST(DepositAuthorizedSpec, NonStringDestinationAccountIsInvalidParams) auto const result = parse( std::format(R"JSON({{"source_account": "{}", "destination_account": 5}})JSON", kAcct1)); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "destination_accountNotString"); } @@ -124,7 +124,7 @@ TEST(DepositAuthorizedSpec, CredentialsNotArrayIsBareInvalidParams) { auto const result = parseWithCredentials(R"JSON("notanarray")JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); // Deliberately message-less, mirroring the old leading Type check. EXPECT_TRUE(result.error().message.empty()) << "unexpected: " << result.error().message; } @@ -133,7 +133,7 @@ TEST(DepositAuthorizedSpec, CredentialsNonStringElementIsRejected) { auto const result = parseWithCredentials(std::format(R"(["{}", 42])", kHex1)); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Item is not a valid uint256 type."); } @@ -141,7 +141,7 @@ TEST(DepositAuthorizedSpec, CredentialsNonHexElementIsRejected) { auto const result = parseWithCredentials(R"JSON(["NOTHEX"])JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Item is not a valid uint256 type."); } @@ -151,6 +151,6 @@ TEST(DepositAuthorizedSpec, CredentialsWrongLengthHexIsRejected) auto const result = parseWithCredentials( R"JSON(["1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515B"])JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Item is not a valid uint256 type."); } diff --git a/tests/SpecGatewayBalancesTests.cpp b/tests/SpecGatewayBalancesTests.cpp index b8c811b..0d6efc3 100644 --- a/tests/SpecGatewayBalancesTests.cpp +++ b/tests/SpecGatewayBalancesTests.cpp @@ -104,7 +104,7 @@ TEST(GatewayBalancesSpec, V1HotWalletWrongTypeIsInvalidHotwallet) { auto const result = parseV1(withHotWallet("123")); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidHotwallet); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidHotwallet); EXPECT_EQ(result.error().message, "hotwalletNotStringOrArray"); } @@ -112,7 +112,7 @@ TEST(GatewayBalancesSpec, V2HotWalletWrongTypeIsInvalidParams) { auto const result = parseV2(withHotWallet("123")); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "hotwalletNotStringOrArray"); } @@ -120,7 +120,7 @@ TEST(GatewayBalancesSpec, V1HotWalletMalformedStringIsInvalidHotwallet) { auto const result = parseV1(withHotWallet(R"JSON("notanaccount")JSON")); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidHotwallet); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidHotwallet); EXPECT_EQ(result.error().message, "hotwalletMalformed"); } @@ -128,7 +128,7 @@ TEST(GatewayBalancesSpec, V2HotWalletMalformedStringIsInvalidParams) { auto const result = parseV2(withHotWallet(R"JSON("notanaccount")JSON")); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "hotwalletMalformed"); } @@ -136,7 +136,7 @@ TEST(GatewayBalancesSpec, V1HotWalletMalformedArrayElementIsInvalidHotwallet) { auto const result = parseV1(withHotWallet(std::format(R"(["{}", "notanaccount"])", kAcct1))); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidHotwallet); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidHotwallet); EXPECT_EQ(result.error().message, "hotwalletMalformed"); } @@ -144,7 +144,7 @@ TEST(GatewayBalancesSpec, V2HotWalletMalformedArrayElementIsInvalidParams) { auto const result = parseV2(withHotWallet(std::format(R"(["{}", "notanaccount"])", kAcct1))); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "hotwalletMalformed"); } @@ -152,6 +152,6 @@ TEST(GatewayBalancesSpec, HotWalletNonStringArrayElementIsRejected) { auto const result = parseV1(withHotWallet(std::format(R"(["{}", 42])", kAcct1))); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidHotwallet); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidHotwallet); EXPECT_EQ(result.error().message, "hotwalletMalformed"); } diff --git a/tests/SpecGetAggregatePriceTests.cpp b/tests/SpecGetAggregatePriceTests.cpp index a6b5dd9..c05f4c9 100644 --- a/tests/SpecGetAggregatePriceTests.cpp +++ b/tests/SpecGetAggregatePriceTests.cpp @@ -79,35 +79,35 @@ TEST(GetAggregatePriceSpec, OraclesNotArrayIsOracleMalformed) { auto const result = parse(withOracles(R"JSON("nope")JSON")); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcOracleMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcOracleMalformed); } TEST(GetAggregatePriceSpec, OraclesEmptyArrayIsOracleMalformed) { auto const result = parse(withOracles("[]")); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcOracleMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcOracleMalformed); } TEST(GetAggregatePriceSpec, OraclesElementNotObjectIsOracleMalformed) { auto const result = parse(withOracles(R"JSON([1])JSON")); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcOracleMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcOracleMalformed); } TEST(GetAggregatePriceSpec, OraclesMissingDocumentIdIsOracleMalformed) { auto const result = parse(withOracles(std::format(R"JSON([{{"account": "{}"}}])JSON", kAcct1))); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcOracleMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcOracleMalformed); } TEST(GetAggregatePriceSpec, OraclesMissingAccountIsOracleMalformed) { auto const result = parse(withOracles(R"JSON([{"oracle_document_id": 1}])JSON")); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcOracleMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcOracleMalformed); } TEST(GetAggregatePriceSpec, OraclesDocumentIdWrongTypeIsOracleMalformed) @@ -116,7 +116,7 @@ TEST(GetAggregatePriceSpec, OraclesDocumentIdWrongTypeIsOracleMalformed) auto const result = parse(withOracles( std::format(R"JSON([{{"oracle_document_id": {{}}, "account": "{}"}}])JSON", kAcct1))); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcOracleMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcOracleMalformed); } TEST(GetAggregatePriceSpec, OraclesDocumentIdNumericStringIsAccepted) @@ -137,7 +137,7 @@ TEST(GetAggregatePriceSpec, OraclesDocumentIdNonNumericStringIsInvalidParams) auto const result = parse(withOracles( std::format(R"JSON([{{"oracle_document_id": "a", "account": "{}"}}])JSON", kAcct1))); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(GetAggregatePriceSpec, OraclesMalformedAccountIsInvalidParams) @@ -145,14 +145,14 @@ TEST(GetAggregatePriceSpec, OraclesMalformedAccountIsInvalidParams) auto const result = parse(withOracles(R"JSON([{"oracle_document_id": 1, "account": "notanaccount"}])JSON")); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(GetAggregatePriceSpec, OraclesNonStringAccountIsInvalidParams) { auto const result = parse(withOracles(R"JSON([{"oracle_document_id": 1, "account": 5}])JSON")); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } // --- trim / time_threshold -------------------------------------------------- diff --git a/tests/SpecLedgerDataTests.cpp b/tests/SpecLedgerDataTests.cpp index 8562e0c..fcc88d6 100644 --- a/tests/SpecLedgerDataTests.cpp +++ b/tests/SpecLedgerDataTests.cpp @@ -99,7 +99,7 @@ TEST(LedgerDataSpec, NonHexStringMarkerIsMalformedField) { auto const result = parse(R"JSON({"marker": "NOTHEX"})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'marker'."); } @@ -110,7 +110,7 @@ TEST(LedgerDataSpec, OtherMarkerTypesReportMarkerNotString) { auto const result = parse(std::format(R"JSON({{"marker": {}}})JSON", bad)); ASSERT_FALSE(result.has_value()) << "marker=" << bad << " unexpectedly accepted"; - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams) << "marker=" << bad; + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams) << "marker=" << bad; EXPECT_EQ(result.error().message, "markerNotString") << "marker=" << bad; } } @@ -129,7 +129,7 @@ TEST(LedgerDataSpec, UnknownTypeIsInvalidField) { auto const result = parse(R"JSON({"type": "bogus"})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'type'."); } @@ -137,7 +137,7 @@ TEST(LedgerDataSpec, NonStringTypeIsExpectedFieldError) { auto const result = parse(R"JSON({"type": 5})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'type', not string."); } diff --git a/tests/SpecLedgerEntryTests.cpp b/tests/SpecLedgerEntryTests.cpp index a429306..ad4cc7e 100644 --- a/tests/SpecLedgerEntryTests.cpp +++ b/tests/SpecLedgerEntryTests.cpp @@ -211,7 +211,7 @@ TEST(LedgerEntrySpec, AuthorizedCredentialsIssuerRejectsZeroAccount) } })JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(LedgerEntrySpec, CredentialObjectTypeAcceptsHex) @@ -236,7 +236,7 @@ TEST(LedgerEntrySpec, CredentialObjectTypeRejectsNonHex) } })JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "credential_type NotHexString"); } @@ -250,7 +250,7 @@ TEST(LedgerEntrySpec, CredentialObjectTypeRejectsEmpty) } })JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "credential_type is empty"); } diff --git a/tests/SpecLedgerIndexTests.cpp b/tests/SpecLedgerIndexTests.cpp index 4ce9fb1..6cadeb5 100644 --- a/tests/SpecLedgerIndexTests.cpp +++ b/tests/SpecLedgerIndexTests.cpp @@ -82,7 +82,7 @@ TEST(LedgerIndexSpec, NonStringDateIsInvalidParams) { auto const result = parse(std::format(R"JSON({{"date": {}}})JSON", bad)); ASSERT_FALSE(result.has_value()) << "date=" << bad << " unexpectedly accepted"; - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams) << "date=" << bad; + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams) << "date=" << bad; } } @@ -94,6 +94,6 @@ TEST(LedgerIndexSpec, MisformattedDateIsInvalidParams) { auto const result = parse(std::format(R"JSON({{"date": "{}"}})JSON", bad)); ASSERT_FALSE(result.has_value()) << "date=" << bad << " unexpectedly accepted"; - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams) << "date=" << bad; + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams) << "date=" << bad; } } diff --git a/tests/SpecLedgerTests.cpp b/tests/SpecLedgerTests.cpp index 25efdda..2659107 100644 --- a/tests/SpecLedgerTests.cpp +++ b/tests/SpecLedgerTests.cpp @@ -73,7 +73,7 @@ TEST(LedgerSelector, EmptyIndexStringFails) auto value = boost::json::parse(R"JSON({ "ledger_index": "" })JSON"); auto const result = kLedgerSpec.parse(value); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(LedgerSelector, TrailingGarbageIndexStringFails) @@ -81,7 +81,7 @@ TEST(LedgerSelector, TrailingGarbageIndexStringFails) auto value = boost::json::parse(R"JSON({ "ledger_index": "30abc" })JSON"); auto const result = kLedgerSpec.parse(value); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(LedgerSelector, ShortcutValidated) @@ -131,7 +131,7 @@ TEST(LedgerSelector, UnknownIndexStringFails) auto value = boost::json::parse(R"JSON({ "ledger_index": "latest" })JSON"); auto const result = kLedgerSpec.parse(value); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(LedgerSelector, OutOfRangeNumericIndexFails) @@ -139,7 +139,7 @@ TEST(LedgerSelector, OutOfRangeNumericIndexFails) auto value = boost::json::parse(R"JSON({ "ledger_index": 9999999999 })JSON"); auto const result = kLedgerSpec.parse(value); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(LedgerSelector, NonStringNonNumberIndexFails) @@ -147,7 +147,7 @@ TEST(LedgerSelector, NonStringNonNumberIndexFails) auto value = boost::json::parse(R"JSON({ "ledger_index": true })JSON"); auto const result = kLedgerSpec.parse(value); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(LedgerSelector, ValidHashYieldsHash) @@ -165,7 +165,7 @@ TEST(LedgerSelector, MalformedHashFails) auto value = boost::json::parse(R"JSON({ "ledger_hash": "DEADBEEF" })JSON"); auto const result = kLedgerSpec.parse(value); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(LedgerSelector, NonStringHashFails) @@ -173,7 +173,7 @@ TEST(LedgerSelector, NonStringHashFails) auto value = boost::json::parse(R"JSON({ "ledger_hash": 123 })JSON"); auto const result = kLedgerSpec.parse(value); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } // Not mutually exclusive: when both are present, ledger_hash wins (mirrors the @@ -196,7 +196,7 @@ TEST(LedgerSelector, BothHashAndMalformedIndexFails) R"JSON({ "ledger_hash": "ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789", "ledger_index": "nonsense" })JSON"); auto const result = kLedgerSpec.parse(value); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } namespace { diff --git a/tests/SpecMPTHoldersTests.cpp b/tests/SpecMPTHoldersTests.cpp index da9e51e..ac51e13 100644 --- a/tests/SpecMPTHoldersTests.cpp +++ b/tests/SpecMPTHoldersTests.cpp @@ -65,7 +65,7 @@ TEST(MPTHoldersSpec, AccountsRejectsNonArray) { auto const result = parse(request(R"(, "accounts": "notanarray")")); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'accounts', not array."); } diff --git a/tests/SpecMPTokenIssuanceHistoryTests.cpp b/tests/SpecMPTokenIssuanceHistoryTests.cpp index 1ad7c8d..eb0e366 100644 --- a/tests/SpecMPTokenIssuanceHistoryTests.cpp +++ b/tests/SpecMPTokenIssuanceHistoryTests.cpp @@ -62,7 +62,7 @@ TEST(MPTokenIssuanceHistorySpec, MalformedMptIssuanceIdFails) { auto const result = parseHistory(R"JSON({"mpt_issuance_id": "NOTAHEX"})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(MPTokenIssuanceHistorySpec, AccountParses) @@ -91,7 +91,7 @@ TEST(MPTokenIssuanceHistorySpec, UnknownTxTypeFails) { auto const result = parseHistory(withMptId(R"JSON(, "tx_type": "NotARealType")JSON")); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'tx_type'."); } @@ -122,7 +122,7 @@ TEST(MPTokenIssuanceHistorySpec, NonObjectMarkerIsInvalidMarker) { auto const result = parseHistory(withMptId(R"JSON(, "marker": "nope")JSON")); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "invalidMarker"); } diff --git a/tests/SpecMockBackendTests.cpp b/tests/SpecMockBackendTests.cpp index 5b6ad28..3a0252e 100644 --- a/tests/SpecMockBackendTests.cpp +++ b/tests/SpecMockBackendTests.cpp @@ -271,7 +271,7 @@ TEST(RpcSpecDSL_MockBackend, MissingRequiredFieldFails) MockObjectView root{obj}; auto const result = kSPEC.process(root); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Required field 'account' missing"); } @@ -285,7 +285,7 @@ TEST(RpcSpecDSL_MockBackend, WrongTypeFails) MockObjectView root{obj}; auto const result = kSPEC.process(root); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_TRUE(result.error().message.empty()); } @@ -328,7 +328,7 @@ TEST(RpcSpecDSL_MockBackend, IfTypeRunsOnMatch) MockObjectView badRoot{bad}; auto const result = kSPEC.process(badRoot); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_TRUE(result.error().message.empty()); MockObject good{.fields = {{"value", int64_t{5}}}}; diff --git a/tests/SpecModifierTests.cpp b/tests/SpecModifierTests.cpp index 546d1ae..c3fc435 100644 --- a/tests/SpecModifierTests.cpp +++ b/tests/SpecModifierTests.cpp @@ -87,7 +87,7 @@ TEST(RpcSpecDSL_IfType, RunsSubValidatorsOnTypeMatch) auto bad = boost::json::parse(R"JSON({ "value": 0 })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_TRUE(result.error().message.empty()); auto good = boost::json::parse(R"JSON({ "value": 5 })JSON"); @@ -153,7 +153,7 @@ TEST(RpcSpecDSL_IfType, StopsAtFirstSubValidatorError) auto request = boost::json::parse(R"JSON({ "value": 3 })JSON"); auto const result = kSpec.process(request); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_TRUE(result.error().message.empty()); } @@ -213,7 +213,7 @@ TEST(RpcSpecDSL_IfType, CombinedWithOtherValidators) boost::json::parse(R"JSON({ "account": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn" })JSON"); auto const result = kSpec.process(noLimit); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Required field 'limit' missing"); auto strLimit = boost::json::parse( @@ -268,7 +268,7 @@ TEST(RpcSpecDSL_Section, MissingRequiredSubFieldFails) auto request = boost::json::parse(R"JSON({ "taker_pays": {} })JSON"); auto const result = kSpec.process(request); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Required field 'currency' missing"); } @@ -281,7 +281,7 @@ TEST(RpcSpecDSL_Section, WrongSubFieldTypeFails) auto request = boost::json::parse(R"JSON({ "taker_pays": { "currency": 42 } })JSON"); auto const result = kSpec.process(request); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(RpcSpecDSL_Section, AbsentParentFieldSkipsSection) @@ -303,7 +303,7 @@ TEST(RpcSpecDSL_Section, NonObjectParentFieldFails) auto request = boost::json::parse(R"JSON({ "taker_pays": "XRP" })JSON"); auto const result = kSpec.process(request); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(RpcSpecDSL_Section, ModifierMutatesSubField) @@ -355,7 +355,7 @@ TEST(RpcSpecDSL_IfObject, RunsSectionWhenFieldIsObject) auto bad = boost::json::parse(R"JSON({ "entry": {} })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Required field 'a' missing"); } @@ -402,20 +402,20 @@ TEST(RpcSpecDSL_IfArray, AbsentFieldSkipped) TEST(RpcSpecDSL_WithCustomError, OverridesCodeOnRequirementFailure) { static constexpr auto kSpec = RpcSpec{ - field("account", withCustomError(required, rpc::RippledError::RpcActMalformed)), + field("account", withCustomError(required, rpc::XrpldError::RpcActMalformed)), }; auto request = boost::json::parse(R"JSON({})JSON"); auto const result = kSpec.process(request); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcActMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcActMalformed); EXPECT_TRUE(result.error().message.empty()); } TEST(RpcSpecDSL_WithCustomError, PassesThroughWhenWrappedSucceeds) { static constexpr auto kSpec = RpcSpec{ - field("account", withCustomError(required, rpc::RippledError::RpcActMalformed)), + field("account", withCustomError(required, rpc::XrpldError::RpcActMalformed)), }; auto request = @@ -428,13 +428,13 @@ TEST(RpcSpecDSL_WithCustomError, AppendsCustomMessageOnFailure) static constexpr auto kSpec = RpcSpec{ field( "marker", - withCustomError(required, rpc::RippledError::RpcInvalidParams, "invalidMarker")), + withCustomError(required, rpc::XrpldError::RpcInvalidParams, "invalidMarker")), }; auto request = boost::json::parse(R"JSON({})JSON"); auto const result = kSpec.process(request); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "invalidMarker"); } @@ -445,13 +445,13 @@ TEST(RpcSpecDSL_WithCustomError, ModifierPathOverridesCode) field( "limit", withCustomError( - ifType(min(int64_t{1})), rpc::RippledError::RpcInvalidParams, "tooLow")), + ifType(min(int64_t{1})), rpc::XrpldError::RpcInvalidParams, "tooLow")), }; auto bad = boost::json::parse(R"JSON({ "limit": 0 })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "tooLow"); auto skipped = boost::json::parse(R"JSON({ "limit": "default" })JSON"); @@ -487,13 +487,13 @@ TEST(RpcSpecDSL_CustomModifier, LambdaCanReturnError) { static constexpr auto kSpec = RpcSpec{ field("val", customModifier([](auto& /*f*/) -> rpc::spec::MaybeError { - return std::unexpected{rpc::Status{rpc::RippledError::RpcInvalidParams}}; + return std::unexpected{rpc::Status{rpc::XrpldError::RpcInvalidParams}}; })), }; auto request = boost::json::parse(R"JSON({ "val": 1 })JSON"); auto const result = kSpec.process(request); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(RpcSpecDSL_ToLower, ConvertsToLowercase) @@ -636,5 +636,5 @@ TEST(TypedSpecModifier, ConverterValidatesModifiedValue) auto wrongType = boost::json::parse(R"JSON({ "limit": "not a number" })JSON"); auto const result = kSpec.parse(wrongType); // clamp no-ops on non-uint, converter rejects ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } diff --git a/tests/SpecNftHistoryTests.cpp b/tests/SpecNftHistoryTests.cpp index 82ab583..4fad94e 100644 --- a/tests/SpecNftHistoryTests.cpp +++ b/tests/SpecNftHistoryTests.cpp @@ -148,7 +148,7 @@ TEST(NftHistorySpec, NonObjectMarkerReportsInvalidMarker) { auto const result = parse(req(std::format(R"JSON(, "marker": {})JSON", bad))); ASSERT_FALSE(result.has_value()) << "marker=" << bad << " unexpectedly accepted"; - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams) << "marker=" << bad; + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams) << "marker=" << bad; EXPECT_EQ(result.error().message, "invalidMarker") << "marker=" << bad; } } diff --git a/tests/SpecNoRippleCheckTests.cpp b/tests/SpecNoRippleCheckTests.cpp index 556c769..1d18875 100644 --- a/tests/SpecNoRippleCheckTests.cpp +++ b/tests/SpecNoRippleCheckTests.cpp @@ -79,7 +79,7 @@ TEST(NoRippleCheckSpec, UnknownRoleIsRejectedWithCustomMessage) auto const result = parseV1(std::format(R"JSON({{"account": "{}", "role": "bogus"}})JSON", kAcct1)); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "role field is invalid"); } @@ -88,7 +88,7 @@ TEST(NoRippleCheckSpec, NonStringRoleIsRejectedWithCustomMessage) // The withCustomError wraps the whole oneOf, so a type failure reads the same. auto const result = parseV1(std::format(R"JSON({{"account": "{}", "role": 5}})JSON", kAcct1)); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "role field is invalid"); } @@ -97,7 +97,7 @@ TEST(NoRippleCheckSpec, RoleIsCaseSensitive) auto const result = parseV1(std::format(R"JSON({{"account": "{}", "role": "Gateway"}})JSON", kAcct1)); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } // --- limit ------------------------------------------------------------------ diff --git a/tests/SpecServerConditionalTests.cpp b/tests/SpecServerConditionalTests.cpp index 4b7c085..435d0a8 100644 --- a/tests/SpecServerConditionalTests.cpp +++ b/tests/SpecServerConditionalTests.cpp @@ -32,7 +32,7 @@ using namespace rpc::spec; static_assert( std::variant_size_v == 2, - "Clio build: CombinedError must be variant"); + "Clio build: CombinedError must be variant"); static_assert(std::is_same_v, rpc::ClioError>); namespace { @@ -50,7 +50,7 @@ TEST(ServerConditionalClio, IfServerClioValidatorIsApplied) auto bad = boost::json::parse(R"JSON({ "clio_only": true })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcNotSupported); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcNotSupported); } TEST(ServerConditionalClio, IfServerClioValidatorAllowsNonTriggeringValue) @@ -70,7 +70,7 @@ TEST(SubscribeSpecClio, ServerStreamRejectedWithNotSupported) auto value = boost::json::parse(R"JSON({"streams": ["server"]})JSON"); auto const result = handlers::subscribe::kInputSpec.parse(value); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcNotSupported); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcNotSupported); } TEST(SubscribeSpecClio, ConsensusStreamRejectedWithNotSupported) @@ -78,7 +78,7 @@ TEST(SubscribeSpecClio, ConsensusStreamRejectedWithNotSupported) auto value = boost::json::parse(R"JSON({"streams": ["consensus"]})JSON"); auto const result = handlers::subscribe::kInputSpec.parse(value); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcNotSupported); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcNotSupported); } TEST(SubscribeSpecClio, PeerStatusStreamRejectedWithNotSupported) @@ -86,7 +86,7 @@ TEST(SubscribeSpecClio, PeerStatusStreamRejectedWithNotSupported) auto value = boost::json::parse(R"JSON({"streams": ["peer_status"]})JSON"); auto const result = handlers::subscribe::kInputSpec.parse(value); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcNotSupported); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcNotSupported); } TEST(SubscribeSpecClio, LedgerStreamAccepted) @@ -116,7 +116,7 @@ TEST(UnsubscribeSpecClio, ServerStreamRejectedWithNotSupported) auto value = boost::json::parse(R"JSON({"streams": ["server"]})JSON"); auto const result = handlers::unsubscribe::kInputSpec.parse(value); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcNotSupported); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcNotSupported); } TEST(UnsubscribeSpecClio, LedgerStreamAccepted) diff --git a/tests/SpecSubscribeTests.cpp b/tests/SpecSubscribeTests.cpp index a06d5dc..19287a2 100644 --- a/tests/SpecSubscribeTests.cpp +++ b/tests/SpecSubscribeTests.cpp @@ -177,7 +177,7 @@ TEST(SubscribeSpec, BooksIdenticalAssetsIsBadMarketWithNoMessageOverride) ] })JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcBadMarket); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcBadMarket); // No override: the consumer renders "No such market." from the error table. EXPECT_TRUE(result.error().message.empty()) << "unexpected: " << result.error().message; } @@ -199,7 +199,7 @@ TEST(SubscribeSpec, BooksIdenticalIouAndIssuerIsBadMarket) ] })JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcBadMarket); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcBadMarket); EXPECT_TRUE(result.error().message.empty()) << "unexpected: " << result.error().message; } @@ -207,7 +207,7 @@ TEST(SubscribeSpec, BooksMissingTakerPays) { auto const result = parseSub(R"JSON({"books": [{"taker_gets": {"currency": "XRP"}}]})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Missing field 'taker_pays'"); } @@ -217,7 +217,7 @@ TEST(SubscribeSpec, BooksTakerPaysNotObject) "books": [{"taker_pays": "XRP", "taker_gets": {"currency": "XRP"}}] })JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Field 'taker_pays' is not an object"); } @@ -225,7 +225,7 @@ TEST(SubscribeSpec, BooksMissingTakerGets) { auto const result = parseSub(R"JSON({"books": [{"taker_pays": {"currency": "XRP"}}]})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Missing field 'taker_gets'"); } @@ -235,7 +235,7 @@ TEST(SubscribeSpec, BooksPaysCurrencyMissingIsSrcCurMalformed) "books": [{"taker_pays": {}, "taker_gets": {"currency": "XRP"}}] })JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcSrcCurMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcSrcCurMalformed); } TEST(SubscribeSpec, BooksGetsCurrencyMissingIsDstAmtMalformed) @@ -244,7 +244,7 @@ TEST(SubscribeSpec, BooksGetsCurrencyMissingIsDstAmtMalformed) "books": [{"taker_pays": {"currency": "XRP"}, "taker_gets": {}}] })JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcDstAmtMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcDstAmtMalformed); } TEST(SubscribeSpec, BooksUnneededPaysIssuerForXrp) @@ -261,7 +261,7 @@ TEST(SubscribeSpec, BooksUnneededPaysIssuerForXrp) ] })JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcSrcIsrMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcSrcIsrMalformed); EXPECT_EQ( result.error().message, "Unneeded field 'taker_pays.issuer' for XRP currency specification."); @@ -278,7 +278,7 @@ TEST(SubscribeSpec, BooksNonXrpPaysWithoutIssuerIsSrcIsrMalformed) ] })JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcSrcIsrMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcSrcIsrMalformed); EXPECT_EQ( result.error().message, "Invalid field 'taker_pays.issuer', expected non-XRP issuer."); } @@ -297,7 +297,7 @@ TEST(SubscribeSpec, BooksGetsIssuerAccountOneIsRejected) ] })JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcDstIsrMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcDstIsrMalformed); EXPECT_EQ(result.error().message, "Invalid field 'taker_gets.issuer', bad issuer account one."); } @@ -316,7 +316,7 @@ TEST(SubscribeSpec, BooksDomainNotStringIsDomainMalformed) ] })JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcDomainMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcDomainMalformed); } TEST(SubscribeSpec, BooksDomainNotHexIsDomainMalformed) @@ -334,7 +334,7 @@ TEST(SubscribeSpec, BooksDomainNotHexIsDomainMalformed) ] })JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcDomainMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcDomainMalformed); } TEST(SubscribeDump, FieldKeysAndStreamValuesPresent) @@ -418,7 +418,7 @@ TEST(UnsubscribeSpec, BooksIdenticalAssetsIsBadMarketWithNoMessageOverride) ] })JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcBadMarket); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcBadMarket); // No override: the consumer renders "No such market." from the error table. EXPECT_TRUE(result.error().message.empty()) << "unexpected: " << result.error().message; } @@ -427,7 +427,7 @@ TEST(UnsubscribeSpec, BooksMissingTakerGets) { auto const result = parseUnsub(R"JSON({"books": [{"taker_pays": {"currency": "XRP"}}]})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Missing field 'taker_gets'"); } diff --git a/tests/SpecValidatorTests.cpp b/tests/SpecValidatorTests.cpp index f8fa2ad..a992376 100644 --- a/tests/SpecValidatorTests.cpp +++ b/tests/SpecValidatorTests.cpp @@ -21,8 +21,8 @@ namespace { static_assert( std::variant_size_v == 1, - "xrpld build: CombinedError must be variant only"); -static_assert(std::is_same_v, rpc::RippledError>); + "xrpld build: CombinedError must be variant only"); +static_assert(std::is_same_v, rpc::XrpldError>); TEST(RpcSpecDSL_Type, StringDirect) { @@ -36,7 +36,7 @@ TEST(RpcSpecDSL_Type, StringDirect) auto bad = boost::json::parse(R"JSON({ "name": 42 })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_TRUE(result.error().message.empty()); } @@ -52,7 +52,7 @@ TEST(RpcSpecDSL_Type, DoubleAcceptsDoubleAndRejectsOthers) auto bad = boost::json::parse(R"JSON({ "ratio": "high" })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_TRUE(result.error().message.empty()); auto absent = boost::json::parse(R"JSON({})JSON"); @@ -74,12 +74,12 @@ TEST(RpcSpecDSL_Type, Uint32AcceptsInRangeRejectsOthers) auto overflow = boost::json::parse(R"JSON({ "n": 4294967296 })JSON"); auto const r1 = kSpec.process(overflow); ASSERT_FALSE(r1.has_value()); - EXPECT_EQ(r1.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(r1.error(), rpc::XrpldError::RpcInvalidParams); auto negative = boost::json::parse(R"JSON({ "n": -1 })JSON"); auto const r2 = kSpec.process(negative); ASSERT_FALSE(r2.has_value()); - EXPECT_EQ(r2.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(r2.error(), rpc::XrpldError::RpcInvalidParams); } TEST(RpcSpecDSL_TypeObject, AcceptsObjectRejectsOthers) @@ -94,7 +94,7 @@ TEST(RpcSpecDSL_TypeObject, AcceptsObjectRejectsOthers) auto str = boost::json::parse(R"JSON({ "entry": "hello" })JSON"); auto const result = kSpec.process(str); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_TRUE(result.error().message.empty()); auto absent = boost::json::parse(R"JSON({})JSON"); @@ -143,7 +143,7 @@ TEST(RpcSpecDSL_MultiType, RejectsNeitherType) auto bad = boost::json::parse(R"JSON({ "v": true })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(RpcSpecDSL_MultiType, AcceptsObjectWhenIncluded) @@ -179,7 +179,7 @@ TEST(RpcSpecDSL_Min, Double) auto bad = boost::json::parse(R"JSON({ "ratio": 0.1 })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_TRUE(result.error().message.empty()); auto good = boost::json::parse(R"JSON({ "ratio": 1.0 })JSON"); @@ -195,7 +195,7 @@ TEST(RpcSpecDSL_Min, Uint32) auto bad = boost::json::parse(R"JSON({ "n": 5 })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); auto good = boost::json::parse(R"JSON({ "n": 100 })JSON"); EXPECT_TRUE(kSpec.process(good).has_value()); @@ -230,7 +230,7 @@ TEST(RpcSpecDSL_Between, Uint32BelowLoFails) auto bad = boost::json::parse(R"JSON({ "trim": 0 })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(RpcSpecDSL_Between, Uint32AboveHiFails) @@ -241,7 +241,7 @@ TEST(RpcSpecDSL_Between, Uint32AboveHiFails) auto bad = boost::json::parse(R"JSON({ "trim": 26 })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(RpcSpecDSL_Between, AbsentFieldPasses) @@ -263,7 +263,7 @@ TEST(RpcSpecDSL_Int64Boundary, Uint64AboveInt64MaxFailsTypeInt64) auto request = boost::json::parse(R"JSON({ "n": 9223372036854775808 })JSON"); auto const result = kSpec.process(request); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_TRUE(result.error().message.empty()); } @@ -287,7 +287,7 @@ TEST(RpcSpecDSL_AccountFormat, RejectsInvalidString) auto bad = boost::json::parse(R"JSON({ "account": "rNotAValidAccount" })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcActMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcActMalformed); EXPECT_EQ(result.error().message, "accountMalformed"); } @@ -300,7 +300,7 @@ TEST(RpcSpecDSL_AccountFormat, RejectsNonString) auto bad = boost::json::parse(R"JSON({ "account": 12345 })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "accountNotString"); } @@ -333,7 +333,7 @@ TEST(RpcSpecDSL_TimeFormat, MalformedStringRejected) auto request = boost::json::parse(R"JSON({ "date": "not-a-date" })JSON"); auto const result = kSpec.process(request); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(RpcSpecDSL_TimeFormat, NonStringRejected) @@ -345,7 +345,7 @@ TEST(RpcSpecDSL_TimeFormat, NonStringRejected) auto request = boost::json::parse(R"JSON({ "date": 12345 })JSON"); auto const result = kSpec.process(request); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(RpcSpecDSL_TimeFormat, AbsentFieldAccepted) @@ -376,7 +376,7 @@ TEST(RpcSpecDSL_HexString, Uint256RejectsMalformedHex) auto bad = boost::json::parse(R"JSON({ "hash": "NOTAHEX" })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'hash'."); } @@ -388,7 +388,7 @@ TEST(RpcSpecDSL_HexString, Uint256RejectsNonString) auto bad = boost::json::parse(R"JSON({ "hash": 42 })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'hash'."); } @@ -427,7 +427,7 @@ TEST(RpcSpecDSL_Hex256Array, InvalidElementFails) auto bad = boost::json::parse(R"JSON({ "credentials": ["NOTAHEX"] })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(RpcSpecDSL_Hex256Array, NotAnArrayFails) @@ -436,7 +436,7 @@ TEST(RpcSpecDSL_Hex256Array, NotAnArrayFails) auto bad = boost::json::parse(R"JSON({ "credentials": "abc" })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(RpcSpecDSL_Hex256Array, AbsentFieldPasses) @@ -510,7 +510,7 @@ TEST(RpcSpecDSL_LedgerIndex, RejectsArbitraryString) auto req = boost::json::parse(R"JSON({ "ledger_index": "invalid" })JSON"); auto const result = kSpec.process(req); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'ledger_index', not string or number."); } @@ -543,7 +543,7 @@ TEST(RpcSpecDSL_AccountBase58, RejectsNonString) auto req = boost::json::parse(R"JSON({ "account": 42 })JSON"); auto const result = kSpec.process(req); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "accountNotString"); } @@ -553,7 +553,7 @@ TEST(RpcSpecDSL_AccountBase58, RejectsInvalidAccount) auto req = boost::json::parse(R"JSON({ "account": "rNotValid" })JSON"); auto const result = kSpec.process(req); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(RpcSpecDSL_AccountBase58, AbsentFieldSkipped) @@ -583,7 +583,7 @@ TEST(RpcSpecDSL_Currency, RejectsNonString) auto req = boost::json::parse(R"JSON({ "currency": 42 })JSON"); auto const result = kSpec.process(req); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "currencyNotString"); } @@ -593,7 +593,7 @@ TEST(RpcSpecDSL_Currency, RejectsEmpty) auto req = boost::json::parse(R"JSON({ "currency": "" })JSON"); auto const result = kSpec.process(req); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "currencyIsEmpty"); } @@ -604,7 +604,7 @@ TEST(RpcSpecDSL_Currency, RejectsMalformed) boost::json::parse(R"JSON({ "currency": "NOT_VALID_CURRENCY_STRING_TOO_LONG" })JSON"); auto const result = kSpec.process(req); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(RpcSpecDSL_Currency, AbsentFieldSkipped) @@ -631,7 +631,7 @@ TEST(RpcSpecDSL_NotSupported, PresentFieldFails) auto present = boost::json::parse(R"JSON({ "full": true })JSON"); auto const result = kSpec.process(present); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcNotSupported); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcNotSupported); } // Rippled side of the server-conditional branch. The Clio side lives in its own @@ -654,7 +654,7 @@ TEST(RpcSpecDSL_ServerConditional, IfServerXrpldValidatorIsApplied) auto bad = boost::json::parse(R"JSON({ "xrpld_only": true })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcNotSupported); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcNotSupported); } TEST(RpcSpecDSL_OneOf, AcceptsValidValue) @@ -677,7 +677,7 @@ TEST(RpcSpecDSL_OneOf, RejectsUnknownValue) auto bad = boost::json::parse(R"JSON({ "role": "admin" })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(RpcSpecDSL_OneOf, RejectsNonString) @@ -688,7 +688,7 @@ TEST(RpcSpecDSL_OneOf, RejectsNonString) auto bad = boost::json::parse(R"JSON({ "role": 42 })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(RpcSpecDSL_OneOf, AbsentFieldPasses) @@ -721,7 +721,7 @@ TEST(RpcSpecDSL_AccountMarker, NotStringFails) auto bad = boost::json::parse(R"JSON({ "marker": 42 })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "markerNotString"); } @@ -766,7 +766,7 @@ TEST(RpcSpecDSL_AccountType, UnknownTypeStringFails) auto bad = boost::json::parse(R"JSON({ "type": "not_a_type" })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(RpcSpecDSL_AccountType, NonStringFails) @@ -796,7 +796,7 @@ TEST(RpcSpecDSL_LedgerEntryType, UnknownTypeStringFails) auto bad = boost::json::parse(R"JSON({ "type": "not_a_type" })JSON"); auto const result = kSpec.process(bad); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); } TEST(RpcSpecDSL_LedgerEntryType, AbsentFieldPasses) diff --git a/tests/SpecVaultInfoTests.cpp b/tests/SpecVaultInfoTests.cpp index be15c32..4338f14 100644 --- a/tests/SpecVaultInfoTests.cpp +++ b/tests/SpecVaultInfoTests.cpp @@ -86,7 +86,7 @@ TEST(VaultInfoSpec, NonHexVaultIdIsInvalidParamsWithFieldMessage) { auto const result = parse(R"JSON({"vault_id": "NOTHEX"})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'vault_id', not hex string."); } @@ -94,7 +94,7 @@ TEST(VaultInfoSpec, NonStringVaultIdIsInvalidParamsWithFieldMessage) { auto const result = parse(R"JSON({"vault_id": 5})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'vault_id', not hex string."); } @@ -102,7 +102,7 @@ TEST(VaultInfoSpec, MalformedOwnerIsActMalformedWithFieldMessage) { auto const result = parse(R"JSON({"owner": "notanaccount"})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcActMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcActMalformed); EXPECT_EQ(result.error().message, "Invalid field 'owner', not AccountID."); } @@ -110,7 +110,7 @@ TEST(VaultInfoSpec, NonStringOwnerIsActMalformedWithFieldMessage) { auto const result = parse(R"JSON({"owner": 5})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcActMalformed); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcActMalformed); EXPECT_EQ(result.error().message, "Invalid field 'owner', not AccountID."); } @@ -118,7 +118,7 @@ TEST(VaultInfoSpec, NonIntegerSeqIsInvalidParamsWithFieldMessage) { auto const result = parse(R"JSON({"seq": "5"})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'seq', not a positive 32-bit integer."); } @@ -126,6 +126,6 @@ TEST(VaultInfoSpec, NegativeSeqIsInvalidParamsWithFieldMessage) { auto const result = parse(R"JSON({"seq": -1})JSON"); ASSERT_FALSE(result.has_value()); - EXPECT_EQ(result.error(), rpc::RippledError::RpcInvalidParams); + EXPECT_EQ(result.error(), rpc::XrpldError::RpcInvalidParams); EXPECT_EQ(result.error().message, "Invalid field 'seq', not a positive 32-bit integer."); } From e8fd8de78efe8010a5a4223449b8094fc7f9b3a5 Mon Sep 17 00:00:00 2001 From: Alex Kremer Date: Fri, 25 Sep 2026 15:19:59 +0100 Subject: [PATCH 3/4] Add windows ci --- .github/actions/cmake/action.yml | 14 +++++++++++--- .github/actions/conan/action.yml | 10 ++++++++-- .github/workflows/build.yml | 10 +++++++++- .github/workflows/reusable-build-test.yml | 8 ++++---- 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/.github/actions/cmake/action.yml b/.github/actions/cmake/action.yml index 3f0e49e..949c5a6 100644 --- a/.github/actions/cmake/action.yml +++ b/.github/actions/cmake/action.yml @@ -15,11 +15,19 @@ runs: env: BUILD_TYPE: "${{ inputs.build_type }}" run: | - # Conan names its single-config presets after the lowercased build type. + # Conan names its build and test presets after the lowercased build type. With a + # single-config generator the configure preset shares that name; with the multi-config + # Visual Studio one on Windows there is a single `conan-default` configure preset. PRESET="conan-$(echo "${BUILD_TYPE}" | tr '[:upper:]' '[:lower:]')" - cmake --preset "${PRESET}" \ + CONFIGURE_PRESET="${PRESET}" + BUILD_DIR="build/${BUILD_TYPE}" + if [[ "${RUNNER_OS}" == "Windows" ]]; then + CONFIGURE_PRESET="conan-default" + BUILD_DIR="build" + fi + cmake --preset "${CONFIGURE_PRESET}" \ -Drpcspec_tests=ON \ -DCMAKE_EXPORT_COMPILE_COMMANDS=ON # Export both for later steps: ctest needs the preset, clang-tidy the build dir. echo "RPCSPEC_PRESET=${PRESET}" >>"${GITHUB_ENV}" - echo "RPCSPEC_BUILD_DIR=build/${BUILD_TYPE}" >>"${GITHUB_ENV}" + echo "RPCSPEC_BUILD_DIR=${BUILD_DIR}" >>"${GITHUB_ENV}" diff --git a/.github/actions/conan/action.yml b/.github/actions/conan/action.yml index d5f405b..890df5a 100644 --- a/.github/actions/conan/action.yml +++ b/.github/actions/conan/action.yml @@ -20,11 +20,17 @@ runs: BUILD_TYPE: "${{ inputs.build_type }}" CONAN_BUILD_OPTION: "${{ inputs.force_conan_source_build == 'true' && '*' || 'missing' }}" run: | - # `cmake_layout` puts the generators under build//generators, which is - # what the conan- CMake presets below point at, so no -of is passed here. + # `cmake_layout` puts the generators where the conan-* CMake presets point, so no -of + # is passed here: build//generators for single-config generators, and + # build/generators for the multi-config Visual Studio one on Windows. + EXTRA_CONF=() + if [[ "${RUNNER_OS}" == "Windows" ]]; then + EXTRA_CONF=(-c "tools.cmake.cmaketoolchain:generator=Visual Studio 18 2026") + fi conan \ install . \ -b "${CONAN_BUILD_OPTION}" \ -o '&:tests=True' \ -s "build_type=${BUILD_TYPE}" \ + "${EXTRA_CONF[@]}" \ --profile:all ci diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 87e4dfb..eab4410 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -39,10 +39,18 @@ jobs: compiler: apple-clang build_type: Debug container: "" + - os: [self-hosted, Windows, dev-box-windows-2026] + compiler: msvc + build_type: Release + container: "" + - os: [self-hosted, Windows, dev-box-windows-2026] + compiler: msvc + build_type: Debug + container: "" uses: ./.github/workflows/reusable-build-test.yml with: - runs_on: ${{ matrix.os }} + runs_on: ${{ toJSON(matrix.os) }} container: ${{ matrix.container }} compiler: ${{ matrix.compiler }} build_type: ${{ matrix.build_type }} diff --git a/.github/workflows/reusable-build-test.yml b/.github/workflows/reusable-build-test.yml index 1b02948..9147c06 100644 --- a/.github/workflows/reusable-build-test.yml +++ b/.github/workflows/reusable-build-test.yml @@ -4,7 +4,7 @@ on: workflow_call: inputs: runs_on: - description: Runner to run the job on + description: Runner label or list of labels to run the job on, as JSON required: true type: string @@ -14,7 +14,7 @@ on: type: string compiler: - description: 'Compiler to build with ("gcc", "clang" or "apple-clang")' + description: 'Compiler to build with ("gcc", "clang", "apple-clang" or "msvc")' required: true type: string @@ -30,12 +30,12 @@ defaults: jobs: build-and-test: name: Build and test - runs-on: ${{ inputs.runs_on }} + runs-on: ${{ fromJSON(inputs.runs_on) }} container: ${{ inputs.container != '' && fromJson(inputs.container) || null }} steps: - name: Cleanup workspace - if: ${{ runner.os == 'macOS' }} + if: ${{ runner.os == 'macOS' || runner.os == 'Windows' }} uses: XRPLF/actions/cleanup-workspace@c7d9ce5ebb03c752a354889ecd870cadfc2b1cd4 - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 From 713ff58fbf6fccf0905bcb7120b3c7fa41869745 Mon Sep 17 00:00:00 2001 From: Alex Kremer Date: Fri, 25 Sep 2026 15:45:25 +0100 Subject: [PATCH 4/4] Fix windows ci hopefully --- CMakeLists.txt | 6 ++++++ conan/profiles/ci | 10 ++++++++++ include/admissionspec/Types.hpp | 10 +++++----- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 928321a..21f63e1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,6 +18,12 @@ find_package(Boost REQUIRED COMPONENTS json) target_link_libraries(rpcspec INTERFACE Boost::json) +# Boost's headers ask MSVC to auto-link version-mangled library names that Conan's packages +# don't use. Link the real targets only, as xrpld does. +if(TARGET Boost::disable_autolinking) + target_link_libraries(rpcspec INTERFACE Boost::disable_autolinking) +endif() + # The spec proper must not name a JSON library: consumers supply the view types it reads # requests through (see include/rpcspec/backends for the one shipped implementation, and # the ObjectViewFor customization point in Concepts.hpp). Checked here so the invariant diff --git a/conan/profiles/ci b/conan/profiles/ci index e6d5682..e777a26 100644 --- a/conan/profiles/ci +++ b/conan/profiles/ci @@ -10,3 +10,13 @@ include(default) user.package:libc_version=2.31 tools.info.package_id:confs+=["user.package:libc_version"] {% endif %} + +{% if os == "Windows" %} +{# rippled is the only project publishing Windows binaries; any Boost option that differs from #} +{# its build is a different package ID, and Boost then builds from source here. #} +[options] +boost/*:without_cobalt=True +boost/*:without_context=False +boost/*:without_coroutine=True +boost/*:without_coroutine2=False +{% endif %} diff --git a/include/admissionspec/Types.hpp b/include/admissionspec/Types.hpp index e58e6eb..3d57357 100644 --- a/include/admissionspec/Types.hpp +++ b/include/admissionspec/Types.hpp @@ -102,7 +102,7 @@ struct AdmissionDecision * @return The comparison result. */ bool - operator<=>(AdmissionDecision const&) const = default; + operator==(AdmissionDecision const&) const = default; }; /** @@ -210,7 +210,7 @@ struct FixedString * @return The comparison result. */ bool - operator<=>(FixedString const&) const = default; + operator==(FixedString const&) const = default; }; template @@ -230,7 +230,7 @@ struct SizeTier * @return The comparison result. */ bool - operator<=>(SizeTier const&) const = default; + operator==(SizeTier const&) const = default; }; /** @@ -265,7 +265,7 @@ struct SizeCostRamp * @return The comparison result. */ bool - operator<=>(SizeCostRamp const&) const = default; + operator==(SizeCostRamp const&) const = default; }; template @@ -343,7 +343,7 @@ struct Tunable * @return The comparison result. */ bool - operator<=>(Tunable const&) const = default; + operator==(Tunable const&) const = default; }; /**