87 lines
2.1 KiB
Go
87 lines
2.1 KiB
Go
|
// 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
|
||
|
}
|
||
|
}
|