diff --git a/server/ctrlsubsonic/params/params.go b/server/ctrlsubsonic/params/params.go index 2cd7ed0..1acef90 100644 --- a/server/ctrlsubsonic/params/params.go +++ b/server/ctrlsubsonic/params/params.go @@ -1,6 +1,28 @@ -package params +// package params provides methods on url.Values for parsing params for the subsonic api +// +// the format of the functions are: +// `Get[First|Or|FirstOr][Int|ID|Bool][List]` +// +// first component (key selection): +// "" -> lookup the key as usual, err if not found +// "First" -> lookup from a list of possible keys, err if none found +// "Or" -> lookup the key as usual, return `or` if not found +// "FirstOr" -> lookup from a list of possible keys, return `or` if not found +// +// second component (type selection): +// "" -> parse the value as a string +// "Int" -> parse the value as an integer +// "ID" -> parse the value as an artist, track, album etc id +// "Bool" -> parse the value as a boolean +// +// last component (list parsing with stacked keys, eg. `?a=1&a=2&a=3`): +// "" -> return the first value, eg. `1` +// "List" -> return all values, eg. `{1, 2, 3}` +// +// note: these bulk of these funcs were generated with vim macros, so let me know if +// you see something wrong :) -// {get, get first, get or} * {str, int, id, bool} * {list, not list} = 24 funcs +package params import ( "errors" @@ -159,7 +181,7 @@ func (p Params) getFirst(keys []string) []string { return nil } -// ** begin str {get, get first, get or} +// ** begin str {get, get first, get or, get first or} func (p Params) Get(key string) (string, error) { var ret string @@ -179,7 +201,15 @@ func (p Params) GetOr(key string, or string) string { return or } -// ** begin []str {get, get first, get or} +func (p Params) GetFirstOr(or string, keys ...string) string { + var ret string + if err := parse(p.getFirst(keys), &ret); err == nil { + return ret + } + return or +} + +// ** begin []str {get, get first, get or, get first or} func (p Params) GetList(key string) ([]string, error) { var ret []string @@ -199,7 +229,15 @@ func (p Params) GetOrList(key string, or []string) []string { return or } -// ** begin int {get, get first, get or} +func (p Params) GetFirstOrList(or []string, keys ...string) []string { + var ret []string + if err := parse(p.getFirst(keys), &ret); err == nil { + return ret + } + return or +} + +// ** begin int {get, get first, get or, get first or} func (p Params) GetInt(key string) (int, error) { var ret int @@ -219,7 +257,15 @@ func (p Params) GetOrInt(key string, or int) int { return or } -// ** begin []int {get, get first, get or} +func (p Params) GetFirstOrInt(or int, keys ...string) int { + var ret int + if err := parse(p.getFirst(keys), &ret); err == nil { + return ret + } + return or +} + +// ** begin []int {get, get first, get or, get first or} func (p Params) GetIntList(key string) ([]int, error) { var ret []int @@ -239,7 +285,15 @@ func (p Params) GetOrIntList(key string, or []int) []int { return or } -// ** begin ID {get, get first, get or} +func (p Params) GetFirstOrIntList(or []int, keys ...string) []int { + var ret []int + if err := parse(p.getFirst(keys), &ret); err == nil { + return ret + } + return or +} + +// ** begin ID {get, get first, get or, get first or} func (p Params) GetID(key string) (ID, error) { var ret ID @@ -264,7 +318,15 @@ func (p Params) GetOrID(key string, or ID) ID { return or } -// ** begin []ID {get, get first, get or} +func (p Params) GetFirstOrID(or ID, keys ...string) ID { + var ret ID + if err := parse(p.getFirst(keys), &ret); err == nil { + return ret + } + return or +} + +// ** begin []ID {get, get first, get or, get first or} func (p Params) GetIDList(key string) ([]ID, error) { var ret []ID @@ -284,7 +346,15 @@ func (p Params) GetOrIDList(key string, or []ID) []ID { return or } -// ** begin bool {get, get first, get or} +func (p Params) GetFirstOrIDList(or []ID, keys ...string) []ID { + var ret []ID + if err := parse(p.getFirst(keys), &ret); err == nil { + return ret + } + return or +} + +// ** begin bool {get, get first, get or, get first or} func (p Params) GetBool(key string) (bool, error) { var ret bool @@ -304,7 +374,15 @@ func (p Params) GetOrBool(key string, or bool) bool { return or } -// ** begin []bool {get, get first, get or} +func (p Params) GetFirstOrBool(or bool, keys ...string) bool { + var ret bool + if err := parse(p.getFirst(keys), &ret); err == nil { + return ret + } + return or +} + +// ** begin []bool {get, get first, get or, get first or} func (p Params) GetBoolList(key string) ([]bool, error) { var ret []bool @@ -323,3 +401,11 @@ func (p Params) GetOrBoolList(key string, or []bool) []bool { } return or } + +func (p Params) GetFirstOrBoolList(or []bool, keys ...string) []bool { + var ret []bool + if err := parse(p.getFirst(keys), &ret); err == nil { + return ret + } + return or +}