...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package types
16
17 import (
18 "fmt"
19 "sort"
20 "strings"
21 )
22
23
24 type URLsMap map[string]URLs
25
26
27
28
29 func NewURLsMap(s string) (URLsMap, error) {
30 m := parse(s)
31
32 cl := URLsMap{}
33 for name, urls := range m {
34 us, err := NewURLs(urls)
35 if err != nil {
36 return nil, err
37 }
38 cl[name] = us
39 }
40 return cl, nil
41 }
42
43
44
45 func NewURLsMapFromStringMap(m map[string]string, sep string) (URLsMap, error) {
46 var err error
47 um := URLsMap{}
48 for k, v := range m {
49 um[k], err = NewURLs(strings.Split(v, sep))
50 if err != nil {
51 return nil, err
52 }
53 }
54 return um, nil
55 }
56
57
58 func (c URLsMap) String() string {
59 var pairs []string
60 for name, urls := range c {
61 for _, url := range urls {
62 pairs = append(pairs, fmt.Sprintf("%s=%s", name, url.String()))
63 }
64 }
65 sort.Strings(pairs)
66 return strings.Join(pairs, ",")
67 }
68
69
70
71 func (c URLsMap) URLs() []string {
72 var urls []string
73 for _, us := range c {
74 for _, u := range us {
75 urls = append(urls, u.String())
76 }
77 }
78 sort.Strings(urls)
79 return urls
80 }
81
82
83 func (c URLsMap) Len() int {
84 return len(c)
85 }
86
87
88 func parse(s string) map[string][]string {
89 m := make(map[string][]string)
90 for s != "" {
91 key := s
92 if i := strings.IndexAny(key, ","); i >= 0 {
93 key, s = key[:i], key[i+1:]
94 } else {
95 s = ""
96 }
97 if key == "" {
98 continue
99 }
100 value := ""
101 if i := strings.Index(key, "="); i >= 0 {
102 key, value = key[:i], key[i+1:]
103 }
104 m[key] = append(m[key], value)
105 }
106 return m
107 }
108
View as plain text