mirror of
https://github.com/yusing/godoxy.git
synced 2025-05-20 12:42:34 +02:00
56 lines
1 KiB
Go
56 lines
1 KiB
Go
package accesslog
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"github.com/yusing/go-proxy/internal/gperr"
|
|
"github.com/yusing/go-proxy/internal/utils/strutils"
|
|
)
|
|
|
|
type Retention struct {
|
|
Days uint64 `json:"days"`
|
|
Last uint64 `json:"last"`
|
|
}
|
|
|
|
var (
|
|
ErrInvalidSyntax = gperr.New("invalid syntax")
|
|
ErrZeroValue = gperr.New("zero value")
|
|
)
|
|
|
|
var defaultChunkSize = 64 * 1024 // 64KB
|
|
|
|
// Syntax:
|
|
//
|
|
// <N> days|weeks|months
|
|
//
|
|
// last <N>
|
|
//
|
|
// Parse implements strutils.Parser.
|
|
func (r *Retention) Parse(v string) (err error) {
|
|
split := strutils.SplitSpace(v)
|
|
if len(split) != 2 {
|
|
return ErrInvalidSyntax.Subject(v)
|
|
}
|
|
switch split[0] {
|
|
case "last":
|
|
r.Last, err = strconv.ParseUint(split[1], 10, 64)
|
|
default: // <N> days|weeks|months
|
|
r.Days, err = strconv.ParseUint(split[0], 10, 64)
|
|
if err != nil {
|
|
return
|
|
}
|
|
switch split[1] {
|
|
case "days":
|
|
case "weeks":
|
|
r.Days *= 7
|
|
case "months":
|
|
r.Days *= 30
|
|
default:
|
|
return ErrInvalidSyntax.Subject("unit " + split[1])
|
|
}
|
|
}
|
|
if r.Days == 0 && r.Last == 0 {
|
|
return ErrZeroValue
|
|
}
|
|
return
|
|
}
|