Support non-final routes
This commit is contained in:
@ -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
|
||||
|
Reference in New Issue
Block a user