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