params: add time helper

This commit is contained in:
sentriz
2021-10-13 06:28:19 +01:00
parent 82d8a57aab
commit df85d82137

View File

@@ -1,7 +1,7 @@
// package params provides methods on url.Values for parsing params for the subsonic api // package params provides methods on url.Values for parsing params for the subsonic api
// //
// the format of the functions are: // the format of the functions are:
// `Get[First|Or|FirstOr][Int|ID|Bool][List]` // `Get[First|Or|FirstOr][Int|ID|Bool|TimeMs][List]`
// //
// first component (key selection): // first component (key selection):
// "" -> lookup the key as usual, err if not found // "" -> lookup the key as usual, err if not found
@@ -29,6 +29,7 @@ import (
"net/http" "net/http"
"net/url" "net/url"
"strconv" "strconv"
"time"
"go.senan.xyz/gonic/server/ctrlsubsonic/specid" "go.senan.xyz/gonic/server/ctrlsubsonic/specid"
) )
@@ -44,6 +45,15 @@ func parseInt(in string) (int, error) { return strconv.Atoi(in) }
func parseID(in string) (specid.ID, error) { return specid.New(in) } func parseID(in string) (specid.ID, error) { return specid.New(in) }
func parseBool(in string) (bool, error) { return strconv.ParseBool(in) } func parseBool(in string) (bool, error) { return strconv.ParseBool(in) }
func parseTime(in string) (time.Time, error) {
ms, err := strconv.Atoi(in)
if err != nil {
return time.Time{}, err
}
ns := int64(ms) * 1e6
return time.Unix(0, ns), nil
}
func parse(values []string, i interface{}) error { func parse(values []string, i interface{}) error {
if len(values) == 0 { if len(values) == 0 {
return ErrNoValues return ErrNoValues
@@ -59,6 +69,8 @@ func parse(values []string, i interface{}) error {
*v, err = parseID(values[0]) *v, err = parseID(values[0])
case *bool: case *bool:
*v, err = parseBool(values[0]) *v, err = parseBool(values[0])
case *time.Time:
*v, err = parseTime(values[0])
// ** begin *[]T // ** begin *[]T
case *[]string: case *[]string:
for _, value := range values { for _, value := range values {
@@ -92,6 +104,14 @@ func parse(values []string, i interface{}) error {
} }
*v = append(*v, parsed) *v = append(*v, parsed)
} }
case *[]time.Time:
for _, value := range values {
parsed, err := parseTime(value)
if err != nil {
return err
}
*v = append(*v, parsed)
}
} }
return err return err
} }
@@ -346,3 +366,31 @@ func (p Params) GetFirstOrBoolList(or []bool, keys ...string) []bool {
} }
return or return or
} }
// ** begin time {get, get first, get or, get first or}
func (p Params) GetTime(key string) (time.Time, error) {
var ret time.Time
return ret, parse(p.get(key), &ret)
}
func (p Params) GetFirstTime(keys ...string) (time.Time, error) {
var ret time.Time
return ret, parse(p.getFirst(keys), &ret)
}
func (p Params) GetOrTime(key string, or time.Time) time.Time {
var ret time.Time
if err := parse(p.get(key), &ret); err == nil {
return ret
}
return or
}
func (p Params) GetFirstOrTime(or time.Time, keys ...string) time.Time {
var ret time.Time
if err := parse(p.getFirst(keys), &ret); err == nil {
return ret
}
return or
}