diff --git a/server/ctrlsubsonic/params/params.go b/server/ctrlsubsonic/params/params.go index 2742122..2cd7ed0 100644 --- a/server/ctrlsubsonic/params/params.go +++ b/server/ctrlsubsonic/params/params.go @@ -1,6 +1,6 @@ package params -// {get, get first, get or} * {str, int, id} * {list, not list} = 18 +// {get, get first, get or} * {str, int, id, bool} * {list, not list} = 24 funcs import ( "errors" @@ -15,6 +15,7 @@ var ( ErrKeyNotFound = errors.New("key(s) not found") ErrIDInvalid = errors.New("invalid id") ErrIDNotAnInt = errors.New("not an int") + ErrIDNotABool = errors.New("not an bool") ) const IDSeparator = "-" @@ -51,6 +52,8 @@ func parse(values []string, i interface{}) error { *v, err = parseInt(values[0]) case *ID: *v, err = parseID(values[0]) + case *bool: + *v, err = parseBool(values[0]) case *[]string: for _, val := range values { parsed, err := parseStr(val) @@ -75,6 +78,14 @@ func parse(values []string, i interface{}) error { } *v = append(*v, parsed) } + case *[]bool: + for _, val := range values { + parsed, err := parseBool(val) + if err != nil { + return err + } + *v = append(*v, parsed) + } } return err } @@ -114,6 +125,13 @@ func parseID(in string) (ID, error) { return ID{}, ErrIDInvalid } +func parseBool(in string) (bool, error) { + if v, err := strconv.ParseBool(in); err == nil { + return v, nil + } + return false, ErrIDNotABool +} + type Params url.Values func New(r *http.Request) Params { @@ -228,6 +246,11 @@ func (p Params) GetID(key string) (ID, error) { return ret, parse(p.get(key), &ret) } +func (p Params) GetIDDefault() (ID, error) { + var ret ID + return ret, parse(p.get("id"), &ret) +} + func (p Params) GetFirstID(keys ...string) (ID, error) { var ret ID return ret, parse(p.getFirst(keys), &ret) @@ -260,3 +283,43 @@ func (p Params) GetOrIDList(key string, or []ID) []ID { } return or } + +// ** begin bool {get, get first, get or} + +func (p Params) GetBool(key string) (bool, error) { + var ret bool + return ret, parse(p.get(key), &ret) +} + +func (p Params) GetFirstBool(keys ...string) (bool, error) { + var ret bool + return ret, parse(p.getFirst(keys), &ret) +} + +func (p Params) GetOrBool(key string, or bool) bool { + var ret bool + if err := parse(p.get(key), &ret); err == nil { + return ret + } + return or +} + +// ** begin []bool {get, get first, get or} + +func (p Params) GetBoolList(key string) ([]bool, error) { + var ret []bool + return ret, parse(p.get(key), &ret) +} + +func (p Params) GetFirstBoolList(keys ...string) ([]bool, error) { + var ret []bool + return ret, parse(p.getFirst(keys), &ret) +} + +func (p Params) GetOrBoolList(key string, or []bool) []bool { + var ret []bool + if err := parse(p.get(key), &ret); err == nil { + return ret + } + return or +} diff --git a/server/ctrlsubsonic/params/params_test.go b/server/ctrlsubsonic/params/params_test.go index cede1ae..1f23944 100644 --- a/server/ctrlsubsonic/params/params_test.go +++ b/server/ctrlsubsonic/params/params_test.go @@ -35,21 +35,27 @@ func TestParseID(t *testing.T) { } // TODO? -func TestGet(t *testing.T) {} -func TestGetFirst(t *testing.T) {} -func TestGetOr(t *testing.T) {} -func TestGetList(t *testing.T) {} -func TestGetFirstList(t *testing.T) {} -func TestGetOrList(t *testing.T) {} -func TestGetInt(t *testing.T) {} -func TestGetFirstInt(t *testing.T) {} -func TestGetOrInt(t *testing.T) {} -func TestGetIntList(t *testing.T) {} -func TestGetFirstIntList(t *testing.T) {} -func TestGetOrIntList(t *testing.T) {} -func TestGetID(t *testing.T) {} -func TestGetFirstID(t *testing.T) {} -func TestGetOrID(t *testing.T) {} -func TestGetIDList(t *testing.T) {} -func TestGetFirstIDList(t *testing.T) {} -func TestGetOrIDList(t *testing.T) {} +func TestGet(t *testing.T) {} +func TestGetFirst(t *testing.T) {} +func TestGetOr(t *testing.T) {} +func TestGetList(t *testing.T) {} +func TestGetFirstList(t *testing.T) {} +func TestGetOrList(t *testing.T) {} +func TestGetInt(t *testing.T) {} +func TestGetFirstInt(t *testing.T) {} +func TestGetOrInt(t *testing.T) {} +func TestGetIntList(t *testing.T) {} +func TestGetFirstIntList(t *testing.T) {} +func TestGetOrIntList(t *testing.T) {} +func TestGetID(t *testing.T) {} +func TestGetFirstID(t *testing.T) {} +func TestGetOrID(t *testing.T) {} +func TestGetIDList(t *testing.T) {} +func TestGetFirstIDList(t *testing.T) {} +func TestGetOrIDList(t *testing.T) {} +func TestGetBool(t *testing.T) {} +func TestGetFirstBool(t *testing.T) {} +func TestGetOrBool(t *testing.T) {} +func TestGetBoolList(t *testing.T) {} +func TestGetFirstBoolList(t *testing.T) {} +func TestGetOrBoolList(t *testing.T) {}