This repository has been archived by the owner on Aug 14, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcsv_non_unique.go
74 lines (64 loc) · 1.59 KB
/
csv_non_unique.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package slices
import (
"bytes"
"strings"
)
type CommaSeparatedValuesList string
func (csv CommaSeparatedValuesList) Add(v string) CommaSeparatedValuesList {
if strings.Contains(v, ",") {
panic("contains comma")
}
if csv == "" {
return CommaSeparatedValuesList(v)
}
return CommaSeparatedValuesList(string(csv) + "," + v)
}
func (csv CommaSeparatedValuesList) Count() int {
if csv == "" {
return 0
}
return strings.Count(string(csv), ",") + 1
}
func (csv CommaSeparatedValuesList) Set(i int, v string) CommaSeparatedValuesList {
vals := strings.Split(string(csv), ",")
if i >= len(vals) {
panic("out of range")
}
vals[i] = v
return CommaSeparatedValuesList(strings.Join(vals, ","))
}
func (csv CommaSeparatedValuesList) Contains(v string) bool {
s := string(csv)
vLen := len(v)
return (strings.HasPrefix(s, v) && (len(s) == vLen || s[vLen:vLen+1] == ",")) ||
strings.HasSuffix(s, ","+v) || strings.Contains(s, ","+v+",")
}
func (csv CommaSeparatedValuesList) Remove(v string) CommaSeparatedValuesList {
return CommaSeparatedValuesList(removeValFromCSV(string(csv), v))
}
func (csv CommaSeparatedValuesList) Strings() []string {
if csv == "" {
return []string{}
}
return strings.Split(string(csv), ",")
}
func (csv CommaSeparatedValuesList) String() string {
return string(csv)
}
func removeValFromCSV(s, v string) string {
if len(s) == 0 {
return s
}
var buf bytes.Buffer
vals := strings.Split(s, ",")
for _, val := range vals {
if val != v {
buf.WriteString(val)
buf.WriteString(",")
}
}
if buf.Len() > 0 {
buf.Truncate(buf.Len() - 1)
}
return buf.String()
}