refactor: Structure global validators better (#1484)

refactor: #1170 Structure global validators better
This commit is contained in:
yinyiqian1
2024-06-27 09:55:17 -04:00
committed by GitHub
parent 72f9a8fe78
commit 2ff51ff416
29 changed files with 231 additions and 190 deletions

View File

@@ -69,7 +69,7 @@ checkIsU32Numeric(std::string_view sv)
return ec == std::errc(); return ec == std::errc();
} }
CustomValidator Uint256HexStringValidator = CustomValidator CustomValidators::Uint256HexStringValidator =
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError { CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
if (!value.is_string()) if (!value.is_string())
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}}; return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}};
@@ -81,7 +81,7 @@ CustomValidator Uint256HexStringValidator =
return MaybeError{}; return MaybeError{};
}}; }};
CustomValidator LedgerIndexValidator = CustomValidator CustomValidators::LedgerIndexValidator =
CustomValidator{[](boost::json::value const& value, std::string_view /* key */) -> MaybeError { CustomValidator{[](boost::json::value const& value, std::string_view /* key */) -> MaybeError {
auto err = Error{Status{RippledError::rpcINVALID_PARAMS, "ledgerIndexMalformed"}}; auto err = Error{Status{RippledError::rpcINVALID_PARAMS, "ledgerIndexMalformed"}};
@@ -95,7 +95,7 @@ CustomValidator LedgerIndexValidator =
return MaybeError{}; return MaybeError{};
}}; }};
CustomValidator AccountValidator = CustomValidator CustomValidators::AccountValidator =
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError { CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
if (!value.is_string()) if (!value.is_string())
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}}; return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}};
@@ -108,7 +108,7 @@ CustomValidator AccountValidator =
return MaybeError{}; return MaybeError{};
}}; }};
CustomValidator AccountBase58Validator = CustomValidator CustomValidators::AccountBase58Validator =
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError { CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
if (!value.is_string()) if (!value.is_string())
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}}; return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}};
@@ -120,7 +120,7 @@ CustomValidator AccountBase58Validator =
return MaybeError{}; return MaybeError{};
}}; }};
CustomValidator AccountMarkerValidator = CustomValidator CustomValidators::AccountMarkerValidator =
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError { CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
if (!value.is_string()) if (!value.is_string())
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}}; return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}};
@@ -135,7 +135,7 @@ CustomValidator AccountMarkerValidator =
return MaybeError{}; return MaybeError{};
}}; }};
CustomValidator CurrencyValidator = CustomValidator CustomValidators::CurrencyValidator =
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError { CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
if (!value.is_string()) if (!value.is_string())
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}}; return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}};
@@ -151,7 +151,7 @@ CustomValidator CurrencyValidator =
return MaybeError{}; return MaybeError{};
}}; }};
CustomValidator IssuerValidator = CustomValidator CustomValidators::IssuerValidator =
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError { CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
if (!value.is_string()) if (!value.is_string())
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}}; return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotString"}};
@@ -171,7 +171,7 @@ CustomValidator IssuerValidator =
return MaybeError{}; return MaybeError{};
}}; }};
CustomValidator SubscribeStreamValidator = CustomValidator CustomValidators::SubscribeStreamValidator =
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError { CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
if (!value.is_array()) if (!value.is_array())
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotArray"}}; return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotArray"}};
@@ -197,7 +197,7 @@ CustomValidator SubscribeStreamValidator =
return MaybeError{}; return MaybeError{};
}}; }};
CustomValidator SubscribeAccountsValidator = CustomValidator CustomValidators::SubscribeAccountsValidator =
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError { CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
if (!value.is_array()) if (!value.is_array())
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotArray"}}; return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotArray"}};
@@ -218,7 +218,7 @@ CustomValidator SubscribeAccountsValidator =
return MaybeError{}; return MaybeError{};
}}; }};
CustomValidator CurrencyIssueValidator = CustomValidator CustomValidators::CurrencyIssueValidator =
CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError { CustomValidator{[](boost::json::value const& value, std::string_view key) -> MaybeError {
if (not value.is_object()) if (not value.is_object())
return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotObject"}}; return Error{Status{RippledError::rpcINVALID_PARAMS, std::string(key) + "NotObject"}};

View File

@@ -428,70 +428,75 @@ public:
checkIsU32Numeric(std::string_view sv); checkIsU32Numeric(std::string_view sv);
/** /**
* @brief Provides a commonly used validator for ledger index. * @brief A group of custom validation functions
*
* 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; 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.
*/
static CustomValidator LedgerIndexValidator;
/** /**
* @brief Provides a commonly used validator for accounts. * @brief Provides a commonly used validator for accounts.
* *
* Account must be a string and the converted public key is valid. * 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. * @brief Provides a commonly used validator for accounts.
* *
* Account must be a string and can convert to base58. * Account must be a string and can convert to base58.
*/ */
extern CustomValidator AccountBase58Validator; static CustomValidator AccountBase58Validator;
/** /**
* @brief Provides a commonly used validator for markers. * @brief Provides a commonly used validator for markers.
* *
* A marker is composed of a comma-separated index and a start hint. * 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. * 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. * @brief Provides a commonly used validator for uint256 hex string.
* *
* It must be a string and also a decodable hex. * It must be a string and also a decodable hex.
* Transaction index, ledger hash all use this validator. * 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. * @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. * @brief Provides a commonly used validator for issuer type.
* *
* It must be a hex string or base58 string. * 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. * @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. * @brief Provides a validator for validating accounts used in subscribe/unsubscribe.
*/ */
extern CustomValidator SubscribeAccountsValidator; static CustomValidator SubscribeAccountsValidator;
/** /**
* @brief Validates an asset (ripple::Issue). * @brief Validates an asset (ripple::Issue).
* *
* Used by amm_info. * Used by amm_info.
*/ */
extern CustomValidator CurrencyIssueValidator; static CustomValidator CurrencyIssueValidator;
};
} // namespace rpc::validation } // namespace rpc::validation

View File

@@ -231,15 +231,17 @@ AMMInfoHandler::spec([[maybe_unused]] uint32_t apiVersion)
}}; }};
static auto const rpcSpec = RpcSpec{ static auto const rpcSpec = RpcSpec{
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(asset), {JS(asset),
meta::WithCustomError{ meta::WithCustomError{
validation::Type<std::string, boost::json::object>{}, Status(RippledError::rpcISSUE_MALFORMED) validation::Type<std::string, boost::json::object>{}, Status(RippledError::rpcISSUE_MALFORMED)
}, },
meta::IfType<std::string>{stringIssueValidator}, meta::IfType<std::string>{stringIssueValidator},
meta::IfType<boost::json::object>{ meta::IfType<boost::json::object>{
meta::WithCustomError{validation::CurrencyIssueValidator, Status(RippledError::rpcISSUE_MALFORMED)}, meta::WithCustomError{
validation::CustomValidators::CurrencyIssueValidator, Status(RippledError::rpcISSUE_MALFORMED)
},
}}, }},
{JS(asset2), {JS(asset2),
meta::WithCustomError{ meta::WithCustomError{
@@ -247,10 +249,14 @@ AMMInfoHandler::spec([[maybe_unused]] uint32_t apiVersion)
}, },
meta::IfType<std::string>{stringIssueValidator}, meta::IfType<std::string>{stringIssueValidator},
meta::IfType<boost::json::object>{ 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(amm_account),
{JS(account), meta::WithCustomError{validation::AccountValidator, Status(RippledError::rpcACT_MALFORMED)}}, meta::WithCustomError{validation::CustomValidators::AccountValidator, Status(RippledError::rpcACT_MALFORMED)}},
{JS(account),
meta::WithCustomError{validation::CustomValidators::AccountValidator, Status(RippledError::rpcACT_MALFORMED)}},
}; };
return rpcSpec; return rpcSpec;

View File

@@ -123,15 +123,15 @@ public:
spec([[maybe_unused]] uint32_t apiVersion) spec([[maybe_unused]] uint32_t apiVersion)
{ {
static auto const rpcSpec = RpcSpec{ static auto const rpcSpec = RpcSpec{
{JS(account), validation::Required{}, validation::AccountValidator}, {JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
{JS(destination_account), validation::Type<std::string>{}, validation::AccountValidator}, {JS(destination_account), validation::Type<std::string>{}, validation::CustomValidators::AccountValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(limit), {JS(limit),
validation::Type<uint32_t>{}, validation::Type<uint32_t>{},
validation::Min(1u), validation::Min(1u),
modifiers::Clamp<int32_t>{LIMIT_MIN, LIMIT_MAX}}, modifiers::Clamp<int32_t>{LIMIT_MIN, LIMIT_MAX}},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(marker), validation::AccountMarkerValidator}, {JS(marker), validation::CustomValidators::AccountMarkerValidator},
}; };
return rpcSpec; return rpcSpec;

View File

@@ -92,9 +92,9 @@ public:
spec([[maybe_unused]] uint32_t apiVersion) spec([[maybe_unused]] uint32_t apiVersion)
{ {
static auto const rpcSpec = RpcSpec{ static auto const rpcSpec = RpcSpec{
{JS(account), validation::Required{}, validation::AccountValidator}, {JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{"account_index", check::Deprecated{}}, {"account_index", check::Deprecated{}},
{JS(strict), check::Deprecated{}} {JS(strict), check::Deprecated{}}
}; };

View File

@@ -130,11 +130,11 @@ public:
spec([[maybe_unused]] uint32_t apiVersion) spec([[maybe_unused]] uint32_t apiVersion)
{ {
static auto const rpcSpecV1 = RpcSpec{ static auto const rpcSpecV1 = RpcSpec{
{JS(account), validation::AccountValidator}, {JS(account), validation::CustomValidators::AccountValidator},
{JS(ident), validation::AccountValidator}, {JS(ident), validation::CustomValidators::AccountValidator},
{JS(ident), check::Deprecated{}}, {JS(ident), check::Deprecated{}},
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(ledger), check::Deprecated{}}, {JS(ledger), check::Deprecated{}},
{JS(strict), check::Deprecated{}} {JS(strict), check::Deprecated{}}
}; };

View File

@@ -127,16 +127,21 @@ public:
static auto const rpcSpec = RpcSpec{ static auto const rpcSpec = RpcSpec{
{JS(account), {JS(account),
validation::Required{}, validation::Required{},
meta::WithCustomError{validation::AccountValidator, Status(RippledError::rpcACT_MALFORMED)}}, meta::WithCustomError{
{JS(peer), meta::WithCustomError{validation::AccountValidator, Status(RippledError::rpcACT_MALFORMED)}}, 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(ignore_default), validation::Type<bool>{}},
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(limit), {JS(limit),
validation::Type<uint32_t>{}, validation::Type<uint32_t>{},
validation::Min(1u), validation::Min(1u),
modifiers::Clamp<int32_t>{LIMIT_MIN, LIMIT_MAX}}, modifiers::Clamp<int32_t>{LIMIT_MIN, LIMIT_MAX}},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(marker), validation::AccountMarkerValidator}, {JS(marker), validation::CustomValidators::AccountMarkerValidator},
{JS(ledger), check::Deprecated{}}, {JS(ledger), check::Deprecated{}},
{"peer_index", check::Deprecated{}}, {"peer_index", check::Deprecated{}},
}; };

View File

@@ -97,10 +97,10 @@ public:
spec([[maybe_unused]] uint32_t apiVersion) spec([[maybe_unused]] uint32_t apiVersion)
{ {
static auto const rpcSpec = RpcSpec{ static auto const rpcSpec = RpcSpec{
{JS(account), validation::Required{}, validation::AccountValidator}, {JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(marker), validation::Uint256HexStringValidator}, {JS(marker), validation::CustomValidators::Uint256HexStringValidator},
{JS(limit), {JS(limit),
validation::Type<uint32_t>{}, validation::Type<uint32_t>{},
validation::Min(1u), validation::Min(1u),

View File

@@ -113,9 +113,9 @@ public:
{ {
auto const& ledgerTypeStrs = util::getLedgerEntryTypeStrs(); auto const& ledgerTypeStrs = util::getLedgerEntryTypeStrs();
static auto const rpcSpec = RpcSpec{ static auto const rpcSpec = RpcSpec{
{JS(account), validation::Required{}, validation::AccountValidator}, {JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(limit), {JS(limit),
validation::Type<uint32_t>{}, validation::Type<uint32_t>{},
validation::Min(1u), validation::Min(1u),
@@ -123,7 +123,7 @@ public:
{JS(type), {JS(type),
validation::Type<std::string>{}, validation::Type<std::string>{},
validation::OneOf<std::string>(ledgerTypeStrs.cbegin(), ledgerTypeStrs.cend())}, validation::OneOf<std::string>(ledgerTypeStrs.cbegin(), ledgerTypeStrs.cend())},
{JS(marker), validation::AccountMarkerValidator}, {JS(marker), validation::CustomValidators::AccountMarkerValidator},
{JS(deletion_blockers_only), validation::Type<bool>{}}, {JS(deletion_blockers_only), validation::Type<bool>{}},
}; };

View File

@@ -112,10 +112,10 @@ public:
spec([[maybe_unused]] uint32_t apiVersion) spec([[maybe_unused]] uint32_t apiVersion)
{ {
static auto const rpcSpec = RpcSpec{ static auto const rpcSpec = RpcSpec{
{JS(account), validation::Required{}, validation::AccountValidator}, {JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(marker), validation::AccountMarkerValidator}, {JS(marker), validation::CustomValidators::AccountMarkerValidator},
{JS(limit), {JS(limit),
validation::Type<uint32_t>{}, validation::Type<uint32_t>{},
validation::Min(1u), validation::Min(1u),

View File

@@ -125,9 +125,9 @@ public:
{ {
auto const& typesKeysInLowercase = util::getTxTypesInLowercase(); auto const& typesKeysInLowercase = util::getTxTypesInLowercase();
static auto const rpcSpecForV1 = RpcSpec{ static auto const rpcSpecForV1 = RpcSpec{
{JS(account), validation::Required{}, validation::AccountValidator}, {JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(ledger_index_min), validation::Type<int32_t>{}}, {JS(ledger_index_min), validation::Type<int32_t>{}},
{JS(ledger_index_max), validation::Type<int32_t>{}}, {JS(ledger_index_max), validation::Type<int32_t>{}},
{JS(limit), {JS(limit),

View File

@@ -89,8 +89,8 @@ public:
spec([[maybe_unused]] uint32_t apiVersion) spec([[maybe_unused]] uint32_t apiVersion)
{ {
static auto const rpcSpec = RpcSpec{ static auto const rpcSpec = RpcSpec{
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
}; };
return rpcSpec; return rpcSpec;

View File

@@ -112,9 +112,13 @@ public:
meta::Section{ meta::Section{
{JS(currency), {JS(currency),
validation::Required{}, validation::Required{},
meta::WithCustomError{validation::CurrencyValidator, Status(RippledError::rpcDST_AMT_MALFORMED)}}, meta::WithCustomError{
validation::CustomValidators::CurrencyValidator, Status(RippledError::rpcDST_AMT_MALFORMED)
}},
{JS(issuer), {JS(issuer),
meta::WithCustomError{validation::IssuerValidator, Status(RippledError::rpcDST_ISR_MALFORMED)}} meta::WithCustomError{
validation::CustomValidators::IssuerValidator, Status(RippledError::rpcDST_ISR_MALFORMED)
}}
}}, }},
{JS(taker_pays), {JS(taker_pays),
validation::Required{}, validation::Required{},
@@ -122,21 +126,26 @@ public:
meta::Section{ meta::Section{
{JS(currency), {JS(currency),
validation::Required{}, validation::Required{},
meta::WithCustomError{validation::CurrencyValidator, Status(RippledError::rpcSRC_CUR_MALFORMED)}}, meta::WithCustomError{
validation::CustomValidators::CurrencyValidator, Status(RippledError::rpcSRC_CUR_MALFORMED)
}},
{JS(issuer), {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" // return INVALID_PARAMS if account format is wrong for "taker"
{JS(taker), {JS(taker),
meta::WithCustomError{ meta::WithCustomError{
validation::AccountValidator, Status(RippledError::rpcINVALID_PARAMS, "Invalid field 'taker'.") validation::CustomValidators::AccountValidator,
Status(RippledError::rpcINVALID_PARAMS, "Invalid field 'taker'.")
}}, }},
{JS(limit), {JS(limit),
validation::Type<uint32_t>{}, validation::Type<uint32_t>{},
validation::Min(1u), validation::Min(1u),
modifiers::Clamp<int32_t>{LIMIT_MIN, LIMIT_MAX}}, modifiers::Clamp<int32_t>{LIMIT_MIN, LIMIT_MAX}},
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
}; };
return rpcSpec; return rpcSpec;

View File

@@ -95,10 +95,10 @@ public:
spec([[maybe_unused]] uint32_t apiVersion) spec([[maybe_unused]] uint32_t apiVersion)
{ {
static auto const rpcSpec = RpcSpec{ static auto const rpcSpec = RpcSpec{
{JS(source_account), validation::Required{}, validation::AccountValidator}, {JS(source_account), validation::Required{}, validation::CustomValidators::AccountValidator},
{JS(destination_account), validation::Required{}, validation::AccountValidator}, {JS(destination_account), validation::Required{}, validation::CustomValidators::AccountValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
}; };
return rpcSpec; return rpcSpec;

View File

@@ -138,9 +138,9 @@ public:
}}; }};
static auto const rpcSpec = RpcSpec{ static auto const rpcSpec = RpcSpec{
{JS(account), validation::Required{}, validation::AccountValidator}, {JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(hotwallet), hotWalletValidator} {JS(hotwallet), hotWalletValidator}
}; };

View File

@@ -152,7 +152,8 @@ public:
if (!maybeError) if (!maybeError)
return maybeError; return maybeError;
maybeError = validation::AccountBase58Validator.verify(oracle.as_object(), JS(account)); maybeError =
validation::CustomValidators::AccountBase58Validator.verify(oracle.as_object(), JS(account));
if (!maybeError) if (!maybeError)
return Error{Status{RippledError::rpcINVALID_PARAMS}}; return Error{Status{RippledError::rpcINVALID_PARAMS}};
}; };
@@ -161,17 +162,21 @@ public:
}}; }};
static auto const rpcSpec = RpcSpec{ static auto const rpcSpec = RpcSpec{
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
// validate quoteAsset and base_asset in accordance to the currency code found in XRPL doc: // 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 // https://xrpl.org/docs/references/protocol/data-types/currency-formats#currency-codes
// usually Clio returns rpcMALFORMED_CURRENCY , return InvalidParam here just to mimic rippled // usually Clio returns rpcMALFORMED_CURRENCY , return InvalidParam here just to mimic rippled
{JS(base_asset), {JS(base_asset),
validation::Required{}, validation::Required{},
meta::WithCustomError{validation::CurrencyValidator, Status(RippledError::rpcINVALID_PARAMS)}}, meta::WithCustomError{
validation::CustomValidators::CurrencyValidator, Status(RippledError::rpcINVALID_PARAMS)
}},
{JS(quote_asset), {JS(quote_asset),
validation::Required{}, validation::Required{},
meta::WithCustomError{validation::CurrencyValidator, Status(RippledError::rpcINVALID_PARAMS)}}, meta::WithCustomError{
validation::CustomValidators::CurrencyValidator, Status(RippledError::rpcINVALID_PARAMS)
}},
{JS(oracles), validation::Required{}, oraclesValidator}, {JS(oracles), validation::Required{}, oraclesValidator},
// note: Unlike `rippled`, Clio only supports UInt as input, no string, no `null`, etc. // note: Unlike `rippled`, Clio only supports UInt as input, no string, no `null`, etc.
{JS(time_threshold), validation::Type<std::uint32_t>{}}, {JS(time_threshold), validation::Type<std::uint32_t>{}},

View File

@@ -111,8 +111,8 @@ public:
{JS(accounts), check::Deprecated{}}, {JS(accounts), check::Deprecated{}},
{JS(owner_funds), validation::Type<bool>{}}, {JS(owner_funds), validation::Type<bool>{}},
{JS(queue), validation::Type<bool>{}, validation::NotSupported{true}}, {JS(queue), validation::Type<bool>{}, validation::NotSupported{true}},
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(transactions), validation::Type<bool>{}}, {JS(transactions), validation::Type<bool>{}},
{JS(expand), validation::Type<bool>{}}, {JS(expand), validation::Type<bool>{}},
{JS(binary), validation::Type<bool>{}}, {JS(binary), validation::Type<bool>{}},

View File

@@ -118,12 +118,12 @@ public:
static auto const rpcSpec = RpcSpec{ static auto const rpcSpec = RpcSpec{
{JS(binary), validation::Type<bool>{}}, {JS(binary), validation::Type<bool>{}},
{"out_of_order", validation::Type<bool>{}}, {"out_of_order", validation::Type<bool>{}},
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(limit), validation::Type<uint32_t>{}, validation::Min(1u)}, {JS(limit), validation::Type<uint32_t>{}, validation::Min(1u)},
{JS(marker), {JS(marker),
validation::Type<uint32_t, std::string>{}, validation::Type<uint32_t, std::string>{},
meta::IfType<std::string>{validation::Uint256HexStringValidator}}, meta::IfType<std::string>{validation::CustomValidators::Uint256HexStringValidator}},
{JS(type), {JS(type),
meta::WithCustomError{ meta::WithCustomError{
validation::Type<std::string>{}, Status{ripple::rpcINVALID_PARAMS, "Invalid field 'type', not string."} validation::Type<std::string>{}, Status{ripple::rpcINVALID_PARAMS, "Invalid field 'type', not string."}

View File

@@ -146,8 +146,9 @@ public:
return MaybeError{}; return MaybeError{};
}}; }};
static auto const malformedRequestHexStringValidator = static auto const malformedRequestHexStringValidator = meta::WithCustomError{
meta::WithCustomError{validation::Uint256HexStringValidator, Status(ClioError::rpcMALFORMED_REQUEST)}; validation::CustomValidators::Uint256HexStringValidator, Status(ClioError::rpcMALFORMED_REQUEST)
};
static auto const malformedRequestIntValidator = static auto const malformedRequestIntValidator =
meta::WithCustomError{validation::Type<uint32_t>{}, Status(ClioError::rpcMALFORMED_REQUEST)}; meta::WithCustomError{validation::Type<uint32_t>{}, Status(ClioError::rpcMALFORMED_REQUEST)};
@@ -156,27 +157,27 @@ public:
meta::IfType<boost::json::object>{meta::Section{ meta::IfType<boost::json::object>{meta::Section{
{ripple::sfLockingChainDoor.getJsonName().c_str(), {ripple::sfLockingChainDoor.getJsonName().c_str(),
validation::Required{}, validation::Required{},
validation::AccountBase58Validator}, validation::CustomValidators::AccountBase58Validator},
{ripple::sfIssuingChainDoor.getJsonName().c_str(), {ripple::sfIssuingChainDoor.getJsonName().c_str(),
validation::Required{}, validation::Required{},
validation::AccountBase58Validator}, validation::CustomValidators::AccountBase58Validator},
{ripple::sfLockingChainIssue.getJsonName().c_str(), {ripple::sfLockingChainIssue.getJsonName().c_str(),
validation::Required{}, validation::Required{},
validation::CurrencyIssueValidator}, validation::CustomValidators::CurrencyIssueValidator},
{ripple::sfIssuingChainIssue.getJsonName().c_str(), {ripple::sfIssuingChainIssue.getJsonName().c_str(),
validation::Required{}, validation::Required{},
validation::CurrencyIssueValidator}, validation::CustomValidators::CurrencyIssueValidator},
}}, }},
Status(ClioError::rpcMALFORMED_REQUEST) Status(ClioError::rpcMALFORMED_REQUEST)
}; };
static auto const rpcSpec = RpcSpec{ static auto const rpcSpec = RpcSpec{
{JS(binary), validation::Type<bool>{}}, {JS(binary), validation::Type<bool>{}},
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(index), malformedRequestHexStringValidator}, {JS(index), malformedRequestHexStringValidator},
{JS(account_root), validation::AccountBase58Validator}, {JS(account_root), validation::CustomValidators::AccountBase58Validator},
{JS(did), validation::AccountBase58Validator}, {JS(did), validation::CustomValidators::AccountBase58Validator},
{JS(check), malformedRequestHexStringValidator}, {JS(check), malformedRequestHexStringValidator},
{JS(deposit_preauth), {JS(deposit_preauth),
validation::Type<std::string, boost::json::object>{}, validation::Type<std::string, boost::json::object>{},
@@ -185,16 +186,18 @@ public:
meta::Section{ meta::Section{
{JS(owner), {JS(owner),
validation::Required{}, validation::Required{},
meta::WithCustomError{validation::AccountBase58Validator, Status(ClioError::rpcMALFORMED_OWNER)}}, meta::WithCustomError{
{JS(authorized), validation::Required{}, validation::AccountBase58Validator}, validation::CustomValidators::AccountBase58Validator, Status(ClioError::rpcMALFORMED_OWNER)
}},
{JS(authorized), validation::Required{}, validation::CustomValidators::AccountBase58Validator},
}, },
}}, }},
{JS(directory), {JS(directory),
validation::Type<std::string, boost::json::object>{}, validation::Type<std::string, boost::json::object>{},
meta::IfType<std::string>{malformedRequestHexStringValidator}, meta::IfType<std::string>{malformedRequestHexStringValidator},
meta::IfType<boost::json::object>{meta::Section{ meta::IfType<boost::json::object>{meta::Section{
{JS(owner), validation::AccountBase58Validator}, {JS(owner), validation::CustomValidators::AccountBase58Validator},
{JS(dir_root), validation::Uint256HexStringValidator}, {JS(dir_root), validation::CustomValidators::Uint256HexStringValidator},
{JS(sub_index), malformedRequestIntValidator} {JS(sub_index), malformedRequestIntValidator}
}}}, }}},
{JS(escrow), {JS(escrow),
@@ -204,7 +207,9 @@ public:
meta::Section{ meta::Section{
{JS(owner), {JS(owner),
validation::Required{}, validation::Required{},
meta::WithCustomError{validation::AccountBase58Validator, Status(ClioError::rpcMALFORMED_OWNER)}}, meta::WithCustomError{
validation::CustomValidators::AccountBase58Validator, Status(ClioError::rpcMALFORMED_OWNER)
}},
{JS(seq), validation::Required{}, malformedRequestIntValidator}, {JS(seq), validation::Required{}, malformedRequestIntValidator},
}, },
}}, }},
@@ -213,7 +218,7 @@ public:
meta::IfType<std::string>{malformedRequestHexStringValidator}, meta::IfType<std::string>{malformedRequestHexStringValidator},
meta::IfType<boost::json::object>{ meta::IfType<boost::json::object>{
meta::Section{ meta::Section{
{JS(account), validation::Required{}, validation::AccountBase58Validator}, {JS(account), validation::Required{}, validation::CustomValidators::AccountBase58Validator},
{JS(seq), validation::Required{}, malformedRequestIntValidator}, {JS(seq), validation::Required{}, malformedRequestIntValidator},
}, },
}}, }},
@@ -222,14 +227,14 @@ public:
validation::Type<boost::json::object>{}, validation::Type<boost::json::object>{},
meta::Section{ meta::Section{
{JS(accounts), validation::Required{}, rippleStateAccountsCheck}, {JS(accounts), validation::Required{}, rippleStateAccountsCheck},
{JS(currency), validation::Required{}, validation::CurrencyValidator}, {JS(currency), validation::Required{}, validation::CustomValidators::CurrencyValidator},
}}, }},
{JS(ticket), {JS(ticket),
validation::Type<std::string, boost::json::object>{}, validation::Type<std::string, boost::json::object>{},
meta::IfType<std::string>{malformedRequestHexStringValidator}, meta::IfType<std::string>{malformedRequestHexStringValidator},
meta::IfType<boost::json::object>{ meta::IfType<boost::json::object>{
meta::Section{ meta::Section{
{JS(account), validation::Required{}, validation::AccountBase58Validator}, {JS(account), validation::Required{}, validation::CustomValidators::AccountBase58Validator},
{JS(ticket_seq), validation::Required{}, malformedRequestIntValidator}, {JS(ticket_seq), validation::Required{}, malformedRequestIntValidator},
}, },
}}, }},
@@ -244,20 +249,22 @@ public:
meta::WithCustomError{ meta::WithCustomError{
validation::Type<boost::json::object>{}, Status(ClioError::rpcMALFORMED_REQUEST) validation::Type<boost::json::object>{}, Status(ClioError::rpcMALFORMED_REQUEST)
}, },
validation::CurrencyIssueValidator}, validation::CustomValidators::CurrencyIssueValidator},
{JS(asset2), {JS(asset2),
meta::WithCustomError{validation::Required{}, Status(ClioError::rpcMALFORMED_REQUEST)}, meta::WithCustomError{validation::Required{}, Status(ClioError::rpcMALFORMED_REQUEST)},
meta::WithCustomError{ meta::WithCustomError{
validation::Type<boost::json::object>{}, Status(ClioError::rpcMALFORMED_REQUEST) validation::Type<boost::json::object>{}, Status(ClioError::rpcMALFORMED_REQUEST)
}, },
validation::CurrencyIssueValidator}, validation::CustomValidators::CurrencyIssueValidator},
}, },
}}, }},
{JS(bridge), {JS(bridge),
meta::WithCustomError{validation::Type<boost::json::object>{}, Status(ClioError::rpcMALFORMED_REQUEST)}, meta::WithCustomError{validation::Type<boost::json::object>{}, Status(ClioError::rpcMALFORMED_REQUEST)},
bridgeJsonValidator}, bridgeJsonValidator},
{JS(bridge_account), {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), {JS(xchain_owned_claim_id),
meta::WithCustomError{ meta::WithCustomError{
validation::Type<std::string, boost::json::object>{}, Status(ClioError::rpcMALFORMED_REQUEST) validation::Type<std::string, boost::json::object>{}, Status(ClioError::rpcMALFORMED_REQUEST)
@@ -292,7 +299,9 @@ public:
meta::IfType<boost::json::object>{meta::Section{ meta::IfType<boost::json::object>{meta::Section{
{JS(account), {JS(account),
meta::WithCustomError{validation::Required{}, Status(ClioError::rpcMALFORMED_REQUEST)}, 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.: // note: Unlike `rippled`, Clio only supports UInt as input, no string, no `null`, etc.:
{JS(oracle_document_id), {JS(oracle_document_id),
meta::WithCustomError{validation::Required{}, Status(ClioError::rpcMALFORMED_REQUEST)}, meta::WithCustomError{validation::Required{}, Status(ClioError::rpcMALFORMED_REQUEST)},

View File

@@ -119,9 +119,9 @@ public:
spec([[maybe_unused]] uint32_t apiVersion) spec([[maybe_unused]] uint32_t apiVersion)
{ {
static auto const rpcSpec = RpcSpec{ static auto const rpcSpec = RpcSpec{
{JS(nft_id), validation::Required{}, validation::Uint256HexStringValidator}, {JS(nft_id), validation::Required{}, validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(ledger_index_min), validation::Type<int32_t>{}}, {JS(ledger_index_min), validation::Type<int32_t>{}},
{JS(ledger_index_max), validation::Type<int32_t>{}}, {JS(ledger_index_max), validation::Type<int32_t>{}},
{JS(binary), validation::Type<bool>{}}, {JS(binary), validation::Type<bool>{}},

View File

@@ -95,9 +95,9 @@ public:
spec([[maybe_unused]] uint32_t apiVersion) spec([[maybe_unused]] uint32_t apiVersion)
{ {
static auto const rpcSpec = RpcSpec{ static auto const rpcSpec = RpcSpec{
{JS(nft_id), validation::Required{}, validation::Uint256HexStringValidator}, {JS(nft_id), validation::Required{}, validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
}; };
return rpcSpec; return rpcSpec;

View File

@@ -99,14 +99,14 @@ public:
spec([[maybe_unused]] uint32_t apiVersion) spec([[maybe_unused]] uint32_t apiVersion)
{ {
static auto const rpcSpec = RpcSpec{ static auto const rpcSpec = RpcSpec{
{JS(nft_id), validation::Required{}, validation::Uint256HexStringValidator}, {JS(nft_id), validation::Required{}, validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(limit), {JS(limit),
validation::Type<uint32_t>{}, validation::Type<uint32_t>{},
validation::Min(1u), validation::Min(1u),
modifiers::Clamp<int32_t>{LIMIT_MIN, LIMIT_MAX}}, modifiers::Clamp<int32_t>{LIMIT_MIN, LIMIT_MAX}},
{JS(marker), validation::Uint256HexStringValidator}, {JS(marker), validation::CustomValidators::Uint256HexStringValidator},
}; };
return rpcSpec; return rpcSpec;

View File

@@ -95,15 +95,15 @@ public:
spec([[maybe_unused]] uint32_t apiVersion) spec([[maybe_unused]] uint32_t apiVersion)
{ {
static auto const rpcSpec = RpcSpec{ static auto const rpcSpec = RpcSpec{
{JS(issuer), validation::Required{}, validation::AccountValidator}, {JS(issuer), validation::Required{}, validation::CustomValidators::AccountValidator},
{"nft_taxon", validation::Type<uint32_t>{}}, {"nft_taxon", validation::Type<uint32_t>{}},
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(limit), {JS(limit),
validation::Type<uint32_t>{}, validation::Type<uint32_t>{},
validation::Min(1u), validation::Min(1u),
modifiers::Clamp<int32_t>{LIMIT_MIN, LIMIT_MAX}}, modifiers::Clamp<int32_t>{LIMIT_MIN, LIMIT_MAX}},
{JS(marker), validation::Uint256HexStringValidator}, {JS(marker), validation::CustomValidators::Uint256HexStringValidator},
}; };
return rpcSpec; return rpcSpec;

View File

@@ -105,14 +105,14 @@ public:
spec([[maybe_unused]] uint32_t apiVersion) spec([[maybe_unused]] uint32_t apiVersion)
{ {
static auto const rpcSpecV1 = RpcSpec{ static auto const rpcSpecV1 = RpcSpec{
{JS(account), validation::Required{}, validation::AccountValidator}, {JS(account), validation::Required{}, validation::CustomValidators::AccountValidator},
{JS(role), {JS(role),
validation::Required{}, validation::Required{},
meta::WithCustomError{ meta::WithCustomError{
validation::OneOf{"gateway", "user"}, Status{RippledError::rpcINVALID_PARAMS, "role field is invalid"} validation::OneOf{"gateway", "user"}, Status{RippledError::rpcINVALID_PARAMS, "role field is invalid"}
}}, }},
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
{JS(limit), {JS(limit),
validation::Type<uint32_t>(), validation::Type<uint32_t>(),
validation::Min(1u), validation::Min(1u),

View File

@@ -79,7 +79,7 @@ SubscribeHandler::spec([[maybe_unused]] uint32_t apiVersion)
if (book.as_object().contains("taker")) { if (book.as_object().contains("taker")) {
if (auto err = meta::WithCustomError( if (auto err = meta::WithCustomError(
validation::AccountValidator, validation::CustomValidators::AccountValidator,
Status{RippledError::rpcBAD_ISSUER, "Issuer account malformed."} Status{RippledError::rpcBAD_ISSUER, "Issuer account malformed."}
) )
.verify(book.as_object(), "taker"); .verify(book.as_object(), "taker");
@@ -96,9 +96,9 @@ SubscribeHandler::spec([[maybe_unused]] uint32_t apiVersion)
}}; }};
static auto const rpcSpec = RpcSpec{ static auto const rpcSpec = RpcSpec{
{JS(streams), validation::SubscribeStreamValidator}, {JS(streams), validation::CustomValidators::SubscribeStreamValidator},
{JS(accounts), validation::SubscribeAccountsValidator}, {JS(accounts), validation::CustomValidators::SubscribeAccountsValidator},
{JS(accounts_proposed), validation::SubscribeAccountsValidator}, {JS(accounts_proposed), validation::CustomValidators::SubscribeAccountsValidator},
{JS(books), booksValidator}, {JS(books), booksValidator},
{"user", check::Deprecated{}}, {"user", check::Deprecated{}},
{JS(password), check::Deprecated{}}, {JS(password), check::Deprecated{}},

View File

@@ -95,9 +95,9 @@ public:
static auto const rpcSpec = RpcSpec{ static auto const rpcSpec = RpcSpec{
{JS(tx_hash), {JS(tx_hash),
meta::WithCustomError{validation::Required{}, Status(ClioError::rpcFIELD_NOT_FOUND_TRANSACTION)}, meta::WithCustomError{validation::Required{}, Status(ClioError::rpcFIELD_NOT_FOUND_TRANSACTION)},
validation::Uint256HexStringValidator}, validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_hash), validation::Uint256HexStringValidator}, {JS(ledger_hash), validation::CustomValidators::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator}, {JS(ledger_index), validation::CustomValidators::LedgerIndexValidator},
}; };
return rpcSpec; return rpcSpec;

View File

@@ -117,7 +117,7 @@ public:
spec(uint32_t apiVersion) spec(uint32_t apiVersion)
{ {
static RpcSpec const rpcSpecForV1 = { static RpcSpec const rpcSpecForV1 = {
{JS(transaction), validation::Uint256HexStringValidator}, {JS(transaction), validation::CustomValidators::Uint256HexStringValidator},
{JS(min_ledger), validation::Type<uint32_t>{}}, {JS(min_ledger), validation::Type<uint32_t>{}},
{JS(max_ledger), validation::Type<uint32_t>{}}, {JS(max_ledger), validation::Type<uint32_t>{}},
{JS(ctid), validation::Type<std::string>{}}, {JS(ctid), validation::Type<std::string>{}},

View File

@@ -77,9 +77,9 @@ UnsubscribeHandler::spec([[maybe_unused]] uint32_t apiVersion)
}}; }};
static auto const rpcSpec = RpcSpec{ static auto const rpcSpec = RpcSpec{
{JS(streams), validation::SubscribeStreamValidator}, {JS(streams), validation::CustomValidators::SubscribeStreamValidator},
{JS(accounts), validation::SubscribeAccountsValidator}, {JS(accounts), validation::CustomValidators::SubscribeAccountsValidator},
{JS(accounts_proposed), validation::SubscribeAccountsValidator}, {JS(accounts_proposed), validation::CustomValidators::SubscribeAccountsValidator},
{JS(books), booksValidator}, {JS(books), booksValidator},
{JS(url), check::Deprecated{}}, {JS(url), check::Deprecated{}},
{JS(rt_accounts), check::Deprecated{}}, {JS(rt_accounts), check::Deprecated{}},

View File

@@ -294,7 +294,7 @@ TEST_F(RPCBaseTest, IfTypeValidator)
Section{{"limit", Required{}, Type<uint32_t>{}, Between<uint32_t>{0, 100}}}, Section{{"limit", Required{}, Type<uint32_t>{}, Between<uint32_t>{0, 100}}},
Section{{"limit2", 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", {"mix2",
Section{{"limit", Required{}, Type<uint32_t>{}, Between<uint32_t>{0, 100}}}, Section{{"limit", Required{}, Type<uint32_t>{}, Between<uint32_t>{0, 100}}},
Type<std::string, json::object>{}}, Type<std::string, json::object>{}},
@@ -329,8 +329,10 @@ TEST_F(RPCBaseTest, IfTypeValidator)
TEST_F(RPCBaseTest, WithCustomError) TEST_F(RPCBaseTest, WithCustomError)
{ {
auto const spec = RpcSpec{ 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"}}} {"other", WithCustomError{Type<std::string>{}, rpc::Status{ripple::rpcALREADY_MULTISIG, "MyCustomError2"}}}
}; };
@@ -390,7 +392,7 @@ TEST_F(RPCBaseTest, NotSupported)
TEST_F(RPCBaseTest, LedgerIndexValidator) TEST_F(RPCBaseTest, LedgerIndexValidator)
{ {
auto spec = RpcSpec{ auto spec = RpcSpec{
{"ledgerIndex", LedgerIndexValidator}, {"ledgerIndex", CustomValidators::LedgerIndexValidator},
}; };
auto passingInput = json::parse(R"({ "ledgerIndex": "validated" })"); auto passingInput = json::parse(R"({ "ledgerIndex": "validated" })");
ASSERT_TRUE(spec.process(passingInput)); ASSERT_TRUE(spec.process(passingInput));
@@ -415,7 +417,7 @@ TEST_F(RPCBaseTest, LedgerIndexValidator)
TEST_F(RPCBaseTest, AccountValidator) TEST_F(RPCBaseTest, AccountValidator)
{ {
auto spec = RpcSpec{ auto spec = RpcSpec{
{"account", AccountValidator}, {"account", CustomValidators::AccountValidator},
}; };
auto failingInput = json::parse(R"({ "account": 256 })"); auto failingInput = json::parse(R"({ "account": 256 })");
ASSERT_FALSE(spec.process(failingInput)); ASSERT_FALSE(spec.process(failingInput));
@@ -437,7 +439,7 @@ TEST_F(RPCBaseTest, AccountValidator)
TEST_F(RPCBaseTest, AccountMarkerValidator) TEST_F(RPCBaseTest, AccountMarkerValidator)
{ {
auto spec = RpcSpec{ auto spec = RpcSpec{
{"marker", AccountMarkerValidator}, {"marker", CustomValidators::AccountMarkerValidator},
}; };
auto failingInput = json::parse(R"({ "marker": 256 })"); auto failingInput = json::parse(R"({ "marker": 256 })");
ASSERT_FALSE(spec.process(failingInput)); ASSERT_FALSE(spec.process(failingInput));
@@ -454,7 +456,7 @@ TEST_F(RPCBaseTest, AccountMarkerValidator)
TEST_F(RPCBaseTest, Uint256HexStringValidator) TEST_F(RPCBaseTest, Uint256HexStringValidator)
{ {
auto const spec = RpcSpec{{"transaction", Uint256HexStringValidator}}; auto const spec = RpcSpec{{"transaction", CustomValidators::Uint256HexStringValidator}};
auto passingInput = auto passingInput =
json::parse(R"({ "transaction": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC"})"); json::parse(R"({ "transaction": "1B8590C01B0006EDFA9ED60296DD052DC5E90F99659B25014D08E1BC983515BC"})");
ASSERT_TRUE(spec.process(passingInput)); ASSERT_TRUE(spec.process(passingInput));
@@ -472,7 +474,7 @@ TEST_F(RPCBaseTest, Uint256HexStringValidator)
TEST_F(RPCBaseTest, CurrencyValidator) TEST_F(RPCBaseTest, CurrencyValidator)
{ {
auto const spec = RpcSpec{{"currency", CurrencyValidator}}; auto const spec = RpcSpec{{"currency", CustomValidators::CurrencyValidator}};
auto passingInput = json::parse(R"({ "currency": "GBP"})"); auto passingInput = json::parse(R"({ "currency": "GBP"})");
ASSERT_TRUE(spec.process(passingInput)); ASSERT_TRUE(spec.process(passingInput));
@@ -500,7 +502,7 @@ TEST_F(RPCBaseTest, CurrencyValidator)
TEST_F(RPCBaseTest, IssuerValidator) TEST_F(RPCBaseTest, IssuerValidator)
{ {
auto const spec = RpcSpec{{"issuer", IssuerValidator}}; auto const spec = RpcSpec{{"issuer", CustomValidators::IssuerValidator}};
auto passingInput = json::parse(R"({ "issuer": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn"})"); auto passingInput = json::parse(R"({ "issuer": "rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn"})");
ASSERT_TRUE(spec.process(passingInput)); ASSERT_TRUE(spec.process(passingInput));
@@ -516,7 +518,7 @@ TEST_F(RPCBaseTest, IssuerValidator)
TEST_F(RPCBaseTest, SubscribeStreamValidator) TEST_F(RPCBaseTest, SubscribeStreamValidator)
{ {
auto const spec = RpcSpec{{"streams", SubscribeStreamValidator}}; auto const spec = RpcSpec{{"streams", CustomValidators::SubscribeStreamValidator}};
auto passingInput = json::parse( auto passingInput = json::parse(
R"({ R"({
"streams": "streams":
@@ -548,7 +550,7 @@ TEST_F(RPCBaseTest, SubscribeStreamValidator)
TEST_F(RPCBaseTest, SubscribeAccountsValidator) TEST_F(RPCBaseTest, SubscribeAccountsValidator)
{ {
auto const spec = RpcSpec{{"accounts", SubscribeAccountsValidator}}; auto const spec = RpcSpec{{"accounts", CustomValidators::SubscribeAccountsValidator}};
auto passingInput = auto passingInput =
json::parse(R"({ "accounts": ["rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn","rLEsXccBGNR3UPuPu2hUXPjziKC3qKSBun"]})"); json::parse(R"({ "accounts": ["rf1BiGeXwwQoi8Z2ueFYTEXSwuJYfV2Jpn","rLEsXccBGNR3UPuPu2hUXPjziKC3qKSBun"]})");
ASSERT_TRUE(spec.process(passingInput)); ASSERT_TRUE(spec.process(passingInput));