54 lines
1.2 KiB
Go
54 lines
1.2 KiB
Go
|
package arg
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"slices"
|
||
|
"strings"
|
||
|
|
||
|
"go-mod.ewintr.nl/planner/plan/command"
|
||
|
)
|
||
|
|
||
|
func FindFields(args []string) ([]string, map[string]string) {
|
||
|
fields := make(map[string]string)
|
||
|
main := make([]string, 0)
|
||
|
for i := 0; i < len(args); i++ {
|
||
|
// normal key:value
|
||
|
if k, v, ok := strings.Cut(args[i], ":"); ok && !strings.Contains(k, " ") {
|
||
|
fields[k] = v
|
||
|
continue
|
||
|
}
|
||
|
// empty key:
|
||
|
if !strings.Contains(args[i], " ") && strings.HasSuffix(args[i], ":") {
|
||
|
k := strings.TrimSuffix(args[i], ":")
|
||
|
fields[k] = ""
|
||
|
}
|
||
|
main = append(main, args[i])
|
||
|
}
|
||
|
|
||
|
return main, fields
|
||
|
}
|
||
|
|
||
|
func ResolveFields(fields map[string]string, tmpl map[string][]string) (map[string]string, error) {
|
||
|
res := make(map[string]string)
|
||
|
for k, v := range fields {
|
||
|
for tk, tv := range tmpl {
|
||
|
if slices.Contains(tv, k) {
|
||
|
if _, ok := res[tk]; ok {
|
||
|
return nil, fmt.Errorf("%w: duplicate field: %v", command.ErrInvalidArg, tk)
|
||
|
}
|
||
|
res[tk] = v
|
||
|
delete(fields, k)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if len(fields) > 0 {
|
||
|
ks := make([]string, 0, len(fields))
|
||
|
for k := range fields {
|
||
|
ks = append(ks, k)
|
||
|
}
|
||
|
return nil, fmt.Errorf("%w: unknown field(s): %v", command.ErrInvalidArg, strings.Join(ks, ","))
|
||
|
}
|
||
|
|
||
|
return res, nil
|
||
|
}
|