Fix: do not silently ignore assign NULL to *string

AssignTo can only assign NULL to a **string. Previous code tried to
assign nil to a *string, which did nothing. Correct behavior is to
detect this as an error.
pull/455/head
Jack Christensen 2018-09-01 18:40:42 -05:00
parent aa561b8f3c
commit 302c74f214
3 changed files with 13 additions and 7 deletions

View File

@ -72,14 +72,20 @@ func (dst *JSON) Get() interface{} {
func (src *JSON) AssignTo(dst interface{}) error { func (src *JSON) AssignTo(dst interface{}) error {
switch v := dst.(type) { switch v := dst.(type) {
case *string: case *string:
if src.Status != Present { if src.Status == Present {
v = nil
} else {
*v = string(src.Bytes) *v = string(src.Bytes)
} else {
return errors.Errorf("cannot assign non-present status to %T", dst)
} }
case **string: case **string:
*v = new(string) if src.Status == Present {
return src.AssignTo(*v) s := string(src.Bytes)
*v = &s
return nil
} else {
*v = nil
return nil
}
case *[]byte: case *[]byte:
if src.Status != Present { if src.Status != Present {
*v = nil *v = nil

View File

@ -129,7 +129,7 @@ func TestJSONAssignTo(t *testing.T) {
t.Errorf("%d: %v", i, err) t.Errorf("%d: %v", i, err)
} }
if *tt.dst == tt.expected { if *tt.dst != tt.expected {
t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, *tt.dst) t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, *tt.dst)
} }
} }

View File

@ -135,7 +135,7 @@ func TestJSONBAssignTo(t *testing.T) {
t.Errorf("%d: %v", i, err) t.Errorf("%d: %v", i, err)
} }
if *tt.dst == tt.expected { if *tt.dst != tt.expected {
t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, *tt.dst) t.Errorf("%d: expected %v to assign %v, but result was %v", i, tt.src, tt.expected, *tt.dst)
} }
} }