Skip to content

Commit

Permalink
Merge 4529e3b into b9b2581
Browse files Browse the repository at this point in the history
  • Loading branch information
jfbus committed Jul 24, 2020
2 parents b9b2581 + 4529e3b commit ea30d23
Show file tree
Hide file tree
Showing 7 changed files with 51 additions and 16 deletions.
2 changes: 1 addition & 1 deletion builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (
)

type builder interface {
build(fields []string) (formatter, error)
build(fields []string, prefix string) (formatter, error)
}

func makeBuilder(t reflect.Type) (builder, error) {
Expand Down
2 changes: 1 addition & 1 deletion format.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ func (f *Formatter) Format(o interface{}, fields []string) (interface{}, error)
ff := f.formatters[t][key]
if ff == nil {
var err error
ff, err = b.build(fields)
ff, err = b.build(fields, "")
if err != nil {
return nil, err
}
Expand Down
36 changes: 34 additions & 2 deletions format_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,33 @@ func TestFormat(t *testing.T) {
err string
}{
{
src: struct{ Foo int }{Foo: 1},
src: struct{ Foo int }{},
format: "bar",
err: "field 'bar' does not exist",
},
{
src: struct {
foo int
}{},
format: "foo",
err: "field 'foo' does not exist",
},
{
src: struct {
Foo int `json:"foo"`
}{},
format: "foo.bar",
err: "field 'foo.bar' does not exist",
},
{
src: struct {
Foo struct {
Bar int `json:"bar"`
} `json:"foo"`
}{},
format: "foo.baz",
err: "field 'foo.baz' does not exist",
},
{
src: struct{ Foo int }{Foo: 1},
format: "",
Expand Down Expand Up @@ -68,6 +91,15 @@ func TestFormat(t *testing.T) {
format: "foo",
output: `{"foo":1}`,
},
{
src: struct {
Foo int `json:"foo"`
Bar string `json:"bar"`
Baz int `json:"-"`
}{Foo: 1, Bar: "bar", Baz: 2},
format: "foo",
output: `{"foo":1}`,
},
{
src: struct {
Foo int `json:"foo"`
Expand Down Expand Up @@ -345,7 +377,7 @@ func TestFormat(t *testing.T) {
o, err := f.Format(tt.src, fields)
if tt.err != "" {
if err == nil {
t.Fail()
t.FailNow()
}
if tt.err != err.Error() {
t.Errorf("Returned error '%v', expected '%s'", err, tt.err)
Expand Down
4 changes: 2 additions & 2 deletions pointer.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ type pointerBuilder struct {
elem *structBuilder
}

func (b *pointerBuilder) build(fields []string) (formatter, error) {
ef, err := b.elem.build(fields)
func (b *pointerBuilder) build(fields []string, prefix string) (formatter, error) {
ef, err := b.elem.build(fields, prefix)
if err != nil {
return nil, err
}
Expand Down
10 changes: 8 additions & 2 deletions primitive.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package dynjson

import "reflect"
import (
"fmt"
"reflect"
)

type primitiveFormatter struct {
t reflect.Type
Expand All @@ -18,7 +21,10 @@ type primitiveBuilder struct {
t reflect.Type
}

func (b *primitiveBuilder) build(fields []string) (formatter, error) {
func (b *primitiveBuilder) build(fields []string, prefix string) (formatter, error) {
if len(fields) > 0 {
return nil, fmt.Errorf("field '%s' does not exist", prefix+fields[0])
}
return &primitiveFormatter{t: b.t}, nil
}

Expand Down
4 changes: 2 additions & 2 deletions slice.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ type sliceBuilder struct {
elem *structBuilder
}

func (b *sliceBuilder) build(fields []string) (formatter, error) {
et, err := b.elem.build(fields)
func (b *sliceBuilder) build(fields []string, prefix string) (formatter, error) {
et, err := b.elem.build(fields, prefix)
if err != nil {
return nil, err
}
Expand Down
9 changes: 3 additions & 6 deletions struct.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ type structBuilder struct {
fields map[string]reflect.StructField
}

func (b *structBuilder) build(fields []string) (formatter, error) {
func (b *structBuilder) build(fields []string, prefix string) (formatter, error) {
if len(fields) == 0 {
return &primitiveFormatter{t: b.t}, nil
}
Expand All @@ -66,9 +66,9 @@ func (b *structBuilder) build(fields []string) (formatter, error) {
}
subb := b.builders[field]
if subb == nil {
return nil, fmt.Errorf("field '%s' does not exist", field)
return nil, fmt.Errorf("field '%s' does not exist", prefix+field)
}
fmter, err := subb.build(subfields)
fmter, err := subb.build(subfields, prefix+field+".")
if err != nil {
return nil, err
}
Expand All @@ -90,9 +90,6 @@ func (b *structBuilder) build(fields []string) (formatter, error) {
}

func makeStructBuilder(t reflect.Type) (*structBuilder, error) {
if t.Kind() != reflect.Struct {
return nil, fmt.Errorf("%s is not a struct", t.Name())
}
sb := structBuilder{
t: t,
builders: map[string]builder{},
Expand Down

0 comments on commit ea30d23

Please sign in to comment.