|
- // 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
- }
- }
|