Add two builtin name getter

This commit is contained in:
Unknwon
2015-01-02 01:00:31 +08:00
parent 8ca0fa127b
commit afcdaa289f
2 changed files with 59 additions and 2 deletions
+40 -2
View File
@@ -19,11 +19,43 @@ import (
"fmt"
"reflect"
"time"
"unicode"
)
// NameGetter represents a ini tag name getter.
type NameGetter func(string) string
// Built-in name getters.
var (
// AllCapsUnderscore converts to format ALL_CAPS_UNDERSCORE.
AllCapsUnderscore NameGetter = func(raw string) string {
newstr := make([]rune, 0, 10)
for i, chr := range raw {
if isUpper := 'A' <= chr && chr <= 'Z'; isUpper {
if i > 0 {
newstr = append(newstr, '_')
}
}
newstr = append(newstr, unicode.ToUpper(chr))
}
return string(newstr)
}
// TitleUnderscore converts to format title_underscore.
TitleUnderscore NameGetter = func(raw string) string {
newstr := make([]rune, 0, 10)
for i, chr := range raw {
if isUpper := 'A' <= chr && chr <= 'Z'; isUpper {
if i > 0 {
newstr = append(newstr, '_')
}
chr -= ('A' - 'a')
}
newstr = append(newstr, chr)
}
return string(newstr)
}
)
func (s *Section) parseFieldName(raw, actual string) string {
if len(actual) > 0 {
return actual
@@ -155,11 +187,17 @@ func (f *File) MapTo(v interface{}) (err error) {
return f.Section("").MapTo(val)
}
// MapTo maps data sources to given struct.
func MapTo(v, source interface{}, others ...interface{}) error {
// MapTo maps data sources to given struct with name getter.
func MapToGetter(v interface{}, getter NameGetter, source interface{}, others ...interface{}) error {
cfg, err := Load(source, others...)
if err != nil {
return err
}
cfg.NameGetter = getter
return cfg.MapTo(v)
}
// MapTo maps data sources to given struct.
func MapTo(v, source interface{}, others ...interface{}) error {
return MapToGetter(v, nil, source, others...)
}
+19
View File
@@ -162,3 +162,22 @@ func Test_Struct(t *testing.T) {
So(MapTo(&emptySlice{}, []byte(_INVALID_DATA_CONF_STRUCT)), ShouldBeNil)
})
}
type testGetter struct {
PackageName string
}
func Test_NameGetter(t *testing.T) {
Convey("Test name getters", t, func() {
So(MapToGetter(&testGetter{}, TitleUnderscore, []byte("packag_name=ini")), ShouldBeNil)
cfg, err := Load([]byte("PACKAGE_NAME=ini"))
So(err, ShouldBeNil)
So(cfg, ShouldNotBeNil)
cfg.NameGetter = AllCapsUnderscore
tg := new(testGetter)
So(cfg.MapTo(tg), ShouldBeNil)
So(tg.PackageName, ShouldEqual, "ini")
})
}