Implement func mapper for parser reflection

This commit is contained in:
2024-11-26 11:46:15 -05:00
parent b97b24d394
commit 42bf0696d6
5 changed files with 416 additions and 15 deletions

View File

@ -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
}