diff options
Diffstat (limited to 'vendor/github.com/hashicorp/terraform/svchost/label_iter.go')
-rw-r--r-- | vendor/github.com/hashicorp/terraform/svchost/label_iter.go | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/vendor/github.com/hashicorp/terraform/svchost/label_iter.go b/vendor/github.com/hashicorp/terraform/svchost/label_iter.go new file mode 100644 index 0000000..af8ccba --- /dev/null +++ b/vendor/github.com/hashicorp/terraform/svchost/label_iter.go | |||
@@ -0,0 +1,69 @@ | |||
1 | package svchost | ||
2 | |||
3 | import ( | ||
4 | "strings" | ||
5 | ) | ||
6 | |||
7 | // A labelIter allows iterating over domain name labels. | ||
8 | // | ||
9 | // This type is copied from golang.org/x/net/idna, where it is used | ||
10 | // to segment hostnames into their separate labels for analysis. We use | ||
11 | // it for the same purpose here, in ForComparison. | ||
12 | type labelIter struct { | ||
13 | orig string | ||
14 | slice []string | ||
15 | curStart int | ||
16 | curEnd int | ||
17 | i int | ||
18 | } | ||
19 | |||
20 | func (l *labelIter) reset() { | ||
21 | l.curStart = 0 | ||
22 | l.curEnd = 0 | ||
23 | l.i = 0 | ||
24 | } | ||
25 | |||
26 | func (l *labelIter) done() bool { | ||
27 | return l.curStart >= len(l.orig) | ||
28 | } | ||
29 | |||
30 | func (l *labelIter) result() string { | ||
31 | if l.slice != nil { | ||
32 | return strings.Join(l.slice, ".") | ||
33 | } | ||
34 | return l.orig | ||
35 | } | ||
36 | |||
37 | func (l *labelIter) label() string { | ||
38 | if l.slice != nil { | ||
39 | return l.slice[l.i] | ||
40 | } | ||
41 | p := strings.IndexByte(l.orig[l.curStart:], '.') | ||
42 | l.curEnd = l.curStart + p | ||
43 | if p == -1 { | ||
44 | l.curEnd = len(l.orig) | ||
45 | } | ||
46 | return l.orig[l.curStart:l.curEnd] | ||
47 | } | ||
48 | |||
49 | // next sets the value to the next label. It skips the last label if it is empty. | ||
50 | func (l *labelIter) next() { | ||
51 | l.i++ | ||
52 | if l.slice != nil { | ||
53 | if l.i >= len(l.slice) || l.i == len(l.slice)-1 && l.slice[l.i] == "" { | ||
54 | l.curStart = len(l.orig) | ||
55 | } | ||
56 | } else { | ||
57 | l.curStart = l.curEnd + 1 | ||
58 | if l.curStart == len(l.orig)-1 && l.orig[l.curStart] == '.' { | ||
59 | l.curStart = len(l.orig) | ||
60 | } | ||
61 | } | ||
62 | } | ||
63 | |||
64 | func (l *labelIter) set(s string) { | ||
65 | if l.slice == nil { | ||
66 | l.slice = strings.Split(l.orig, ".") | ||
67 | } | ||
68 | l.slice[l.i] = s | ||
69 | } | ||