You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
2.0 KiB
62 lines
2.0 KiB
package query
|
|
|
|
import (
|
|
"fmt"
|
|
"net/url"
|
|
)
|
|
|
|
// Array represents the encoding of Query lists and sets. A Query array is a
|
|
// representation of a list of values of a fixed type. A serialized array might
|
|
// look like the following:
|
|
//
|
|
// ListName.member.1=foo
|
|
// &ListName.member.2=bar
|
|
// &Listname.member.3=baz
|
|
type Array struct {
|
|
// The query values to add the array to.
|
|
values url.Values
|
|
// The array's prefix, which includes the names of all parent structures
|
|
// and ends with the name of the list. For example, the prefix might be
|
|
// "ParentStructure.ListName". This prefix will be used to form the full
|
|
// keys for each element in the list. For example, an entry might have the
|
|
// key "ParentStructure.ListName.member.MemberName.1".
|
|
//
|
|
// While this is currently represented as a string that gets added to, it
|
|
// could also be represented as a stack that only gets condensed into a
|
|
// string when a finalized key is created. This could potentially reduce
|
|
// allocations.
|
|
prefix string
|
|
// Whether the list is flat or not. A list that is not flat will produce the
|
|
// following entry to the url.Values for a given entry:
|
|
// ListName.MemberName.1=value
|
|
// A list that is flat will produce the following:
|
|
// ListName.1=value
|
|
flat bool
|
|
// The location name of the member. In most cases this should be "member".
|
|
memberName string
|
|
// Elements are stored in values, so we keep track of the list size here.
|
|
size int32
|
|
}
|
|
|
|
func newArray(values url.Values, prefix string, flat bool, memberName string) *Array {
|
|
return &Array{
|
|
values: values,
|
|
prefix: prefix,
|
|
flat: flat,
|
|
memberName: memberName,
|
|
}
|
|
}
|
|
|
|
// Value adds a new element to the Query Array. Returns a Value type used to
|
|
// encode the array element.
|
|
func (a *Array) Value() Value {
|
|
// Query lists start a 1, so adjust the size first
|
|
a.size++
|
|
prefix := a.prefix
|
|
if !a.flat {
|
|
prefix = fmt.Sprintf("%s.%s", prefix, a.memberName)
|
|
}
|
|
// Lists can't have flat members
|
|
return newValue(a.values, fmt.Sprintf("%s.%d", prefix, a.size), false)
|
|
}
|