master
go 62 lines 1.35 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package main
4
5 import (
6 "fmt"
7 "strings"
8 )
9
10 type familyFlagValues struct {
11 family string
12 sources []sourceEntry
13 }
14
15 func (f *familyFlagValues) String() string {
16 return fmt.Sprintf("%d %s sources", len(f.sources), f.family)
17 }
18
19 func (f *familyFlagValues) Set(value string) error {
20 source, err := parseSourceToken(f.family, value)
21 if err != nil {
22 return err
23 }
24 f.sources = append(f.sources, source)
25 return nil
26 }
27
28 func parseSourceToken(family, value string) (sourceEntry, error) {
29 value = strings.TrimSpace(value)
30 if value == "" {
31 return sourceEntry{}, fmt.Errorf("empty source token")
32 }
33
34 format := ""
35 if before, after, ok := strings.Cut(value, "@"); ok {
36 value = strings.TrimSpace(before)
37 format = strings.ToLower(strings.TrimSpace(after))
38 }
39
40 provider, artifact, ok := strings.Cut(value, ":")
41 if !ok {
42 return sourceEntry{}, fmt.Errorf(
43 "invalid source %q, expected provider:artifact or provider:artifact@format",
44 value,
45 )
46 }
47
48 source := sourceEntry{
49 family: family,
50 provider: strings.ToLower(strings.TrimSpace(provider)),
51 artifact: strings.ToLower(strings.TrimSpace(artifact)),
52 format: format,
53 }
54
55 if err := normalizeSourceEntry(&source); err != nil {
56 return sourceEntry{}, err
57 }
58 if err := validateSourceEntry(source, "flag"); err != nil {
59 return sourceEntry{}, err
60 }
61 return source, nil
62 }