miniredis/opts.go
Harmen 42c2a2c1e0
arg parse cleanup (#360)
Splits out the opts parsing for some complex cases, to avoid duplicate error logic. And easier testing.
2024-03-23 09:08:16 +01:00

61 lines
1.2 KiB
Go

package miniredis
import (
"errors"
"math"
"strconv"
"time"
"github.com/alicebob/miniredis/v2/server"
)
// optInt parses an int option in a command.
// Writes "invalid integer" error to c if it's not a valid integer. Returns
// whether or not things were okay.
func optInt(c *server.Peer, src string, dest *int) bool {
return optIntErr(c, src, dest, msgInvalidInt)
}
func optIntErr(c *server.Peer, src string, dest *int, errMsg string) bool {
n, err := strconv.Atoi(src)
if err != nil {
setDirty(c)
c.WriteError(errMsg)
return false
}
*dest = n
return true
}
// optIntSimple sets dest or returns an error
func optIntSimple(src string, dest *int) error {
n, err := strconv.Atoi(src)
if err != nil {
return errors.New(msgInvalidInt)
}
*dest = n
return nil
}
func optDuration(c *server.Peer, src string, dest *time.Duration) bool {
n, err := strconv.ParseFloat(src, 64)
if err != nil {
setDirty(c)
c.WriteError(msgInvalidTimeout)
return false
}
if n < 0 {
setDirty(c)
c.WriteError(msgTimeoutNegative)
return false
}
if math.IsInf(n, 0) {
setDirty(c)
c.WriteError(msgTimeoutIsOutOfRange)
return false
}
*dest = time.Duration(n*1_000_000) * time.Microsecond
return true
}