planner/plan/cli/arg/arg.go

57 lines
1.3 KiB
Go
Raw Permalink Normal View History

2025-01-19 10:56:03 +01:00
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++ {
2025-02-04 14:53:47 +01:00
if strings.HasPrefix(args[i], "http://") || strings.HasPrefix(args[i], "https://") {
main = append(main, args[i])
continue
}
2025-01-19 10:56:03 +01:00
// 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
}