Files
gocryptotrader/portfolio/withdraw/validate.go
Ryan O'Hara-Reid 4e828a8124 (Exchanges) Introduce validation method and small updates (#565)
* Remove pointer reference

* Fix portfolio withdraw tests

* Add nil protection in validator method to reduce prospective panics and for future outbound checking

* Updated tests

* ch order var to not ref package

* rm comparison

* Add order ID validation check

* Add exchange name validation check

* Add in test details

* fix tests

* fix linter issues

* linter issues strikes again

* linter rabbit hole

* Addr nitterinos

* Add validation variadic interface to define sets of functionality check POC

* didn't want to add an amount other than 0, didn't want to add address to exchange withdraw, didn't want to whitlist, can change if need be

* add coverage

* Add validation method options for exchange wrappers and abstracted validation into its own package

* Add validation code for structs in exchange template generation

* remove extra validation call as this is done in wrapper

* fix niterinos for examplerinos

* Add template to documentation tool and regenerated documentation

* Addr niticles

* Fix tests due to validation update

* Add more validation checks for modify/submit orders

* update tests

* fix more tests

* Add asset type to submit variable in tests and rpc call. Regen funcs.

* Add field to modify struct in tests

* applied field asset to cancel struct across project

* fix woopsy
2020-10-02 13:36:01 +10:00

90 lines
2.3 KiB
Go

package withdraw
import (
"errors"
"strings"
"github.com/thrasher-corp/gocryptotrader/currency"
"github.com/thrasher-corp/gocryptotrader/exchanges/validate"
"github.com/thrasher-corp/gocryptotrader/portfolio"
)
// Validate takes interface and passes to asset type to check the request meets requirements to submit
func (r *Request) Validate(opt ...validate.Checker) (err error) {
if r == nil {
return ErrRequestCannotBeNil
}
if r.Exchange == "" {
return ErrExchangeNameUnset
}
var allErrors []string
if r.Amount <= 0 {
allErrors = append(allErrors, ErrStrAmountMustBeGreaterThanZero)
}
if (r.Currency == currency.Code{}) {
allErrors = append(allErrors, ErrStrNoCurrencySet)
}
switch r.Type {
case Fiat:
if (r.Currency != currency.Code{}) && !r.Currency.IsFiatCurrency() {
allErrors = append(allErrors, ErrStrCurrencyNotFiat)
}
allErrors = append(allErrors, validateFiat(r)...)
case Crypto:
if (r.Currency != currency.Code{}) && !r.Currency.IsCryptocurrency() {
allErrors = append(allErrors, ErrStrCurrencyNotCrypto)
}
allErrors = append(allErrors, validateCrypto(r)...)
default:
allErrors = append(allErrors, "invalid request type")
}
for _, o := range opt {
if o == nil {
continue
}
err := o.Check()
if err != nil {
allErrors = append(allErrors, err.Error())
}
}
if len(allErrors) > 0 {
return errors.New(strings.Join(allErrors, ", "))
}
return nil
}
// validateFiat takes interface and passes to asset type to check the request meets requirements to submit
func validateFiat(request *Request) (err []string) {
errBank := request.Fiat.Bank.ValidateForWithdrawal(request.Exchange, request.Currency)
if errBank != nil {
err = append(err, errBank...)
}
return err
}
// validateCrypto checks if Crypto request is valid and meets the minimum requirements to submit a crypto withdrawal request
func validateCrypto(request *Request) (err []string) {
if !portfolio.IsWhiteListed(request.Crypto.Address) {
err = append(err, ErrStrAddressNotWhiteListed)
}
if !portfolio.IsExchangeSupported(request.Exchange, request.Crypto.Address) {
err = append(err, ErrStrExchangeNotSupportedByAddress)
}
if request.Crypto.Address == "" {
err = append(err, ErrStrAddressNotSet)
}
if request.Crypto.FeeAmount < 0 {
err = append(err, ErrStrFeeCannotBeNegative)
}
return
}