internal/cldrtree: add EnumFunc option Change-Id: I12d61cb1e67da1e682b9a3a04826988d8c0b7cd0 Reviewed-on: https://go-review.googlesource.com/73010 Run-TryBot: Marcel van Lohuizen <mpvl@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Nigel Tao <nigeltao@golang.org>
diff --git a/internal/cldrtree/cldrtree_test.go b/internal/cldrtree/cldrtree_test.go index 6907ee6..232fb46 100644 --- a/internal/cldrtree/cldrtree_test.go +++ b/internal/cldrtree/cldrtree_test.go
@@ -12,6 +12,7 @@ "path/filepath" "reflect" "regexp" + "strings" "testing" "golang.org/x/text/internal/gen" @@ -326,9 +327,18 @@ } context := Enum("context") - // Align era with width values. - width := Enum("width", "abbreviated", "narrow", "wide") - eraType := Enum("era", "eraAbbr", "eraNarrow", "eraNames") + widthMap := func(s string) string { + // Align era with width values. + if r, ok := map[string]string{ + "eraAbbr": "abbreviated", + "eraNarrow": "narrow", + "eraNames": "wide", + }[s]; ok { + s = r + } + return "w" + strings.Title(s) + } + width := EnumFunc("width", widthMap, "abbreviated", "narrow", "wide") r := rand.New(rand.NewSource(0)) for _, loc := range data.Locales() { @@ -364,7 +374,7 @@ } } if x := x.Index(cal.Eras); x != nil { - opts := []Option{eraType, SharedType()} + opts := []Option{width, SharedType()} if x := x.Index(cal.Eras.EraNames, opts...); x != nil { for _, e := range cal.Eras.EraNames.Era { x.IndexFromAlt(e).SetValue(e.Type, e)
diff --git a/internal/cldrtree/option.go b/internal/cldrtree/option.go index 069d560..f91e250 100644 --- a/internal/cldrtree/option.go +++ b/internal/cldrtree/option.go
@@ -43,7 +43,12 @@ // position (starting at 0). Other values may still be added and will be // assigned to subsequent values. func Enum(name string, value ...string) Option { - enum := &enum{name: name, keyMap: map[string]enumIndex{}} + 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) } @@ -62,13 +67,6 @@ } } -// TODO: -// // RenameFunc renames enum values. This is mostly used to sanitize enum values -// // to make them proper identifiers. -// func RenameFunc(rename func(string) string) Option { -// return nil -// } - // SharedType returns an option which causes all Indexes to which this option is // passed to have the same type. func SharedType() Option {
diff --git a/internal/cldrtree/testdata/test1/output.go b/internal/cldrtree/testdata/test1/output.go index 1a03679..effda4c 100755 --- a/internal/cldrtree/testdata/test1/output.go +++ b/internal/cldrtree/testdata/test1/output.go
@@ -11,9 +11,9 @@ // - format // - stand-alone // <width> -// - abbreviated -// - narrow -// - wide +// - wAbbreviated +// - wNarrow +// - wWide // // - calendars // - chinese @@ -43,9 +43,9 @@ type width int const ( - abbreviated width = iota - narrow - wide + wAbbreviated width = iota + wNarrow + wWide ) var locales = []uint32{ // 754 elements
diff --git a/internal/cldrtree/testdata/test2/output.go b/internal/cldrtree/testdata/test2/output.go index 469d065..aea79c8 100755 --- a/internal/cldrtree/testdata/test2/output.go +++ b/internal/cldrtree/testdata/test2/output.go
@@ -7,17 +7,13 @@ var tree = &cldrtree.Tree{locales, indices, buckets} // Path values: -// <era> -// - eraAbbr -// - eraNarrow -// - eraNames +// <width> +// - wAbbreviated +// - wNarrow +// - wWide // <context> // - format // - stand-alone -// <width> -// - abbreviated -// - narrow -// - wide // // - calendars // - buddhist @@ -40,7 +36,7 @@ // - 1..13 // - 7leap // - eras -// - <era> +// - <width> // - "" // - variant // - 0..1 @@ -79,13 +75,13 @@ // total string size: 9931 // bucket waste: 0 -// era specifies a property of a CLDR field. -type era int +// width specifies a property of a CLDR field. +type width int const ( - eraAbbr era = iota - eraNarrow - eraNames + wAbbreviated width = iota + wNarrow + wWide ) // context specifies a property of a CLDR field. @@ -96,15 +92,6 @@ standAlone ) -// width specifies a property of a CLDR field. -type width int - -const ( - abbreviated width = iota - narrow - wide -) - var locales = []uint32{ // 754 elements // Entry 0 - 1F 0x00000000, 0x00000000, 0x0000026b, 0x00000000,
diff --git a/internal/cldrtree/type.go b/internal/cldrtree/type.go index b0809ab..a7897c6 100644 --- a/internal/cldrtree/type.go +++ b/internal/cldrtree/type.go
@@ -10,6 +10,7 @@ // An enum is a collection of enum values. type enum struct { name string // the Go type of the enum + rename func(string) string keyMap map[string]enumIndex keys []string } @@ -17,6 +18,9 @@ // lookup returns the index for the enum corresponding to the string. If s // currently does not exist it will add the entry. func (e *enum) lookup(s string) enumIndex { + if e.rename != nil { + s = e.rename(s) + } x, ok := e.keyMap[s] if !ok { if e.keyMap == nil { @@ -49,7 +53,7 @@ } } if opts.sharedEnums != nil && t.enum != opts.sharedEnums { - panic("incompatible enumss defined") + panic("incompatible enums defined") } x = t.enum.lookup(s) if t.entries == nil {