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.
101 lines
1.9 KiB
Go
101 lines
1.9 KiB
Go
package fs
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
// DumpFlags describes the Dump options in force
|
|
type DumpFlags int
|
|
|
|
// DumpFlags definitions
|
|
const (
|
|
DumpHeaders DumpFlags = 1 << iota
|
|
DumpBodies
|
|
DumpRequests
|
|
DumpResponses
|
|
DumpAuth
|
|
DumpFilters
|
|
DumpGoRoutines
|
|
DumpOpenFiles
|
|
)
|
|
|
|
var dumpFlags = []struct {
|
|
flag DumpFlags
|
|
name string
|
|
}{
|
|
{DumpHeaders, "headers"},
|
|
{DumpBodies, "bodies"},
|
|
{DumpRequests, "requests"},
|
|
{DumpResponses, "responses"},
|
|
{DumpAuth, "auth"},
|
|
{DumpFilters, "filters"},
|
|
{DumpGoRoutines, "goroutines"},
|
|
{DumpOpenFiles, "openfiles"},
|
|
}
|
|
|
|
// DumpFlagsList is a list of dump flags used in the help
|
|
var DumpFlagsList string
|
|
|
|
func init() {
|
|
// calculate the dump flags list
|
|
var out []string
|
|
for _, info := range dumpFlags {
|
|
out = append(out, info.name)
|
|
}
|
|
DumpFlagsList = strings.Join(out, ",")
|
|
}
|
|
|
|
// String turns a DumpFlags into a string
|
|
func (f DumpFlags) String() string {
|
|
var out []string
|
|
for _, info := range dumpFlags {
|
|
if f&info.flag != 0 {
|
|
out = append(out, info.name)
|
|
f &^= info.flag
|
|
}
|
|
}
|
|
if f != 0 {
|
|
out = append(out, fmt.Sprintf("Unknown-0x%X", int(f)))
|
|
}
|
|
return strings.Join(out, ",")
|
|
}
|
|
|
|
// Set a DumpFlags as a comma separated list of flags
|
|
func (f *DumpFlags) Set(s string) error {
|
|
var flags DumpFlags
|
|
parts := strings.Split(s, ",")
|
|
for _, part := range parts {
|
|
found := false
|
|
part = strings.ToLower(strings.TrimSpace(part))
|
|
if part == "" {
|
|
continue
|
|
}
|
|
for _, info := range dumpFlags {
|
|
if part == info.name {
|
|
found = true
|
|
flags |= info.flag
|
|
}
|
|
}
|
|
if !found {
|
|
return errors.Errorf("Unknown dump flag %q", part)
|
|
}
|
|
}
|
|
*f = flags
|
|
return nil
|
|
}
|
|
|
|
// Type of the value
|
|
func (f *DumpFlags) Type() string {
|
|
return "DumpFlags"
|
|
}
|
|
|
|
// UnmarshalJSON makes sure the value can be parsed as a string or integer in JSON
|
|
func (f *DumpFlags) UnmarshalJSON(in []byte) error {
|
|
return UnmarshalJSONFlag(in, f, func(i int64) error {
|
|
*f = (DumpFlags)(i)
|
|
return nil
|
|
})
|
|
}
|