ae3963e4b4
Before this change options were read and set in native format. This means for example nanoseconds for durations or an integer for enumerated types, which isn't very convenient for humans. This change enables these types to be set with a string with the syntax as used in the command line instead, so `"10s"` rather than `10000000000` or `"DEBUG"` rather than `8` for log level.
60 lines
1.3 KiB
Go
60 lines
1.3 KiB
Go
package fs
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// CutoffMode describes the possible delete modes in the config
|
|
type CutoffMode byte
|
|
|
|
// MaxTransferMode constants
|
|
const (
|
|
CutoffModeHard CutoffMode = iota
|
|
CutoffModeSoft
|
|
CutoffModeCautious
|
|
CutoffModeDefault = CutoffModeHard
|
|
)
|
|
|
|
var cutoffModeToString = []string{
|
|
CutoffModeHard: "HARD",
|
|
CutoffModeSoft: "SOFT",
|
|
CutoffModeCautious: "CAUTIOUS",
|
|
}
|
|
|
|
// String turns a LogLevel into a string
|
|
func (m CutoffMode) String() string {
|
|
if m >= CutoffMode(len(cutoffModeToString)) {
|
|
return fmt.Sprintf("CutoffMode(%d)", m)
|
|
}
|
|
return cutoffModeToString[m]
|
|
}
|
|
|
|
// Set a LogLevel
|
|
func (m *CutoffMode) Set(s string) error {
|
|
for n, name := range cutoffModeToString {
|
|
if s != "" && name == strings.ToUpper(s) {
|
|
*m = CutoffMode(n)
|
|
return nil
|
|
}
|
|
}
|
|
return errors.Errorf("Unknown cutoff mode %q", s)
|
|
}
|
|
|
|
// Type of the value
|
|
func (m *CutoffMode) Type() string {
|
|
return "string"
|
|
}
|
|
|
|
// UnmarshalJSON makes sure the value can be parsed as a string or integer in JSON
|
|
func (m *CutoffMode) UnmarshalJSON(in []byte) error {
|
|
return UnmarshalJSONFlag(in, m, func(i int64) error {
|
|
if i < 0 || i >= int64(len(cutoffModeToString)) {
|
|
return errors.Errorf("Out of range cutoff mode %d", i)
|
|
}
|
|
*m = (CutoffMode)(i)
|
|
return nil
|
|
})
|
|
}
|