64 lines
1.2 KiB
Go
64 lines
1.2 KiB
Go
package filters
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"strings"
|
|
)
|
|
|
|
type Args map[string][]string
|
|
|
|
// Parse the argument to the filter flag. Like
|
|
//
|
|
// `docker ps -f 'created=today' -f 'image.name=ubuntu*'`
|
|
//
|
|
// If prev map is provided, then it is appended to, and returned. By default a new
|
|
// map is created.
|
|
func ParseFlag(arg string, prev Args) (Args, error) {
|
|
var filters Args = prev
|
|
if prev == nil {
|
|
filters = Args{}
|
|
}
|
|
if len(arg) == 0 {
|
|
return filters, nil
|
|
}
|
|
|
|
if !strings.Contains(arg, "=") {
|
|
return filters, ErrorBadFormat
|
|
}
|
|
|
|
f := strings.SplitN(arg, "=", 2)
|
|
filters[f[0]] = append(filters[f[0]], f[1])
|
|
|
|
return filters, nil
|
|
}
|
|
|
|
var ErrorBadFormat = errors.New("bad format of filter (expected name=value)")
|
|
|
|
// packs the Args into an string for easy transport from client to server
|
|
func ToParam(a Args) (string, error) {
|
|
// this way we don't URL encode {}, just empty space
|
|
if len(a) == 0 {
|
|
return "", nil
|
|
}
|
|
|
|
buf, err := json.Marshal(a)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return string(buf), nil
|
|
}
|
|
|
|
// unpacks the filter Args
|
|
func FromParam(p string) (Args, error) {
|
|
args := Args{}
|
|
if len(p) == 0 {
|
|
return args, nil
|
|
}
|
|
err := json.Unmarshal([]byte(p), &args)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return args, nil
|
|
}
|