summaryrefslogtreecommitdiff
path: root/vendor/golang.org/x/text/internal/cldrtree/option.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/golang.org/x/text/internal/cldrtree/option.go')
-rw-r--r--vendor/golang.org/x/text/internal/cldrtree/option.go86
1 files changed, 86 insertions, 0 deletions
diff --git a/vendor/golang.org/x/text/internal/cldrtree/option.go b/vendor/golang.org/x/text/internal/cldrtree/option.go
new file mode 100644
index 0000000..f91e250
--- /dev/null
+++ b/vendor/golang.org/x/text/internal/cldrtree/option.go
@@ -0,0 +1,86 @@
+// Copyright 2017 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package cldrtree
+
+import (
+ "reflect"
+
+ "golang.org/x/text/unicode/cldr"
+)
+
+// An Option configures an Index.
+type Option func(*options)
+
+type options struct {
+ parent *Index
+
+ name string
+ alias *cldr.Common
+
+ sharedType *typeInfo
+ sharedEnums *enum
+}
+
+func (o *options) fill(opt []Option) {
+ for _, f := range opt {
+ f(o)
+ }
+}
+
+// aliasOpt sets an alias from the given node, if the node defines one.
+func (o *options) setAlias(n Element) {
+ if n != nil && !reflect.ValueOf(n).IsNil() {
+ o.alias = n.GetCommon()
+ }
+}
+
+// Enum defines a enumeration type. The resulting option may be passed for the
+// construction of multiple Indexes, which they will share the same enum values.
+// Calling Gen on a Builder will generate the Enum for the given name. The
+// optional values fix the values for the given identifier to the argument
+// position (starting at 0). Other values may still be added and will be
+// assigned to subsequent values.
+func Enum(name string, value ...string) Option {
+ return EnumFunc(name, nil, value...)
+}
+
+// EnumFunc is like Enum but also takes a function that allows rewriting keys.
+func EnumFunc(name string, rename func(string) string, value ...string) Option {
+ enum := &enum{name: name, rename: rename, keyMap: map[string]enumIndex{}}
+ for _, e := range value {
+ enum.lookup(e)
+ }
+ return func(o *options) {
+ found := false
+ for _, e := range o.parent.meta.b.enums {
+ if e.name == enum.name {
+ found = true
+ break
+ }
+ }
+ if !found {
+ o.parent.meta.b.enums = append(o.parent.meta.b.enums, enum)
+ }
+ o.sharedEnums = enum
+ }
+}
+
+// SharedType returns an option which causes all Indexes to which this option is
+// passed to have the same type.
+func SharedType() Option {
+ info := &typeInfo{}
+ return func(o *options) { o.sharedType = info }
+}
+
+func useSharedType() Option {
+ return func(o *options) {
+ sub := o.parent.meta.typeInfo.keyTypeInfo
+ if sub == nil {
+ sub = &typeInfo{}
+ o.parent.meta.typeInfo.keyTypeInfo = sub
+ }
+ o.sharedType = sub
+ }
+}