mirror of
https://github.com/alicebob/miniredis.git
synced 2024-07-21 14:03:53 +08:00
42c2a2c1e0
Splits out the opts parsing for some complex cases, to avoid duplicate error logic. And easier testing.
61 lines
1.2 KiB
Go
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
|
|
}
|