mirror of
https://github.com/XRPLF/clio.git
synced 2025-11-20 03:35:55 +00:00
refactor: Structure global validators better (#1484)
refactor: #1170 Structure global validators better
This commit is contained in:
@@ -69,7 +69,7 @@ checkIsU32Numeric(std::string_view sv)
|
||||
return ec == std::errc();
|
||||
}
|
||||
|
||||
CustomValidator Uint256HexStringValidator =
|
||||
CustomValidator CustomValidators::Uint256HexStringValidator =
|
||||
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
|
||||
if (!value.is_string())
|
||||
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}};
|
||||
@@ -81,7 +81,7 @@ CustomValidator Uint256HexStringValidator =
|
||||
return MaybeError{};
|
||||
}};
|
||||
|
||||
CustomValidator LedgerIndexValidator =
|
||||
CustomValidator CustomValidators::LedgerIndexValidator =
|
||||
CustomValidator{[](boost::json::value const& value, std::string_view /* key */) -> MaybeError {
|
||||
auto err = Error{Status{RippledError::rpcINVALID_PARAMS, "ledgerIndexMalformed"}};
|
||||
|
||||
@@ -95,7 +95,7 @@ CustomValidator LedgerIndexValidator =
|
||||
return MaybeError{};
|
||||
}};
|
||||
|
||||
CustomValidator AccountValidator =
|
||||
CustomValidator CustomValidators::AccountValidator =
|
||||
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
|
||||
if (!value.is_string())
|
||||
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}};
|
||||
@@ -108,7 +108,7 @@ CustomValidator AccountValidator =
|
||||
return MaybeError{};
|
||||
}};
|
||||
|
||||
CustomValidator AccountBase58Validator =
|
||||
CustomValidator CustomValidators::AccountBase58Validator =
|
||||
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
|
||||
if (!value.is_string())
|
||||
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}};
|
||||
@@ -120,7 +120,7 @@ CustomValidator AccountBase58Validator =
|
||||
return MaybeError{};
|
||||
}};
|
||||
|
||||
CustomValidator AccountMarkerValidator =
|
||||
CustomValidator CustomValidators::AccountMarkerValidator =
|
||||
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
|
||||
if (!value.is_string())
|
||||
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}};
|
||||
@@ -135,7 +135,7 @@ CustomValidator AccountMarkerValidator =
|
||||
return MaybeError{};
|
||||
}};
|
||||
|
||||
CustomValidator CurrencyValidator =
|
||||
CustomValidator CustomValidators::CurrencyValidator =
|
||||
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
|
||||
if (!value.is_string())
|
||||
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}};
|
||||
@@ -151,7 +151,7 @@ CustomValidator CurrencyValidator =
|
||||
return MaybeError{};
|
||||
}};
|
||||
|
||||
CustomValidator IssuerValidator =
|
||||
CustomValidator CustomValidators::IssuerValidator =
|
||||
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
|
||||
if (!value.is_string())
|
||||
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}};
|
||||
@@ -171,7 +171,7 @@ CustomValidator IssuerValidator =
|
||||
return MaybeError{};
|
||||
}};
|
||||
|
||||
CustomValidator SubscribeStreamValidator =
|
||||
CustomValidator CustomValidators::SubscribeStreamValidator =
|
||||
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
|
||||
if (!value.is_array())
|
||||
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotArray"}};
|
||||
@@ -197,7 +197,7 @@ CustomValidator SubscribeStreamValidator =
|
||||
return MaybeError{};
|
||||
}};
|
||||
|
||||
CustomValidator SubscribeAccountsValidator =
|
||||
CustomValidator CustomValidators::SubscribeAccountsValidator =
|
||||
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
|
||||
if (!value.is_array())
|
||||
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotArray"}};
|
||||
@@ -218,7 +218,7 @@ CustomValidator SubscribeAccountsValidator =
|
||||
return MaybeError{};
|
||||
}};
|
||||
|
||||
CustomValidator CurrencyIssueValidator =
|
||||
CustomValidator CustomValidators::CurrencyIssueValidator =
|
||||
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
|
||||
if (not value.is_object())
|
||||
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotObject"}};
|
||||
|
||||
@@ -427,27 +427,31 @@ public:
|
||||
[[nodiscard]] bool
|
||||
checkIsU32Numeric(std::string_view sv);
|
||||
|
||||
/**
|
||||
* @brief A group of custom validation functions
|
||||
*/
|
||||
struct CustomValidators final {
|
||||
/**
|
||||
* @brief Provides a commonly used validator for ledger index.
|
||||
*
|
||||
* LedgerIndex must be a string or an int. If the specified LedgerIndex is a string, its value must be either
|
||||
* "validated" or a valid integer value represented as a string.
|
||||
*/
|
||||
extern CustomValidator LedgerIndexValidator;
|
||||
static CustomValidator LedgerIndexValidator;
|
||||
|
||||
/**
|
||||
* @brief Provides a commonly used validator for accounts.
|
||||
*
|
||||
* Account must be a string and the converted public key is valid.
|
||||
*/
|
||||
extern CustomValidator AccountValidator;
|
||||
static CustomValidator AccountValidator;
|
||||
|
||||
/**
|
||||
* @brief Provides a commonly used validator for accounts.
|
||||
*
|
||||
* Account must be a string and can convert to base58.
|
||||
*/
|
||||
extern CustomValidator AccountBase58Validator;
|
||||
static CustomValidator AccountBase58Validator;
|
||||
|
||||
/**
|
||||
* @brief Provides a commonly used validator for markers.
|
||||
@@ -455,7 +459,7 @@ extern CustomValidator AccountBase58Validator;
|
||||
* A marker is composed of a comma-separated index and a start hint.
|
||||
* The former will be read as hex, and the latter can be cast to uint64.
|
||||
*/
|
||||
extern CustomValidator AccountMarkerValidator;
|
||||
static CustomValidator AccountMarkerValidator;
|
||||
|
||||
/**
|
||||
* @brief Provides a commonly used validator for uint256 hex string.
|
||||
@@ -463,35 +467,36 @@ extern CustomValidator AccountMarkerValidator;
|
||||
* It must be a string and also a decodable hex.
|
||||
* Transaction index, ledger hash all use this validator.
|
||||
*/
|
||||
extern CustomValidator Uint256HexStringValidator;
|
||||
static CustomValidator Uint256HexStringValidator;
|
||||
|
||||
/**
|
||||
* @brief Provides a commonly used validator for currency, including standard currency code and token code.
|
||||
*/
|
||||
extern CustomValidator CurrencyValidator;
|
||||
static CustomValidator CurrencyValidator;
|
||||
|
||||
/**
|
||||
* @brief Provides a commonly used validator for issuer type.
|
||||
*
|
||||
* It must be a hex string or base58 string.
|
||||
*/
|
||||
extern CustomValidator IssuerValidator;
|
||||
static CustomValidator IssuerValidator;
|
||||
|
||||
/**
|
||||
* @brief Provides a validator for validating streams used in subscribe/unsubscribe.
|
||||
*/
|
||||
extern CustomValidator SubscribeStreamValidator;
|
||||
static CustomValidator SubscribeStreamValidator;
|
||||
|
||||
/**
|
||||
* @brief Provides a validator for validating accounts used in subscribe/unsubscribe.
|
||||
*/
|
||||
extern CustomValidator SubscribeAccountsValidator;
|
||||
static CustomValidator SubscribeAccountsValidator;
|
||||
|
||||
/**
|
||||
* @brief Validates an asset (ripple::Issue).
|
||||
*
|
||||
* Used by amm_info.
|
||||
*/
|
||||
extern CustomValidator CurrencyIssueValidator;
|
||||
static CustomValidator CurrencyIssueValidator;
|
||||
};
|
||||
|
||||
} // namespace rpc::validation
|
||||
|
||||
@@ -231,15 +231,17 @@ AMMInfoHandler::spec([[maybe_unused]] uint32_t apiVersion)
|
||||
}};
|
||||
|
||||
static auto const rpcSpec = RpcSpec{
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
{JS(asset),
|
||||
meta::WithCustomError{
|
||||
validation::Type<std::string, boost::json::object>{}, Status(RippledError::rpcISSUE_MALFORMED)
|
||||
},
|
||||
meta::IfType<std::string>{stringIssueValidator},
|
||||
meta::IfType<boost::json::object>{
|
||||
meta::WithCustomError{validation::CurrencyIssueValidator, Status(RippledError::rpcISSUE_MALFORMED)},
|
||||
meta::WithCustomError{
|
||||
validation::CustomValidators::CurrencyIssueValidator, Status(RippledError::rpcISSUE_MALFORMED)
|
||||
},
|
||||
}},
|
||||
{JS(asset2),
|
||||
meta::WithCustomError{
|
||||
@@ -247,10 +249,14 @@ AMMInfoHandler::spec([[maybe_unused]] uint32_t apiVersion)
|
||||
},
|
||||
meta::IfType<std::string>{stringIssueValidator},
|
||||
meta::IfType<boost::json::object>{
|
||||
meta::WithCustomError{validation::CurrencyIssueValidator, Status(RippledError::rpcISSUE_MALFORMED)},
|
||||
meta::WithCustomError{
|
||||
validation::CustomValidators::CurrencyIssueValidator, Status(RippledError::rpcISSUE_MALFORMED)
|
||||
},
|
||||
}},
|
||||
{JS(amm_account), meta::WithCustomError{validation::AccountValidator, Status(RippledError::rpcACT_MALFORMED)}},
|
||||
{JS(account), meta::WithCustomError{validation::AccountValidator, Status(RippledError::rpcACT_MALFORMED)}},
|
||||
{JS(amm_account),
|
||||
meta::WithCustomError{validation::CustomValidators::AccountValidator, Status(RippledError::rpcACT_MALFORMED)}},
|
||||
{JS(account),
|
||||
meta::WithCustomError{validation::CustomValidators::AccountValidator, Status(RippledError::rpcACT_MALFORMED)}},
|
||||
};
|
||||
|
||||
return rpcSpec;
|
||||
|
||||
@@ -123,15 +123,15 @@ public:
|
||||
spec([[maybe_unused]] uint32_t apiVersion)
|
||||
{
|
||||
static auto const rpcSpec = RpcSpec{
|
||||
{JS(account), validation::Required{}, validation::AccountValidator},
|
||||
{JS(destination_account), validation::Type<std::string>{}, validation::AccountValidator},
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
|
||||
{JS(destination_account), validation::Type<std::string>{}, validation::CustomValidators::AccountValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(limit),
|
||||
validation::Type<uint32_t>{},
|
||||
validation::Min(1u),
|
||||
modifiers::Clamp<int32_t>{LIMIT_MIN, LIMIT_MAX}},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(marker), validation::AccountMarkerValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
{JS(marker), validation::CustomValidators::AccountMarkerValidator},
|
||||
};
|
||||
|
||||
return rpcSpec;
|
||||
|
||||
@@ -92,9 +92,9 @@ public:
|
||||
spec([[maybe_unused]] uint32_t apiVersion)
|
||||
{
|
||||
static auto const rpcSpec = RpcSpec{
|
||||
{JS(account), validation::Required{}, validation::AccountValidator},
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
{"account_index", check::Deprecated{}},
|
||||
{JS(strict), check::Deprecated{}}
|
||||
};
|
||||
|
||||
@@ -130,11 +130,11 @@ public:
|
||||
spec([[maybe_unused]] uint32_t apiVersion)
|
||||
{
|
||||
static auto const rpcSpecV1 = RpcSpec{
|
||||
{JS(account), validation::AccountValidator},
|
||||
{JS(ident), validation::AccountValidator},
|
||||
{JS(account), validation::CustomValidators::AccountValidator},
|
||||
{JS(ident), validation::CustomValidators::AccountValidator},
|
||||
{JS(ident), check::Deprecated{}},
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
{JS(ledger), check::Deprecated{}},
|
||||
{JS(strict), check::Deprecated{}}
|
||||
};
|
||||
|
||||
@@ -127,16 +127,21 @@ public:
|
||||
static auto const rpcSpec = RpcSpec{
|
||||
{JS(account),
|
||||
validation::Required{},
|
||||
meta::WithCustomError{validation::AccountValidator, Status(RippledError::rpcACT_MALFORMED)}},
|
||||
{JS(peer), meta::WithCustomError{validation::AccountValidator, Status(RippledError::rpcACT_MALFORMED)}},
|
||||
meta::WithCustomError{
|
||||
validation::CustomValidators::AccountValidator, Status(RippledError::rpcACT_MALFORMED)
|
||||
}},
|
||||
{JS(peer),
|
||||
meta::WithCustomError{
|
||||
validation::CustomValidators::AccountValidator, Status(RippledError::rpcACT_MALFORMED)
|
||||
}},
|
||||
{JS(ignore_default), validation::Type<bool>{}},
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(limit),
|
||||
validation::Type<uint32_t>{},
|
||||
validation::Min(1u),
|
||||
modifiers::Clamp<int32_t>{LIMIT_MIN, LIMIT_MAX}},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(marker), validation::AccountMarkerValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
{JS(marker), validation::CustomValidators::AccountMarkerValidator},
|
||||
{JS(ledger), check::Deprecated{}},
|
||||
{"peer_index", check::Deprecated{}},
|
||||
};
|
||||
|
||||
@@ -97,10 +97,10 @@ public:
|
||||
spec([[maybe_unused]] uint32_t apiVersion)
|
||||
{
|
||||
static auto const rpcSpec = RpcSpec{
|
||||
{JS(account), validation::Required{}, validation::AccountValidator},
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(marker), validation::Uint256HexStringValidator},
|
||||
{JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
{JS(marker), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(limit),
|
||||
validation::Type<uint32_t>{},
|
||||
validation::Min(1u),
|
||||
|
||||
@@ -113,9 +113,9 @@ public:
|
||||
{
|
||||
auto const& ledgerTypeStrs = util::getLedgerEntryTypeStrs();
|
||||
static auto const rpcSpec = RpcSpec{
|
||||
{JS(account), validation::Required{}, validation::AccountValidator},
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
{JS(limit),
|
||||
validation::Type<uint32_t>{},
|
||||
validation::Min(1u),
|
||||
@@ -123,7 +123,7 @@ public:
|
||||
{JS(type),
|
||||
validation::Type<std::string>{},
|
||||
validation::OneOf<std::string>(ledgerTypeStrs.cbegin(), ledgerTypeStrs.cend())},
|
||||
{JS(marker), validation::AccountMarkerValidator},
|
||||
{JS(marker), validation::CustomValidators::AccountMarkerValidator},
|
||||
{JS(deletion_blockers_only), validation::Type<bool>{}},
|
||||
};
|
||||
|
||||
|
||||
@@ -112,10 +112,10 @@ public:
|
||||
spec([[maybe_unused]] uint32_t apiVersion)
|
||||
{
|
||||
static auto const rpcSpec = RpcSpec{
|
||||
{JS(account), validation::Required{}, validation::AccountValidator},
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(marker), validation::AccountMarkerValidator},
|
||||
{JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
{JS(marker), validation::CustomValidators::AccountMarkerValidator},
|
||||
{JS(limit),
|
||||
validation::Type<uint32_t>{},
|
||||
validation::Min(1u),
|
||||
|
||||
@@ -125,9 +125,9 @@ public:
|
||||
{
|
||||
auto const& typesKeysInLowercase = util::getTxTypesInLowercase();
|
||||
static auto const rpcSpecForV1 = RpcSpec{
|
||||
{JS(account), validation::Required{}, validation::AccountValidator},
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
{JS(ledger_index_min), validation::Type<int32_t>{}},
|
||||
{JS(ledger_index_max), validation::Type<int32_t>{}},
|
||||
{JS(limit),
|
||||
|
||||
@@ -89,8 +89,8 @@ public:
|
||||
spec([[maybe_unused]] uint32_t apiVersion)
|
||||
{
|
||||
static auto const rpcSpec = RpcSpec{
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
};
|
||||
|
||||
return rpcSpec;
|
||||
|
||||
@@ -112,9 +112,13 @@ public:
|
||||
meta::Section{
|
||||
{JS(currency),
|
||||
validation::Required{},
|
||||
meta::WithCustomError{validation::CurrencyValidator, Status(RippledError::rpcDST_AMT_MALFORMED)}},
|
||||
meta::WithCustomError{
|
||||
validation::CustomValidators::CurrencyValidator, Status(RippledError::rpcDST_AMT_MALFORMED)
|
||||
}},
|
||||
{JS(issuer),
|
||||
meta::WithCustomError{validation::IssuerValidator, Status(RippledError::rpcDST_ISR_MALFORMED)}}
|
||||
meta::WithCustomError{
|
||||
validation::CustomValidators::IssuerValidator, Status(RippledError::rpcDST_ISR_MALFORMED)
|
||||
}}
|
||||
}},
|
||||
{JS(taker_pays),
|
||||
validation::Required{},
|
||||
@@ -122,21 +126,26 @@ public:
|
||||
meta::Section{
|
||||
{JS(currency),
|
||||
validation::Required{},
|
||||
meta::WithCustomError{validation::CurrencyValidator, Status(RippledError::rpcSRC_CUR_MALFORMED)}},
|
||||
meta::WithCustomError{
|
||||
validation::CustomValidators::CurrencyValidator, Status(RippledError::rpcSRC_CUR_MALFORMED)
|
||||
}},
|
||||
{JS(issuer),
|
||||
meta::WithCustomError{validation::IssuerValidator, Status(RippledError::rpcSRC_ISR_MALFORMED)}}
|
||||
meta::WithCustomError{
|
||||
validation::CustomValidators::IssuerValidator, Status(RippledError::rpcSRC_ISR_MALFORMED)
|
||||
}}
|
||||
}},
|
||||
// return INVALID_PARAMS if account format is wrong for "taker"
|
||||
{JS(taker),
|
||||
meta::WithCustomError{
|
||||
validation::AccountValidator, Status(RippledError::rpcINVALID_PARAMS, "Invalid field 'taker'.")
|
||||
validation::CustomValidators::AccountValidator,
|
||||
Status(RippledError::rpcINVALID_PARAMS, "Invalid field 'taker'.")
|
||||
}},
|
||||
{JS(limit),
|
||||
validation::Type<uint32_t>{},
|
||||
validation::Min(1u),
|
||||
modifiers::Clamp<int32_t>{LIMIT_MIN, LIMIT_MAX}},
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
};
|
||||
|
||||
return rpcSpec;
|
||||
|
||||
@@ -95,10 +95,10 @@ public:
|
||||
spec([[maybe_unused]] uint32_t apiVersion)
|
||||
{
|
||||
static auto const rpcSpec = RpcSpec{
|
||||
{JS(source_account), validation::Required{}, validation::AccountValidator},
|
||||
{JS(destination_account), validation::Required{}, validation::AccountValidator},
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(source_account), validation::Required{}, validation::CustomValidators::AccountValidator},
|
||||
{JS(destination_account), validation::Required{}, validation::CustomValidators::AccountValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
};
|
||||
|
||||
return rpcSpec;
|
||||
|
||||
@@ -138,9 +138,9 @@ public:
|
||||
}};
|
||||
|
||||
static auto const rpcSpec = RpcSpec{
|
||||
{JS(account), validation::Required{}, validation::AccountValidator},
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
{JS(hotwallet), hotWalletValidator}
|
||||
};
|
||||
|
||||
|
||||
@@ -152,7 +152,8 @@ public:
|
||||
if (!maybeError)
|
||||
return maybeError;
|
||||
|
||||
maybeError = validation::AccountBase58Validator.verify(oracle.as_object(), JS(account));
|
||||
maybeError =
|
||||
validation::CustomValidators::AccountBase58Validator.verify(oracle.as_object(), JS(account));
|
||||
if (!maybeError)
|
||||
return Error{Status{RippledError::rpcINVALID_PARAMS}};
|
||||
};
|
||||
@@ -161,17 +162,21 @@ public:
|
||||
}};
|
||||
|
||||
static auto const rpcSpec = RpcSpec{
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
// validate quoteAsset and base_asset in accordance to the currency code found in XRPL doc:
|
||||
// https://xrpl.org/docs/references/protocol/data-types/currency-formats#currency-codes
|
||||
// usually Clio returns rpcMALFORMED_CURRENCY , return InvalidParam here just to mimic rippled
|
||||
{JS(base_asset),
|
||||
validation::Required{},
|
||||
meta::WithCustomError{validation::CurrencyValidator, Status(RippledError::rpcINVALID_PARAMS)}},
|
||||
meta::WithCustomError{
|
||||
validation::CustomValidators::CurrencyValidator, Status(RippledError::rpcINVALID_PARAMS)
|
||||
}},
|
||||
{JS(quote_asset),
|
||||
validation::Required{},
|
||||
meta::WithCustomError{validation::CurrencyValidator, Status(RippledError::rpcINVALID_PARAMS)}},
|
||||
meta::WithCustomError{
|
||||
validation::CustomValidators::CurrencyValidator, Status(RippledError::rpcINVALID_PARAMS)
|
||||
}},
|
||||
{JS(oracles), validation::Required{}, oraclesValidator},
|
||||
// note: Unlike `rippled`, Clio only supports UInt as input, no string, no `null`, etc.
|
||||
{JS(time_threshold), validation::Type<std::uint32_t>{}},
|
||||
|
||||
@@ -111,8 +111,8 @@ public:
|
||||
{JS(accounts), check::Deprecated{}},
|
||||
{JS(owner_funds), validation::Type<bool>{}},
|
||||
{JS(queue), validation::Type<bool>{}, validation::NotSupported{true}},
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
{JS(transactions), validation::Type<bool>{}},
|
||||
{JS(expand), validation::Type<bool>{}},
|
||||
{JS(binary), validation::Type<bool>{}},
|
||||
|
||||
@@ -118,12 +118,12 @@ public:
|
||||
static auto const rpcSpec = RpcSpec{
|
||||
{JS(binary), validation::Type<bool>{}},
|
||||
{"out_of_order", validation::Type<bool>{}},
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
{JS(limit), validation::Type<uint32_t>{}, validation::Min(1u)},
|
||||
{JS(marker),
|
||||
validation::Type<uint32_t, std::string>{},
|
||||
meta::IfType<std::string>{validation::Uint256HexStringValidator}},
|
||||
meta::IfType<std::string>{validation::CustomValidators::Uint256HexStringValidator}},
|
||||
{JS(type),
|
||||
meta::WithCustomError{
|
||||
validation::Type<std::string>{}, Status{ripple::rpcINVALID_PARAMS, "Invalid field 'type', not string."}
|
||||
|
||||
@@ -146,8 +146,9 @@ public:
|
||||
return MaybeError{};
|
||||
}};
|
||||
|
||||
static auto const malformedRequestHexStringValidator =
|
||||
meta::WithCustomError{validation::Uint256HexStringValidator, Status(ClioError::rpcMALFORMED_REQUEST)};
|
||||
static auto const malformedRequestHexStringValidator = meta::WithCustomError{
|
||||
validation::CustomValidators::Uint256HexStringValidator, Status(ClioError::rpcMALFORMED_REQUEST)
|
||||
};
|
||||
|
||||
static auto const malformedRequestIntValidator =
|
||||
meta::WithCustomError{validation::Type<uint32_t>{}, Status(ClioError::rpcMALFORMED_REQUEST)};
|
||||
@@ -156,27 +157,27 @@ public:
|
||||
meta::IfType<boost::json::object>{meta::Section{
|
||||
{ripple::sfLockingChainDoor.getJsonName().c_str(),
|
||||
validation::Required{},
|
||||
validation::AccountBase58Validator},
|
||||
validation::CustomValidators::AccountBase58Validator},
|
||||
{ripple::sfIssuingChainDoor.getJsonName().c_str(),
|
||||
validation::Required{},
|
||||
validation::AccountBase58Validator},
|
||||
validation::CustomValidators::AccountBase58Validator},
|
||||
{ripple::sfLockingChainIssue.getJsonName().c_str(),
|
||||
validation::Required{},
|
||||
validation::CurrencyIssueValidator},
|
||||
validation::CustomValidators::CurrencyIssueValidator},
|
||||
{ripple::sfIssuingChainIssue.getJsonName().c_str(),
|
||||
validation::Required{},
|
||||
validation::CurrencyIssueValidator},
|
||||
validation::CustomValidators::CurrencyIssueValidator},
|
||||
}},
|
||||
Status(ClioError::rpcMALFORMED_REQUEST)
|
||||
};
|
||||
|
||||
static auto const rpcSpec = RpcSpec{
|
||||
{JS(binary), validation::Type<bool>{}},
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
{JS(index), malformedRequestHexStringValidator},
|
||||
{JS(account_root), validation::AccountBase58Validator},
|
||||
{JS(did), validation::AccountBase58Validator},
|
||||
{JS(account_root), validation::CustomValidators::AccountBase58Validator},
|
||||
{JS(did), validation::CustomValidators::AccountBase58Validator},
|
||||
{JS(check), malformedRequestHexStringValidator},
|
||||
{JS(deposit_preauth),
|
||||
validation::Type<std::string, boost::json::object>{},
|
||||
@@ -185,16 +186,18 @@ public:
|
||||
meta::Section{
|
||||
{JS(owner),
|
||||
validation::Required{},
|
||||
meta::WithCustomError{validation::AccountBase58Validator, Status(ClioError::rpcMALFORMED_OWNER)}},
|
||||
{JS(authorized), validation::Required{}, validation::AccountBase58Validator},
|
||||
meta::WithCustomError{
|
||||
validation::CustomValidators::AccountBase58Validator, Status(ClioError::rpcMALFORMED_OWNER)
|
||||
}},
|
||||
{JS(authorized), validation::Required{}, validation::CustomValidators::AccountBase58Validator},
|
||||
},
|
||||
}},
|
||||
{JS(directory),
|
||||
validation::Type<std::string, boost::json::object>{},
|
||||
meta::IfType<std::string>{malformedRequestHexStringValidator},
|
||||
meta::IfType<boost::json::object>{meta::Section{
|
||||
{JS(owner), validation::AccountBase58Validator},
|
||||
{JS(dir_root), validation::Uint256HexStringValidator},
|
||||
{JS(owner), validation::CustomValidators::AccountBase58Validator},
|
||||
{JS(dir_root), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(sub_index), malformedRequestIntValidator}
|
||||
}}},
|
||||
{JS(escrow),
|
||||
@@ -204,7 +207,9 @@ public:
|
||||
meta::Section{
|
||||
{JS(owner),
|
||||
validation::Required{},
|
||||
meta::WithCustomError{validation::AccountBase58Validator, Status(ClioError::rpcMALFORMED_OWNER)}},
|
||||
meta::WithCustomError{
|
||||
validation::CustomValidators::AccountBase58Validator, Status(ClioError::rpcMALFORMED_OWNER)
|
||||
}},
|
||||
{JS(seq), validation::Required{}, malformedRequestIntValidator},
|
||||
},
|
||||
}},
|
||||
@@ -213,7 +218,7 @@ public:
|
||||
meta::IfType<std::string>{malformedRequestHexStringValidator},
|
||||
meta::IfType<boost::json::object>{
|
||||
meta::Section{
|
||||
{JS(account), validation::Required{}, validation::AccountBase58Validator},
|
||||
{JS(account), validation::Required{}, validation::CustomValidators::AccountBase58Validator},
|
||||
{JS(seq), validation::Required{}, malformedRequestIntValidator},
|
||||
},
|
||||
}},
|
||||
@@ -222,14 +227,14 @@ public:
|
||||
validation::Type<boost::json::object>{},
|
||||
meta::Section{
|
||||
{JS(accounts), validation::Required{}, rippleStateAccountsCheck},
|
||||
{JS(currency), validation::Required{}, validation::CurrencyValidator},
|
||||
{JS(currency), validation::Required{}, validation::CustomValidators::CurrencyValidator},
|
||||
}},
|
||||
{JS(ticket),
|
||||
validation::Type<std::string, boost::json::object>{},
|
||||
meta::IfType<std::string>{malformedRequestHexStringValidator},
|
||||
meta::IfType<boost::json::object>{
|
||||
meta::Section{
|
||||
{JS(account), validation::Required{}, validation::AccountBase58Validator},
|
||||
{JS(account), validation::Required{}, validation::CustomValidators::AccountBase58Validator},
|
||||
{JS(ticket_seq), validation::Required{}, malformedRequestIntValidator},
|
||||
},
|
||||
}},
|
||||
@@ -244,20 +249,22 @@ public:
|
||||
meta::WithCustomError{
|
||||
validation::Type<boost::json::object>{}, Status(ClioError::rpcMALFORMED_REQUEST)
|
||||
},
|
||||
validation::CurrencyIssueValidator},
|
||||
validation::CustomValidators::CurrencyIssueValidator},
|
||||
{JS(asset2),
|
||||
meta::WithCustomError{validation::Required{}, Status(ClioError::rpcMALFORMED_REQUEST)},
|
||||
meta::WithCustomError{
|
||||
validation::Type<boost::json::object>{}, Status(ClioError::rpcMALFORMED_REQUEST)
|
||||
},
|
||||
validation::CurrencyIssueValidator},
|
||||
validation::CustomValidators::CurrencyIssueValidator},
|
||||
},
|
||||
}},
|
||||
{JS(bridge),
|
||||
meta::WithCustomError{validation::Type<boost::json::object>{}, Status(ClioError::rpcMALFORMED_REQUEST)},
|
||||
bridgeJsonValidator},
|
||||
{JS(bridge_account),
|
||||
meta::WithCustomError{validation::AccountBase58Validator, Status(ClioError::rpcMALFORMED_REQUEST)}},
|
||||
meta::WithCustomError{
|
||||
validation::CustomValidators::AccountBase58Validator, Status(ClioError::rpcMALFORMED_REQUEST)
|
||||
}},
|
||||
{JS(xchain_owned_claim_id),
|
||||
meta::WithCustomError{
|
||||
validation::Type<std::string, boost::json::object>{}, Status(ClioError::rpcMALFORMED_REQUEST)
|
||||
@@ -292,7 +299,9 @@ public:
|
||||
meta::IfType<boost::json::object>{meta::Section{
|
||||
{JS(account),
|
||||
meta::WithCustomError{validation::Required{}, Status(ClioError::rpcMALFORMED_REQUEST)},
|
||||
meta::WithCustomError{validation::AccountBase58Validator, Status(ClioError::rpcMALFORMED_ADDRESS)}},
|
||||
meta::WithCustomError{
|
||||
validation::CustomValidators::AccountBase58Validator, Status(ClioError::rpcMALFORMED_ADDRESS)
|
||||
}},
|
||||
// note: Unlike `rippled`, Clio only supports UInt as input, no string, no `null`, etc.:
|
||||
{JS(oracle_document_id),
|
||||
meta::WithCustomError{validation::Required{}, Status(ClioError::rpcMALFORMED_REQUEST)},
|
||||
|
||||
@@ -119,9 +119,9 @@ public:
|
||||
spec([[maybe_unused]] uint32_t apiVersion)
|
||||
{
|
||||
static auto const rpcSpec = RpcSpec{
|
||||
{JS(nft_id), validation::Required{}, validation::Uint256HexStringValidator},
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(nft_id), validation::Required{}, validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
{JS(ledger_index_min), validation::Type<int32_t>{}},
|
||||
{JS(ledger_index_max), validation::Type<int32_t>{}},
|
||||
{JS(binary), validation::Type<bool>{}},
|
||||
|
||||
@@ -95,9 +95,9 @@ public:
|
||||
spec([[maybe_unused]] uint32_t apiVersion)
|
||||
{
|
||||
static auto const rpcSpec = RpcSpec{
|
||||
{JS(nft_id), validation::Required{}, validation::Uint256HexStringValidator},
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(nft_id), validation::Required{}, validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
};
|
||||
|
||||
return rpcSpec;
|
||||
|
||||
@@ -99,14 +99,14 @@ public:
|
||||
spec([[maybe_unused]] uint32_t apiVersion)
|
||||
{
|
||||
static auto const rpcSpec = RpcSpec{
|
||||
{JS(nft_id), validation::Required{}, validation::Uint256HexStringValidator},
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(nft_id), validation::Required{}, validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
{JS(limit),
|
||||
validation::Type<uint32_t>{},
|
||||
validation::Min(1u),
|
||||
modifiers::Clamp<int32_t>{LIMIT_MIN, LIMIT_MAX}},
|
||||
{JS(marker), validation::Uint256HexStringValidator},
|
||||
{JS(marker), validation::CustomValidators::Uint256HexStringValidator},
|
||||
};
|
||||
|
||||
return rpcSpec;
|
||||
|
||||
@@ -95,15 +95,15 @@ public:
|
||||
spec([[maybe_unused]] uint32_t apiVersion)
|
||||
{
|
||||
static auto const rpcSpec = RpcSpec{
|
||||
{JS(issuer), validation::Required{}, validation::AccountValidator},
|
||||
{JS(issuer), validation::Required{}, validation::CustomValidators::AccountValidator},
|
||||
{"nft_taxon", validation::Type<uint32_t>{}},
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
{JS(limit),
|
||||
validation::Type<uint32_t>{},
|
||||
validation::Min(1u),
|
||||
modifiers::Clamp<int32_t>{LIMIT_MIN, LIMIT_MAX}},
|
||||
{JS(marker), validation::Uint256HexStringValidator},
|
||||
{JS(marker), validation::CustomValidators::Uint256HexStringValidator},
|
||||
};
|
||||
|
||||
return rpcSpec;
|
||||
|
||||
@@ -105,14 +105,14 @@ public:
|
||||
spec([[maybe_unused]] uint32_t apiVersion)
|
||||
{
|
||||
static auto const rpcSpecV1 = RpcSpec{
|
||||
{JS(account), validation::Required{}, validation::AccountValidator},
|
||||
{JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
|
||||
{JS(role),
|
||||
validation::Required{},
|
||||
meta::WithCustomError{
|
||||
validation::OneOf{"gateway", "user"}, Status{RippledError::rpcINVALID_PARAMS, "role field is invalid"}
|
||||
}},
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
{JS(limit),
|
||||
validation::Type<uint32_t>(),
|
||||
validation::Min(1u),
|
||||
|
||||
@@ -79,7 +79,7 @@ SubscribeHandler::spec([[maybe_unused]] uint32_t apiVersion)
|
||||
|
||||
if (book.as_object().contains("taker")) {
|
||||
if (auto err = meta::WithCustomError(
|
||||
validation::AccountValidator,
|
||||
validation::CustomValidators::AccountValidator,
|
||||
Status{RippledError::rpcBAD_ISSUER, "Issuer account malformed."}
|
||||
)
|
||||
.verify(book.as_object(), "taker");
|
||||
@@ -96,9 +96,9 @@ SubscribeHandler::spec([[maybe_unused]] uint32_t apiVersion)
|
||||
}};
|
||||
|
||||
static auto const rpcSpec = RpcSpec{
|
||||
{JS(streams), validation::SubscribeStreamValidator},
|
||||
{JS(accounts), validation::SubscribeAccountsValidator},
|
||||
{JS(accounts_proposed), validation::SubscribeAccountsValidator},
|
||||
{JS(streams), validation::CustomValidators::SubscribeStreamValidator},
|
||||
{JS(accounts), validation::CustomValidators::SubscribeAccountsValidator},
|
||||
{JS(accounts_proposed), validation::CustomValidators::SubscribeAccountsValidator},
|
||||
{JS(books), booksValidator},
|
||||
{"user", check::Deprecated{}},
|
||||
{JS(password), check::Deprecated{}},
|
||||
|
||||
@@ -95,9 +95,9 @@ public:
|
||||
static auto const rpcSpec = RpcSpec{
|
||||
{JS(tx_hash),
|
||||
meta::WithCustomError{validation::Required{}, Status(ClioError::rpcFIELD_NOT_FOUND_TRANSACTION)},
|
||||
validation::Uint256HexStringValidator},
|
||||
{JS(ledger_hash), validation::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::LedgerIndexValidator},
|
||||
validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
|
||||
};
|
||||
|
||||
return rpcSpec;
|
||||
|
||||
@@ -117,7 +117,7 @@ public:
|
||||
spec(uint32_t apiVersion)
|
||||
{
|
||||
static RpcSpec const rpcSpecForV1 = {
|
||||
{JS(transaction), validation::Uint256HexStringValidator},
|
||||
{JS(transaction), validation::CustomValidators::Uint256HexStringValidator},
|
||||
{JS(min_ledger), validation::Type<uint32_t>{}},
|
||||
{JS(max_ledger), validation::Type<uint32_t>{}},
|
||||
{JS(ctid), validation::Type<std::string>{}},
|
||||
|
||||
@@ -77,9 +77,9 @@ UnsubscribeHandler::spec([[maybe_unused]] uint32_t apiVersion)
|
||||
}};
|
||||
|
||||
static auto const rpcSpec = RpcSpec{
|
||||
{JS(streams), validation::SubscribeStreamValidator},
|
||||
{JS(accounts), validation::SubscribeAccountsValidator},
|
||||
{JS(accounts_proposed), validation::SubscribeAccountsValidator},
|
||||
{JS(streams), validation::CustomValidators::SubscribeStreamValidator},
|
||||
{JS(accounts), validation::CustomValidators::SubscribeAccountsValidator},
|
||||
{JS(accounts_proposed), validation::CustomValidators::SubscribeAccountsValidator},
|
||||
{JS(books), booksValidator},
|
||||
{JS(url), check::Deprecated{}},
|
||||
{JS(rt_accounts), check::Deprecated{}},
|
||||
|
||||
@@ -294,7 +294,7 @@ TEST_F(RPCBaseTest, IfTypeValidator)
|
||||
Section{{"limit", Required{}, Type<uint32_t>{}, Between<uint32_t>{0, 100}}},
|
||||
Section{{"limit2", Required{}, Type<uint32_t>{}, Between<uint32_t>{0, 100}}}
|
||||
},
|
||||
IfType<std::string>{Uint256HexStringValidator}},
|
||||
IfType<std::string>{CustomValidators::Uint256HexStringValidator}},
|
||||
{"mix2",
|
||||
Section{{"limit", Required{}, Type<uint32_t>{}, Between<uint32_t>{0, 100}}},
|
||||
Type<std::string, json::object>{}},
|
||||
@@ -329,8 +329,10 @@ TEST_F(RPCBaseTest, IfTypeValidator)
|
||||
TEST_F(RPCBaseTest, WithCustomError)
|
||||
{
|
||||
auto const spec = RpcSpec{
|
||||
{"transaction", WithCustomError{Uint256HexStringValidator, rpc::Status{ripple::rpcBAD_FEATURE, "MyCustomError"}}
|
||||
},
|
||||
{"transaction",
|
||||
WithCustomError{
|
||||
CustomValidators::Uint256HexStringValidator, rpc::Status{ripple::rpcBAD_FEATURE, "MyCustomError"}
|
||||
}},
|
||||
{"other", WithCustomError{Type<std::string>{}, rpc::Status{ripple::rpcALREADY_MULTISIG, "MyCustomError2"}}}
|
||||
};
|
||||
|
||||
@@ -390,7 +392,7 @@ TEST_F(RPCBaseTest, NotSupported)
|
||||
TEST_F(RPCBaseTest, LedgerIndexValidator)
|
||||
{
|
||||
auto spec = RpcSpec{
|
||||
{"ledgerIndex", LedgerIndexValidator},
|
||||
{"ledgerIndex", CustomValidators::LedgerIndexValidator},
|
||||
};
|
||||
auto passingInput = json::parse(R"({ "ledgerIndex": "validated" })");
|
||||
ASSERT_TRUE(spec.process(passingInput));
|
||||
@@ -415,7 +417,7 @@ TEST_F(RPCBaseTest, LedgerIndexValidator)
|
||||
TEST_F(RPCBaseTest, AccountValidator)
|
||||
{
|
||||
auto spec = RpcSpec{
|
||||
{"account", AccountValidator},
|
||||
{"account", CustomValidators::AccountValidator},
|
||||
};
|
||||
auto failingInput = json::parse(R"({ "account": 256 })");
|
||||
ASSERT_FALSE(spec.process(failingInput));
|
||||
@@ -437,7 +439,7 @@ TEST_F(RPCBaseTest, AccountValidator)
|
||||
TEST_F(RPCBaseTest, AccountMarkerValidator)
|
||||
{
|
||||
auto spec = RpcSpec{
|
||||
{"marker", AccountMarkerValidator},
|
||||
{"marker", CustomValidators::AccountMarkerValidator},
|
||||
};
|
||||
auto failingInput = json::parse(R"({ "marker": 256 })");
|
||||
ASSERT_FALSE(spec.process(failingInput));
|
||||
@@ -454,7 +456,7 @@ TEST_F(RPCBaseTest, AccountMarkerValidator)
|
||||
|
||||
TEST_F(RPCBaseTest, Uint256HexStringValidator)
|
||||
{
|
||||
auto const spec = RpcSpec{{"transaction", Uint256HexStringValidator}};
|
||||
auto const spec = RpcSpec{{"transaction", CustomValidators::Uint256HexStringValidator}};
|
||||
auto passingInput =
|
||||
json::parse(R"({ "transaction": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC"})");
|
||||
ASSERT_TRUE(spec.process(passingInput));
|
||||
@@ -472,7 +474,7 @@ TEST_F(RPCBaseTest, Uint256HexStringValidator)
|
||||
|
||||
TEST_F(RPCBaseTest, CurrencyValidator)
|
||||
{
|
||||
auto const spec = RpcSpec{{"currency", CurrencyValidator}};
|
||||
auto const spec = RpcSpec{{"currency", CustomValidators::CurrencyValidator}};
|
||||
auto passingInput = json::parse(R"({ "currency": "GBP"})");
|
||||
ASSERT_TRUE(spec.process(passingInput));
|
||||
|
||||
@@ -500,7 +502,7 @@ TEST_F(RPCBaseTest, CurrencyValidator)
|
||||
|
||||
TEST_F(RPCBaseTest, IssuerValidator)
|
||||
{
|
||||
auto const spec = RpcSpec{{"issuer", IssuerValidator}};
|
||||
auto const spec = RpcSpec{{"issuer", CustomValidators::IssuerValidator}};
|
||||
auto passingInput = json::parse(R"({ "issuer": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn"})");
|
||||
ASSERT_TRUE(spec.process(passingInput));
|
||||
|
||||
@@ -516,7 +518,7 @@ TEST_F(RPCBaseTest, IssuerValidator)
|
||||
|
||||
TEST_F(RPCBaseTest, SubscribeStreamValidator)
|
||||
{
|
||||
auto const spec = RpcSpec{{"streams", SubscribeStreamValidator}};
|
||||
auto const spec = RpcSpec{{"streams", CustomValidators::SubscribeStreamValidator}};
|
||||
auto passingInput = json::parse(
|
||||
R"({
|
||||
"streams":
|
||||
@@ -548,7 +550,7 @@ TEST_F(RPCBaseTest, SubscribeStreamValidator)
|
||||
|
||||
TEST_F(RPCBaseTest, SubscribeAccountsValidator)
|
||||
{
|
||||
auto const spec = RpcSpec{{"accounts", SubscribeAccountsValidator}};
|
||||
auto const spec = RpcSpec{{"accounts", CustomValidators::SubscribeAccountsValidator}};
|
||||
auto passingInput =
|
||||
json::parse(R"({ "accounts": ["rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn","rLEsXccBGNR3UPuPu2hUXPjziKC3qKSBun"]})");
|
||||
ASSERT_TRUE(spec.process(passingInput));
|
||||
|
||||
Reference in New Issue
Block a user