in pkg/sorter/sorter.go [174:223]
func newSorterNode(instanceType *instancetypes.Details, sortField string) (*sorterNode, error) {
// some important fields (such as gpu count) can not be accessed directly in the instancetypes.Details
// struct, so we have special hard-coded flags to handle such cases
switch sortField {
case GPUCountField:
gpuCount := getTotalGpusCount(instanceType)
return &sorterNode{
instanceType: instanceType,
fieldValue: reflect.ValueOf(gpuCount),
}, nil
case InferenceAcceleratorsField:
acceleratorsCount := getTotalAcceleratorsCount(instanceType)
return &sorterNode{
instanceType: instanceType,
fieldValue: reflect.ValueOf(acceleratorsCount),
}, nil
}
// convert instance type into json
jsonInstanceType, err := json.Marshal(instanceType)
if err != nil {
return nil, err
}
// unmarshal json instance types in order to get proper format
// for json path parsing
var jsonData interface{}
err = json.Unmarshal(jsonInstanceType, &jsonData)
if err != nil {
return nil, err
}
// get the desired field from the json data based on the passed in
// json path
result, err := jsonpath.JsonPathLookup(jsonData, sortField)
if err != nil {
// handle case where parent objects in path are null
// by setting result to nil
if err.Error() == "get attribute from null object" {
result = nil
} else {
return nil, fmt.Errorf("error during json path lookup: %v", err)
}
}
return &sorterNode{
instanceType: instanceType,
fieldValue: reflect.ValueOf(result),
}, nil
}