|
|
package param
|
|
|
|
|
|
import (
|
|
|
"fmt"
|
|
|
"reflect"
|
|
|
)
|
|
|
|
|
|
// TypeError is an error type returned when param has difficulty deserializing a
|
|
|
// parameter value.
|
|
|
type TypeError struct {
|
|
|
// The key that was in error.
|
|
|
Key string
|
|
|
// The type that was expected.
|
|
|
Type reflect.Type
|
|
|
// The underlying error produced as part of the deserialization process,
|
|
|
// if one exists.
|
|
|
Err error
|
|
|
}
|
|
|
|
|
|
func (t TypeError) Error() string {
|
|
|
return fmt.Sprintf("param: error parsing key %q as %v: %v", t.Key, t.Type,
|
|
|
t.Err)
|
|
|
}
|
|
|
|
|
|
// SingletonError is an error type returned when a parameter is passed multiple
|
|
|
// times when only a single value is expected. For example, for a struct with
|
|
|
// integer field "foo", "foo=1&foo=2" will return a SingletonError with key
|
|
|
// "foo".
|
|
|
type SingletonError struct {
|
|
|
// The key that was in error.
|
|
|
Key string
|
|
|
// The type that was expected for that key.
|
|
|
Type reflect.Type
|
|
|
// The list of values that were provided for that key.
|
|
|
Values []string
|
|
|
}
|
|
|
|
|
|
func (s SingletonError) Error() string {
|
|
|
return fmt.Sprintf("param: error parsing key %q: expected single "+
|
|
|
"value but was given %d: %v", s.Key, len(s.Values), s.Values)
|
|
|
}
|
|
|
|
|
|
// NestingError is an error type returned when a key is nested when the target
|
|
|
// type does not support nesting of the given type. For example, deserializing
|
|
|
// the parameter key "anint[foo]" into a struct that defines an integer param
|
|
|
// "anint" will produce a NestingError with key "anint" and nesting "[foo]".
|
|
|
type NestingError struct {
|
|
|
// The portion of the key that was correctly parsed into a value.
|
|
|
Key string
|
|
|
// The type of the key that was invalidly nested on.
|
|
|
Type reflect.Type
|
|
|
// The portion of the key that could not be parsed due to invalid
|
|
|
// nesting.
|
|
|
Nesting string
|
|
|
}
|
|
|
|
|
|
func (n NestingError) Error() string {
|
|
|
return fmt.Sprintf("param: error parsing key %q: invalid nesting "+
|
|
|
"%q on %s key %q", n.Key+n.Nesting, n.Nesting, n.Type, n.Key)
|
|
|
}
|
|
|
|
|
|
// SyntaxErrorSubtype describes what sort of syntax error was encountered.
|
|
|
type SyntaxErrorSubtype int
|
|
|
|
|
|
const (
|
|
|
MissingOpeningBrace SyntaxErrorSubtype = iota + 1
|
|
|
MissingClosingBrace
|
|
|
)
|
|
|
|
|
|
// SyntaxError is an error type returned when a key is incorrectly formatted.
|
|
|
type SyntaxError struct {
|
|
|
// The key for which there was a syntax error.
|
|
|
Key string
|
|
|
// The subtype of the syntax error, which describes what sort of error
|
|
|
// was encountered.
|
|
|
Subtype SyntaxErrorSubtype
|
|
|
// The part of the key (generally the suffix) that was in error.
|
|
|
ErrorPart string
|
|
|
}
|
|
|
|
|
|
func (s SyntaxError) Error() string {
|
|
|
prefix := fmt.Sprintf("param: syntax error while parsing key %q: ",
|
|
|
s.Key)
|
|
|
|
|
|
switch s.Subtype {
|
|
|
case MissingOpeningBrace:
|
|
|
return prefix + fmt.Sprintf("expected opening brace, got %q",
|
|
|
s.ErrorPart)
|
|
|
case MissingClosingBrace:
|
|
|
return prefix + fmt.Sprintf("expected closing brace in %q",
|
|
|
s.ErrorPart)
|
|
|
default:
|
|
|
panic("switch is not exhaustive!")
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// KeyError is an error type returned when an unknown field is set on a struct.
|
|
|
type KeyError struct {
|
|
|
// The full key that was in error.
|
|
|
FullKey string
|
|
|
// The key of the struct that did not have the given field.
|
|
|
Key string
|
|
|
// The type of the struct that did not have the given field.
|
|
|
Type reflect.Type
|
|
|
// The name of the field which was not present.
|
|
|
Field string
|
|
|
}
|
|
|
|
|
|
func (k KeyError) Error() string {
|
|
|
return fmt.Sprintf("param: error parsing key %q: unknown field %q on "+
|
|
|
"struct %q of type %v", k.FullKey, k.Field, k.Key, k.Type)
|
|
|
}
|