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  }