github.com/egonelbre/exp@v0.0.0-20240430123955-ed1d3aa93911/fields/03_compose/scan.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  )
     7  
     8  type jsonConfig struct {
     9  	Fields []jsonField
    10  }
    11  
    12  type jsonField struct {
    13  	Name       string
    14  	Type       string
    15  	Val        interface{}
    16  	Multiplier interface{}
    17  }
    18  
    19  //gistsnip:start:scan
    20  func (config *jsonConfig) Scan(fields ...Field) error {
    21  	for _, dst := range fields {
    22  		name := dst.Name()
    23  		src, err := config.findField(name)
    24  		if err != nil {
    25  			return err
    26  		}
    27  
    28  		err = dst.Assign(src.Type, src.Val)
    29  		if err != nil {
    30  			return err
    31  		}
    32  	}
    33  	return nil
    34  }
    35  
    36  //gistsnip:end:scan
    37  
    38  func (config *jsonConfig) findField(name string) (*jsonField, error) {
    39  	for i := 0; i < len(config.Fields); i++ {
    40  		field := &config.Fields[i]
    41  		if strings.EqualFold(field.Name, name) {
    42  			return field, nil
    43  		}
    44  	}
    45  	return nil, fmt.Errorf("unable to find field " + name)
    46  }