gorilla/schema

[Question] Form encoding/decoding ignores slice of struct

tommysalt opened this issue · 4 comments

Current Behavior

When encoding/decoding from data with slices of custom structs, they are ignored even thought the examples mention:

[...]
struct
[...]
a slice or a pointer to a slice of one of the above types

Output:

map[name:[Name]]

Expected Behavior

Output:

map[name:[Name], id:[1 2], amount:[1 2]

Steps To Reproduce

var encoder = schema.NewEncoder()

type Position struct {
	ID     int64 `schema:"id"`
	Amount int64 `schema:"amount"`
}

type Document struct {
	Name      string     `schema:"name"`
	Positions []Position `schema:"position"`
}

func main() {
	person := Document{"Name", []Position{{1, 1}, {2, 2}}}
	form := url.Values{}

	encoder.Encode(person, form)

	fmt.Println(form)
}

Output:

map[name:[Name]]

I added an if to catch the error and it seems it's missing an encoder.

	err := encoder.Encode(person, form)
	if err != nil {
		fmt.Println(err)
	}
schema: encoder not found for [{1 1} {2 2}]

So it seems that it's not a bug but I find the behavior rather odd because if I follow the docs they mention

[...]
struct
[...]
a slice or a pointer to a slice of one of the above types

So why do I need a custom encoder/decoder even tho my struct only contains supported fields (int64)?

That's a great question @tommysalt thanks for bringing this to our attention. I'm not sure what the answer is right now but I'll try to answer it in the near future.