package model import ( "encoding/json" "fmt" "github.com/tech/sendico/pkg/merrors" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" ) type PaymentType int const ( PaymentTypeIban PaymentType = iota PaymentTypeCard PaymentTypeCardToken PaymentTypeBankAccount PaymentTypeWallet PaymentTypeCryptoAddress ) var paymentTypeToString = map[PaymentType]string{ PaymentTypeIban: "iban", PaymentTypeCard: "card", PaymentTypeCardToken: "cardToken", PaymentTypeBankAccount: "bankAccount", PaymentTypeWallet: "wallet", PaymentTypeCryptoAddress: "cryptoAddress", } var paymentTypeFromString = map[string]PaymentType{ "iban": PaymentTypeIban, "card": PaymentTypeCard, "cardToken": PaymentTypeCardToken, "bankAccount": PaymentTypeBankAccount, "wallet": PaymentTypeWallet, "cryptoAddress": PaymentTypeCryptoAddress, } func (t PaymentType) String() string { if v, ok := paymentTypeToString[t]; ok { return v } return "iban" } func (t PaymentType) MarshalJSON() ([]byte, error) { return json.Marshal(t.String()) } func (t *PaymentType) UnmarshalJSON(data []byte) error { var val string if err := json.Unmarshal(data, &val); err != nil { return err } v, ok := paymentTypeFromString[val] if !ok { return merrors.InvalidArgument(fmt.Sprintf("unknown PaymentType: %q", val)) } *t = v return nil } type PaymentMethod struct { PermissionBound `bson:",inline" json:",inline"` RecipientRef primitive.ObjectID `bson:"recipientRef" json:"recipientRef"` Type PaymentType `bson:"type" json:"type"` Data bson.Raw `bson:"data" json:"data"` }