github.com/urso/go-structform@v0.0.2/gotype/opts.go (about) 1 package gotype 2 3 import "reflect" 4 5 type initOptions struct { 6 foldFns map[reflect.Type]reFoldFn 7 } 8 9 type Option func(*initOptions) error 10 11 func applyOpts(opts []Option) (initOptions, error) { 12 i := initOptions{} 13 for _, o := range opts { 14 if err := o(&i); err != nil { 15 return initOptions{}, err 16 } 17 } 18 return i, nil 19 } 20 21 func Folders(in ...interface{}) Option { 22 folders, err := makeUserFoldFns(in) 23 if err != nil { 24 return func(_ *initOptions) error { return err } 25 } 26 27 if len(folders) == 0 { 28 return func(*initOptions) error { return nil } 29 } 30 31 return func(o *initOptions) error { 32 if o.foldFns == nil { 33 o.foldFns = map[reflect.Type]reFoldFn{} 34 } 35 36 for k, v := range folders { 37 o.foldFns[k] = v 38 } 39 return nil 40 } 41 } 42 43 func makeUserFoldFns(in []interface{}) (map[reflect.Type]reFoldFn, error) { 44 M := map[reflect.Type]reFoldFn{} 45 46 for _, v := range in { 47 fn := reflect.ValueOf(v) 48 fptr, err := makeUserFoldFn(fn) 49 if err != nil { 50 return nil, err 51 } 52 53 ta0 := fn.Type().In(0) 54 M[ta0] = liftUserPtrFn(fptr) 55 M[ta0.Elem()] = liftUserValueFn(fptr) 56 } 57 58 return M, nil 59 }