Support non-final routes

This commit is contained in:
2024-11-29 16:58:12 -05:00
parent 8af19f762d
commit f661ddcb8b
6 changed files with 105 additions and 84 deletions

View File

@ -2,7 +2,6 @@ package eia
import (
"context"
"encoding/json"
"errors"
"fmt"
"net/http"
@ -43,20 +42,22 @@ var defaultMethodSubs = MethodSubs{
}
// Retrieve information for a named Route (e.g. GetAeoV2Route1)
func (client *Client) GetRoute(ctx context.Context, route string, subs *MethodSubs) (
*eiaapi.FinalRoute, error,
// Returns a *eiaapi.Routes if this is not a final route, otherwise returns
// a final route response
func (client *Client) GetRoutesOrFinalRoute(ctx context.Context, route string, subs *MethodSubs) (
*eiaapi.FinalRoute, *eiaapi.Routes, error,
) {
eiaClient := reflect.ValueOf(client)
// Get the method for describing this facet
method := eiaClient.MethodByName(route)
if !method.IsValid() {
return nil, fmt.Errorf("method %s not found", route)
return nil, nil, fmt.Errorf("method %s not found", route)
}
parser, err := getParser(route)
if err != nil {
return nil, err
return nil, nil, err
}
args := prepMethodArgs(method, route, subs)
@ -64,33 +65,57 @@ func (client *Client) GetRoute(ctx context.Context, route string, subs *MethodSu
results := method.Call(args)
resp, err := getResponse(results)
if err != nil {
return nil, err
return nil, nil, err
}
result, err := ParseResponse(&ParseOpts{
Parser: parser,
Resp: resp,
BodyOnly: true,
JsonOnly: true,
})
if err != nil {
return nil, err
return nil, nil, err
}
// The api doesn't actually return what the swagger spec
// tells you it is going to return, so we need to do this
// manually for routes
frr := new(eiaapi.FinalRouteResponse)
if err = json.Unmarshal(
result.Interface().([]uint8), frr,
); err != nil {
return nil, err
// First, see if we have a Final Route
frr, err := getFRR(result)
if err == nil && frr.Response != nil {
return frr.Response, nil, nil
}
if frr.Response == nil {
return nil, errors.New("no route response received")
// Then, see if we have an intermediate route
rr, err := getRR(result)
if err == nil && rr.Response != nil {
return nil, rr.Response, nil
}
return frr.Response, nil
return nil, nil, errors.New("No route or final route fount in response")
}
func getRR(json200 reflect.Value) (*eiaapi.RouteResponse, error) {
rr, ok := json200.Interface().(*eiaapi.RouteResponse)
if !ok {
return nil, errors.New("response does not contain route response container")
}
if rr == nil {
return nil, errors.New("no route response found")
}
return rr, nil
}
func getFRR(json200 reflect.Value) (*eiaapi.FinalRouteResponse, error) {
frr, ok := json200.Interface().(*eiaapi.FinalRouteResponse)
if !ok {
return nil, errors.New("response does not contain final route response")
}
if frr == nil {
return nil, errors.New("no final route response found")
}
return frr, nil
}
// Given an API route and a facet ID, retrieve information about the facet