blob: f91e250b8aeeb5b664cc31ed9d457f0f89c3ab35 [file] [log] [blame]
// 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
}
}