Skip to content

Commit

Permalink
Optimizing how validation logic is applied to structs (#10)
Browse files Browse the repository at this point in the history
  • Loading branch information
Tanz0rz authored Feb 1, 2024
1 parent 0661a8c commit c22d8cd
Show file tree
Hide file tree
Showing 9 changed files with 438 additions and 233 deletions.
143 changes: 39 additions & 104 deletions golang/client/orderbook/orderbook_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,31 +16,15 @@ type CreateOrderParams struct {

func (params *CreateOrderParams) Validate() error {
var validationErrors []error
if err := validate.ChainId(params.ChainId, "chainId"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.PrivateKey(params.WalletKey, "walletKey"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddress(params.SourceWallet, "sourceWallet"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddress(params.FromToken, "fromToken"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddress(params.ToToken, "toToken"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.BigInt(params.TakingAmount, "takingAmount"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.BigInt(params.MakingAmount, "makingAmount"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddress(params.Receiver, "receiver"); err != nil {
validationErrors = append(validationErrors, err)
}
return validate.AggregateValidationErorrs(validationErrors)
validationErrors = validate.Parameter(params.ChainId, "chainId", validate.ChainID, validationErrors)
validationErrors = validate.Parameter(params.WalletKey, "walletKey", validate.PrivateKey, validationErrors)
validationErrors = validate.Parameter(params.SourceWallet, "sourceWallet", validate.EthereumAddress, validationErrors)
validationErrors = validate.Parameter(params.FromToken, "fromToken", validate.EthereumAddress, validationErrors)
validationErrors = validate.Parameter(params.ToToken, "toToken", validate.EthereumAddress, validationErrors)
validationErrors = validate.Parameter(params.TakingAmount, "takingAmount", validate.BigInt, validationErrors)
validationErrors = validate.Parameter(params.MakingAmount, "makingAmount", validate.BigInt, validationErrors)
validationErrors = validate.Parameter(params.Receiver, "receiver", validate.EthereumAddress, validationErrors)
return validate.ConsolidateValidationErorrs(validationErrors)
}

type GetOrdersByCreatorAddressParams struct {
Expand All @@ -51,31 +35,15 @@ type GetOrdersByCreatorAddressParams struct {

func (params *GetOrdersByCreatorAddressParams) Validate() error {
var validationErrors []error
if err := validate.ChainId(params.ChainId, "chainId"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddress(params.CreatorAddress, "creatorAddress"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.PagePointer(params.Page, "page"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.LimitPointer(params.Limit, "limit"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.StatusesIntsPointer(params.Statuses, "statuses"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.SortByPointer((*string)(params.SortBy), "sortBy"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddressPointer(params.TakerAsset, "takerAsset"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddressPointer(params.MakerAsset, "makerAsset"); err != nil {
validationErrors = append(validationErrors, err)
}
return validate.AggregateValidationErorrs(validationErrors)
validationErrors = validate.Parameter(params.ChainId, "chainId", validate.ChainID, validationErrors)
validationErrors = validate.Parameter(params.CreatorAddress, "creatorAddress", validate.EthereumAddress, validationErrors)
validationErrors = validate.Parameter(params.Page, "page", validate.PagePointer, validationErrors)
validationErrors = validate.Parameter(params.Limit, "limit", validate.LimitPointer, validationErrors)
validationErrors = validate.Parameter(params.Statuses, "statuses", validate.StatusesIntsPointer, validationErrors)
validationErrors = validate.Parameter((*string)(params.SortBy), "sortBy", validate.SortByPointer, validationErrors)
validationErrors = validate.Parameter(params.TakerAsset, "takerAsset", validate.EthereumAddressPointer, validationErrors)
validationErrors = validate.Parameter(params.MakerAsset, "makerAsset", validate.EthereumAddressPointer, validationErrors)
return validate.ConsolidateValidationErorrs(validationErrors)
}

type GetAllOrdersParams struct {
Expand All @@ -85,28 +53,14 @@ type GetAllOrdersParams struct {

func (params *GetAllOrdersParams) Validate() error {
var validationErrors []error
if err := validate.ChainId(params.ChainId, "chainId"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.PagePointer(params.Page, "page"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.LimitPointer(params.Limit, "limit"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.StatusesIntsPointer(params.Statuses, "statuses"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.SortByPointer((*string)(params.SortBy), "sortBy"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddressPointer(params.TakerAsset, "takerAsset"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddressPointer(params.MakerAsset, "makerAsset"); err != nil {
validationErrors = append(validationErrors, err)
}
return validate.AggregateValidationErorrs(validationErrors)
validationErrors = validate.Parameter(params.ChainId, "chainId", validate.ChainID, validationErrors)
validationErrors = validate.Parameter(params.Page, "page", validate.PagePointer, validationErrors)
validationErrors = validate.Parameter(params.Limit, "limit", validate.LimitPointer, validationErrors)
validationErrors = validate.Parameter(params.Statuses, "statuses", validate.StatusesIntsPointer, validationErrors)
validationErrors = validate.Parameter((*string)(params.SortBy), "sortBy", validate.SortByPointer, validationErrors)
validationErrors = validate.Parameter(params.TakerAsset, "takerAsset", validate.EthereumAddressPointer, validationErrors)
validationErrors = validate.Parameter(params.MakerAsset, "makerAsset", validate.EthereumAddressPointer, validationErrors)
return validate.ConsolidateValidationErorrs(validationErrors)
}

type GetCountParams struct {
Expand All @@ -116,14 +70,9 @@ type GetCountParams struct {

func (params *GetCountParams) Validate() error {
var validationErrors []error
if err := validate.ChainId(params.ChainId, "chainId"); err != nil {
validationErrors = append(validationErrors, err)
}

if err := validate.StatusesStrings(params.Statuses, "statuses"); err != nil {
validationErrors = append(validationErrors, err)
}
return validate.AggregateValidationErorrs(validationErrors)
validationErrors = validate.Parameter(params.ChainId, "chainId", validate.ChainID, validationErrors)
validationErrors = validate.Parameter(params.Statuses, "statuses", validate.StatusesStrings, validationErrors)
return validate.ConsolidateValidationErorrs(validationErrors)
}

type GetEventParams struct {
Expand All @@ -133,13 +82,9 @@ type GetEventParams struct {

func (params *GetEventParams) Validate() error { // TODO Find validation criteria for OrderHash
var validationErrors []error
if err := validate.ChainId(params.ChainId, "chainId"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.OrderHash(params.OrderHash, "orderHash"); err != nil {
validationErrors = append(validationErrors, err)
}
return validate.AggregateValidationErorrs(validationErrors)
validationErrors = validate.Parameter(params.ChainId, "chainId", validate.ChainID, validationErrors)
validationErrors = validate.Parameter(params.OrderHash, "orderHash", validate.OrderHash, validationErrors)
return validate.ConsolidateValidationErorrs(validationErrors)
}

type GetEventsParams struct {
Expand All @@ -149,13 +94,9 @@ type GetEventsParams struct {

func (params *GetEventsParams) Validate() error {
var validationErrors []error
if err := validate.ChainId(params.ChainId, "chainId"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.Limit(params.Limit, "limit"); err != nil {
validationErrors = append(validationErrors, err)
}
return validate.AggregateValidationErorrs(validationErrors)
validationErrors = validate.Parameter(params.ChainId, "chainId", validate.ChainID, validationErrors)
validationErrors = validate.Parameter(params.Limit, "limit", validate.Limit, validationErrors)
return validate.ConsolidateValidationErorrs(validationErrors)
}

type GetActiveOrdersWithPermitParams struct {
Expand All @@ -166,14 +107,8 @@ type GetActiveOrdersWithPermitParams struct {

func (params *GetActiveOrdersWithPermitParams) Validate() error {
var validationErrors []error
if err := validate.ChainId(params.ChainId, "chainId"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.PrivateKey(params.Wallet, "wallet"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddress(params.Token, "token"); err != nil {
validationErrors = append(validationErrors, err)
}
return validate.AggregateValidationErorrs(validationErrors)
validationErrors = validate.Parameter(params.ChainId, "chainId", validate.ChainID, validationErrors)
validationErrors = validate.Parameter(params.Wallet, "wallet", validate.PrivateKey, validationErrors)
validationErrors = validate.Parameter(params.Token, "token", validate.EthereumAddress, validationErrors)
return validate.ConsolidateValidationErorrs(validationErrors)
}
128 changes: 36 additions & 92 deletions golang/client/swap/swap_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,34 +17,16 @@ type SwapTokensParams struct {

func (params *SwapTokensParams) Validate() error {
var validationErrors []error
if err := validate.ApprovalType(int(params.ApprovalType), "approvalType"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.ChainId(params.ChainId, "chainId"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddress(params.PublicAddress, "publicAddress"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.PrivateKey(params.WalletKey, "walletKey"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddress(params.Src, "src"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddress(params.Dst, "dst"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.BigInt(params.Amount, "amount"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddress(params.From, "from"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.Slippage(params.Slippage, "slippage"); err != nil {
validationErrors = append(validationErrors, err)
}
return validate.AggregateValidationErorrs(validationErrors)
validationErrors = validate.Parameter(int(params.ApprovalType), "approvalType", validate.ApprovalType, validationErrors)
validationErrors = validate.Parameter(params.ChainId, "chainId", validate.ChainID, validationErrors)
validationErrors = validate.Parameter(params.PublicAddress, "publicAddress", validate.EthereumAddress, validationErrors)
validationErrors = validate.Parameter(params.WalletKey, "walletKey", validate.PrivateKey, validationErrors)
validationErrors = validate.Parameter(params.Src, "src", validate.EthereumAddress, validationErrors)
validationErrors = validate.Parameter(params.Dst, "dst", validate.EthereumAddress, validationErrors)
validationErrors = validate.Parameter(params.Amount, "amount", validate.BigInt, validationErrors)
validationErrors = validate.Parameter(params.From, "from", validate.EthereumAddress, validationErrors)
validationErrors = validate.Parameter(params.Slippage, "slippage", validate.Slippage, validationErrors)
return validate.ConsolidateValidationErorrs(validationErrors)
}

type ApproveAllowanceParams struct {
Expand All @@ -54,16 +36,10 @@ type ApproveAllowanceParams struct {

func (params *ApproveAllowanceParams) Validate() error {
var validationErrors []error
if err := validate.ChainId(params.ChainId, "chainId"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddress(params.TokenAddress, "tokenAddress"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddress(params.WalletAddress, "walletAddress"); err != nil {
validationErrors = append(validationErrors, err)
}
return validate.AggregateValidationErorrs(validationErrors)
validationErrors = validate.Parameter(params.ChainId, "chainId", validate.ChainID, validationErrors)
validationErrors = validate.Parameter(params.TokenAddress, "tokenAddress", validate.EthereumAddress, validationErrors)
validationErrors = validate.Parameter(params.WalletAddress, "walletAddress", validate.EthereumAddress, validationErrors)
return validate.ConsolidateValidationErorrs(validationErrors)
}

type ApproveSpenderParams struct {
Expand All @@ -72,10 +48,8 @@ type ApproveSpenderParams struct {

func (params *ApproveSpenderParams) Validate() error {
var validationErrors []error
if err := validate.ChainId(params.ChainId, "chainId"); err != nil {
validationErrors = append(validationErrors, err)
}
return validate.AggregateValidationErorrs(validationErrors)
validationErrors = validate.Parameter(params.ChainId, "chainId", validate.ChainID, validationErrors)
return validate.ConsolidateValidationErorrs(validationErrors)
}

type ApproveTransactionParams struct {
Expand All @@ -85,16 +59,10 @@ type ApproveTransactionParams struct {

func (params *ApproveTransactionParams) Validate() error {
var validationErrors []error
if err := validate.ChainId(params.ChainId, "chainId"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddress(params.TokenAddress, "tokenAddress"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.BigIntPointer(params.Amount, "amount"); err != nil {
validationErrors = append(validationErrors, err)
}
return validate.AggregateValidationErorrs(validationErrors)
validationErrors = validate.Parameter(params.ChainId, "chainId", validate.ChainID, validationErrors)
validationErrors = validate.Parameter(params.TokenAddress, "tokenAddress", validate.EthereumAddress, validationErrors)
validationErrors = validate.Parameter(params.Amount, "amount", validate.BigIntPointer, validationErrors)
return validate.ConsolidateValidationErorrs(validationErrors)
}

type GetLiquiditySourcesParams struct {
Expand All @@ -103,10 +71,8 @@ type GetLiquiditySourcesParams struct {

func (params *GetLiquiditySourcesParams) Validate() error {
var validationErrors []error
if err := validate.ChainId(params.ChainId, "chainId"); err != nil {
validationErrors = append(validationErrors, err)
}
return validate.AggregateValidationErorrs(validationErrors)
validationErrors = validate.Parameter(params.ChainId, "chainId", validate.ChainID, validationErrors)
return validate.ConsolidateValidationErorrs(validationErrors)
}

type GetQuoteParams struct {
Expand All @@ -116,22 +82,14 @@ type GetQuoteParams struct {

func (params *GetQuoteParams) Validate() error {
var validationErrors []error
if err := validate.ChainId(params.ChainId, "chainId"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddress(params.Src, "src"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddress(params.Dst, "dst"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.BigInt(params.Amount, "amount"); err != nil {
validationErrors = append(validationErrors, err)
}
validationErrors = validate.Parameter(params.ChainId, "chainId", validate.ChainID, validationErrors)
validationErrors = validate.Parameter(params.Src, "src", validate.EthereumAddress, validationErrors)
validationErrors = validate.Parameter(params.Dst, "dst", validate.EthereumAddress, validationErrors)
validationErrors = validate.Parameter(params.Amount, "amount", validate.BigInt, validationErrors)
if len(params.Src) > 0 && len(params.Dst) > 0 && params.Src == params.Dst {
validationErrors = append(validationErrors, errors.New("src and dst tokens must be different"))
}
return validate.AggregateValidationErorrs(validationErrors)
return validate.ConsolidateValidationErorrs(validationErrors)
}

type GetSwapDataParams struct {
Expand All @@ -142,28 +100,16 @@ type GetSwapDataParams struct {

func (params *GetSwapDataParams) Validate() error {
var validationErrors []error
if err := validate.ChainId(params.ChainId, "chainId"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddress(params.Src, "src"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddress(params.Dst, "dst"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.BigInt(params.Amount, "amount"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.EthereumAddress(params.From, "from"); err != nil {
validationErrors = append(validationErrors, err)
}
if err := validate.Slippage(params.Slippage, "slippage"); err != nil {
validationErrors = append(validationErrors, err)
}
validationErrors = validate.Parameter(params.ChainId, "chainId", validate.ChainID, validationErrors)
validationErrors = validate.Parameter(params.Src, "src", validate.EthereumAddress, validationErrors)
validationErrors = validate.Parameter(params.Dst, "dst", validate.EthereumAddress, validationErrors)
validationErrors = validate.Parameter(params.Amount, "amount", validate.BigInt, validationErrors)
validationErrors = validate.Parameter(params.From, "from", validate.EthereumAddress, validationErrors)
validationErrors = validate.Parameter(params.Slippage, "slippage", validate.Slippage, validationErrors)
if len(params.Src) > 0 && len(params.Dst) > 0 && params.Src == params.Dst {
validationErrors = append(validationErrors, errors.New("src and dst tokens must be different"))
}
return validate.AggregateValidationErorrs(validationErrors)
return validate.ConsolidateValidationErorrs(validationErrors)
}

type GetTokensParams struct {
Expand All @@ -172,8 +118,6 @@ type GetTokensParams struct {

func (params *GetTokensParams) Validate() error {
var validationErrors []error
if err := validate.ChainId(params.ChainId, "chainId"); err != nil {
validationErrors = append(validationErrors, err)
}
return validate.AggregateValidationErorrs(validationErrors)
validationErrors = validate.Parameter(params.ChainId, "chainId", validate.ChainID, validationErrors)
return validate.ConsolidateValidationErorrs(validationErrors)
}
2 changes: 1 addition & 1 deletion golang/client/validate/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ func NewParameterMissingError(variableName string) error {
return fmt.Errorf("config validation error '%s' is required in the request config", variableName)
}

func AggregateValidationErorrs(validationErrors []error) error {
func ConsolidateValidationErorrs(validationErrors []error) error {
if validationErrors == nil || len(validationErrors) == 0 {
return nil
}
Expand Down
Loading

0 comments on commit c22d8cd

Please sign in to comment.