Implement func mapper for parser reflection
This commit is contained in:
		@@ -14,7 +14,7 @@ import (
 | 
			
		||||
	eiaapi "gitea.libretechconsulting.com/50W/eia-api-go/api"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func GetFacets(cmd *cobra.Command, route string) (any, error) {
 | 
			
		||||
func GetFacets(cmd *cobra.Command, route string) (*eiaapi.FacetOptionList, error) {
 | 
			
		||||
	client, err := Client(cmd)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
@@ -65,28 +65,66 @@ func GetFacets(cmd *cobra.Command, route string) (any, error) {
 | 
			
		||||
 | 
			
		||||
	var resp *http.Response
 | 
			
		||||
	var ok bool
 | 
			
		||||
	err = nil
 | 
			
		||||
 | 
			
		||||
	if resp, ok = results[0].Interface().(*http.Response); !ok {
 | 
			
		||||
		return nil, errors.New("no or invalid response received from call")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if results[1].IsValid() && !results[1].IsNil() {
 | 
			
		||||
		if err, ok = results[1].Interface().(error); !ok {
 | 
			
		||||
			return nil, errors.New("unexpected call response")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err != nil {
 | 
			
		||||
	if err := checkCallErr(results[1]); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	parser := reflect.ValueOf(eiaapi).MethodByName(fmt.Sprintf("Parse%sResponse", route))
 | 
			
		||||
	parserFunc, exists := eiaapi.ParseFunctionsMap[fmt.Sprintf("Parse%sResponse", route)]
 | 
			
		||||
	if !exists {
 | 
			
		||||
		return nil, fmt.Errorf("parser func for %s not found", route)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	parser := reflect.ValueOf(parserFunc)
 | 
			
		||||
	if !parser.IsValid() {
 | 
			
		||||
		return nil, errors.New("unable to find parser for facet response")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	parser.Call([]reflect.Value{reflect.ValueOf(resp)})
 | 
			
		||||
	results = parser.Call([]reflect.Value{reflect.ValueOf(resp)})
 | 
			
		||||
	if len(results) != 2 {
 | 
			
		||||
		return nil, errors.New("unexpected response while parsing facet response")
 | 
			
		||||
	}
 | 
			
		||||
	if err := checkCallErr(results[1]); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return resp, nil
 | 
			
		||||
	result := results[0]
 | 
			
		||||
	if result.Kind() == reflect.Ptr {
 | 
			
		||||
		result = result.Elem()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if result.Kind() != reflect.Struct {
 | 
			
		||||
		return nil, fmt.Errorf("unexpected parse result kind %s", result.Kind().String())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	field := result.FieldByName("JSON200")
 | 
			
		||||
	if !field.IsValid() {
 | 
			
		||||
		return nil, errors.New("invalid facet data field in response")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	facetOptions, ok := field.Interface().(*eiaapi.FacetOptionListContainer)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return nil, errors.New("response does not contain facet options")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if facetOptions == nil {
 | 
			
		||||
		return nil, errors.New("no facet options found for facet request")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return facetOptions.Response, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func checkCallErr(val reflect.Value) error {
 | 
			
		||||
	var err error
 | 
			
		||||
	var ok bool
 | 
			
		||||
 | 
			
		||||
	if val.IsValid() && !val.IsNil() {
 | 
			
		||||
		if err, ok = val.Interface().(error); !ok {
 | 
			
		||||
			return errors.New("unexpected call response")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user