mirror of
https://github.com/retailcrm/api-client-go.git
synced 2024-11-22 04:46:03 +03:00
fix order[items][][properties][]
unmarshaling for empty values
This commit is contained in:
commit
8cfe7034e6
@ -92,6 +92,40 @@ func (p *OrderPayments) UnmarshalJSON(data []byte) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *Properties) UnmarshalJSON(data []byte) error {
|
||||||
|
var i interface{}
|
||||||
|
var m Properties
|
||||||
|
if err := json.Unmarshal(data, &i); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
switch e := i.(type) {
|
||||||
|
case map[string]interface{}:
|
||||||
|
m = make(Properties, len(e))
|
||||||
|
for idx, val := range e {
|
||||||
|
var res Property
|
||||||
|
err := unmarshalMap(val.(map[string]interface{}), &res)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
m[idx] = res
|
||||||
|
}
|
||||||
|
case []interface{}:
|
||||||
|
m = make(Properties, len(e))
|
||||||
|
for idx, val := range e {
|
||||||
|
var res Property
|
||||||
|
err := unmarshalMap(val.(map[string]interface{}), &res)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
m[strconv.Itoa(idx)] = res
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*p = m
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func unmarshalMap(m map[string]interface{}, v interface{}) (err error) {
|
func unmarshalMap(m map[string]interface{}, v interface{}) (err error) {
|
||||||
var data []byte
|
var data []byte
|
||||||
data, err = json.Marshal(m)
|
data, err = json.Marshal(m)
|
||||||
|
@ -38,6 +38,9 @@ func TestAPIErrorsList_UnmarshalJSON(t *testing.T) {
|
|||||||
assert.Len(t, list, 2)
|
assert.Len(t, list, 2)
|
||||||
assert.Equal(t, list["a"], "first")
|
assert.Equal(t, list["a"], "first")
|
||||||
assert.Equal(t, list["b"], "second")
|
assert.Equal(t, list["b"], "second")
|
||||||
|
|
||||||
|
require.NoError(t, json.Unmarshal([]byte(`[]`), &list))
|
||||||
|
assert.Len(t, list, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCustomFieldsList_UnmarshalJSON(t *testing.T) {
|
func TestCustomFieldsList_UnmarshalJSON(t *testing.T) {
|
||||||
@ -52,6 +55,9 @@ func TestCustomFieldsList_UnmarshalJSON(t *testing.T) {
|
|||||||
assert.Len(t, list, 2)
|
assert.Len(t, list, 2)
|
||||||
assert.Equal(t, list["a"], "first")
|
assert.Equal(t, list["a"], "first")
|
||||||
assert.Equal(t, list["b"], "second")
|
assert.Equal(t, list["b"], "second")
|
||||||
|
|
||||||
|
require.NoError(t, json.Unmarshal([]byte(`[]`), &list))
|
||||||
|
assert.Len(t, list, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestOrderPayments_UnmarshalJSON(t *testing.T) {
|
func TestOrderPayments_UnmarshalJSON(t *testing.T) {
|
||||||
@ -66,4 +72,24 @@ func TestOrderPayments_UnmarshalJSON(t *testing.T) {
|
|||||||
assert.Len(t, list, 2)
|
assert.Len(t, list, 2)
|
||||||
assert.Equal(t, list["a"], OrderPayment{ID: 1})
|
assert.Equal(t, list["a"], OrderPayment{ID: 1})
|
||||||
assert.Equal(t, list["b"], OrderPayment{ID: 2})
|
assert.Equal(t, list["b"], OrderPayment{ID: 2})
|
||||||
|
|
||||||
|
require.NoError(t, json.Unmarshal([]byte(`[]`), &list))
|
||||||
|
assert.Len(t, list, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestProperties_UnmarshalJSON(t *testing.T) {
|
||||||
|
var list Properties
|
||||||
|
|
||||||
|
require.NoError(t, json.Unmarshal([]byte(`[{"code": "first"}, {"code": "second"}]`), &list))
|
||||||
|
assert.Len(t, list, 2)
|
||||||
|
assert.Equal(t, list["0"], Property{Code: "first"})
|
||||||
|
assert.Equal(t, list["1"], Property{Code: "second"})
|
||||||
|
|
||||||
|
require.NoError(t, json.Unmarshal([]byte(`{"a": {"code": "first"}, "b": {"code": "second"}}`), &list))
|
||||||
|
assert.Len(t, list, 2)
|
||||||
|
assert.Equal(t, list["a"], Property{Code: "first"})
|
||||||
|
assert.Equal(t, list["b"], Property{Code: "second"})
|
||||||
|
|
||||||
|
require.NoError(t, json.Unmarshal([]byte(`[]`), &list))
|
||||||
|
assert.Len(t, list, 0)
|
||||||
}
|
}
|
||||||
|
3
types.go
3
types.go
@ -275,6 +275,7 @@ Order related types
|
|||||||
|
|
||||||
type OrderPayments map[string]OrderPayment
|
type OrderPayments map[string]OrderPayment
|
||||||
type StringMap map[string]string
|
type StringMap map[string]string
|
||||||
|
type Properties map[string]Property
|
||||||
|
|
||||||
// Order type.
|
// Order type.
|
||||||
type Order struct {
|
type Order struct {
|
||||||
@ -456,7 +457,7 @@ type OrderItem struct {
|
|||||||
Comment string `json:"comment,omitempty"`
|
Comment string `json:"comment,omitempty"`
|
||||||
IsCanceled bool `json:"isCanceled,omitempty"`
|
IsCanceled bool `json:"isCanceled,omitempty"`
|
||||||
Offer Offer `json:"offer,omitempty"`
|
Offer Offer `json:"offer,omitempty"`
|
||||||
Properties map[string]Property `json:"properties,omitempty"`
|
Properties Properties `json:"properties,omitempty"`
|
||||||
PriceType *PriceType `json:"priceType,omitempty"`
|
PriceType *PriceType `json:"priceType,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user