...
1 package pgtype
2
3 import (
4 "bytes"
5 "fmt"
6 )
7
8 type UntypedTextMultirange struct {
9 Elements []string
10 }
11
12 func ParseUntypedTextMultirange(src string) (*UntypedTextMultirange, error) {
13 utmr := &UntypedTextMultirange{}
14 utmr.Elements = make([]string, 0)
15
16 buf := bytes.NewBufferString(src)
17
18 skipWhitespace(buf)
19
20 r, _, err := buf.ReadRune()
21 if err != nil {
22 return nil, fmt.Errorf("invalid array: %v", err)
23 }
24
25 if r != '{' {
26 return nil, fmt.Errorf("invalid multirange, expected '{': %v", err)
27 }
28
29 parseValueLoop:
30 for {
31 r, _, err = buf.ReadRune()
32 if err != nil {
33 return nil, fmt.Errorf("invalid multirange: %v", err)
34 }
35
36 switch r {
37 case ',':
38 case '}':
39 break parseValueLoop
40 default:
41 buf.UnreadRune()
42 value, err := parseRange(buf)
43 if err != nil {
44 return nil, fmt.Errorf("invalid multirange value: %v", err)
45 }
46 utmr.Elements = append(utmr.Elements, value)
47 }
48 }
49
50 skipWhitespace(buf)
51
52 if buf.Len() > 0 {
53 return nil, fmt.Errorf("unexpected trailing data: %v", buf.String())
54 }
55
56 return utmr, nil
57
58 }
59
60 func parseRange(buf *bytes.Buffer) (string, error) {
61
62 s := &bytes.Buffer{}
63
64 boundSepRead := false
65 for {
66 r, _, err := buf.ReadRune()
67 if err != nil {
68 return "", err
69 }
70
71 switch r {
72 case ',', '}':
73 if r == ',' && !boundSepRead {
74 boundSepRead = true
75 break
76 }
77 buf.UnreadRune()
78 return s.String(), nil
79 }
80
81 s.WriteRune(r)
82 }
83 }
84
View as plain text