add jsonpath to kubectl
This commit is contained in:
@@ -21,7 +21,6 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"reflect"
|
||||
"strconv"
|
||||
|
||||
"k8s.io/kubernetes/third_party/golang/template"
|
||||
)
|
||||
@@ -214,10 +213,9 @@ func (j *JSONPath) evalIdentifier(input []reflect.Value, node *IdentifierNode) (
|
||||
func (j *JSONPath) evalArray(input []reflect.Value, node *ArrayNode) ([]reflect.Value, error) {
|
||||
result := []reflect.Value{}
|
||||
for _, value := range input {
|
||||
if value.Kind() == reflect.Interface {
|
||||
value = reflect.ValueOf(value.Interface())
|
||||
}
|
||||
if value.Kind() != reflect.Array && value.Kind() != reflect.Slice {
|
||||
|
||||
value, isNil := template.Indirect(value)
|
||||
if isNil || (value.Kind() != reflect.Array && value.Kind() != reflect.Slice) {
|
||||
return input, fmt.Errorf("%v is not array or slice", value)
|
||||
}
|
||||
params := node.Params
|
||||
@@ -265,9 +263,11 @@ func (j *JSONPath) evalField(input []reflect.Value, node *FieldNode) ([]reflect.
|
||||
results := []reflect.Value{}
|
||||
for _, value := range input {
|
||||
var result reflect.Value
|
||||
if value.Kind() == reflect.Interface {
|
||||
value = reflect.ValueOf(value.Interface())
|
||||
value, isNil := template.Indirect(value)
|
||||
if isNil {
|
||||
continue
|
||||
}
|
||||
|
||||
if value.Kind() == reflect.Struct {
|
||||
result = value.FieldByName(node.Value)
|
||||
} else if value.Kind() == reflect.Map {
|
||||
@@ -287,6 +287,11 @@ func (j *JSONPath) evalField(input []reflect.Value, node *FieldNode) ([]reflect.
|
||||
func (j *JSONPath) evalWildcard(input []reflect.Value, node *WildcardNode) ([]reflect.Value, error) {
|
||||
results := []reflect.Value{}
|
||||
for _, value := range input {
|
||||
value, isNil := template.Indirect(value)
|
||||
if isNil {
|
||||
continue
|
||||
}
|
||||
|
||||
kind := value.Kind()
|
||||
if kind == reflect.Struct {
|
||||
for i := 0; i < value.NumField(); i++ {
|
||||
@@ -310,6 +315,11 @@ func (j *JSONPath) evalRecursive(input []reflect.Value, node *RecursiveNode) ([]
|
||||
result := []reflect.Value{}
|
||||
for _, value := range input {
|
||||
results := []reflect.Value{}
|
||||
value, isNil := template.Indirect(value)
|
||||
if isNil {
|
||||
continue
|
||||
}
|
||||
|
||||
kind := value.Kind()
|
||||
if kind == reflect.Struct {
|
||||
for i := 0; i < value.NumField(); i++ {
|
||||
@@ -340,9 +350,8 @@ func (j *JSONPath) evalRecursive(input []reflect.Value, node *RecursiveNode) ([]
|
||||
func (j *JSONPath) evalFilter(input []reflect.Value, node *FilterNode) ([]reflect.Value, error) {
|
||||
results := []reflect.Value{}
|
||||
for _, value := range input {
|
||||
if value.Kind() == reflect.Interface {
|
||||
value = reflect.ValueOf(value.Interface())
|
||||
}
|
||||
value, _ = template.Indirect(value)
|
||||
|
||||
if value.Kind() != reflect.Array && value.Kind() != reflect.Slice {
|
||||
return input, fmt.Errorf("%v is not array or slice", value)
|
||||
}
|
||||
@@ -407,77 +416,11 @@ func (j *JSONPath) evalFilter(input []reflect.Value, node *FilterNode) ([]reflec
|
||||
|
||||
// evalToText translates reflect value to corresponding text
|
||||
func (j *JSONPath) evalToText(v reflect.Value) ([]byte, error) {
|
||||
if v.Kind() == reflect.Interface {
|
||||
v = reflect.ValueOf(v.Interface())
|
||||
iface, ok := template.PrintableValue(v)
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("can't print type %s", v.Type())
|
||||
}
|
||||
var buffer bytes.Buffer
|
||||
switch v.Kind() {
|
||||
case reflect.Invalid:
|
||||
//pass
|
||||
case reflect.Ptr:
|
||||
text, err := j.evalToText(reflect.Indirect(v))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
buffer.Write(text)
|
||||
case reflect.Bool:
|
||||
if variable := v.Bool(); variable {
|
||||
buffer.WriteString("True")
|
||||
} else {
|
||||
buffer.WriteString("False")
|
||||
}
|
||||
case reflect.Float32:
|
||||
buffer.WriteString(strconv.FormatFloat(v.Float(), 'f', -1, 32))
|
||||
case reflect.Float64:
|
||||
buffer.WriteString(strconv.FormatFloat(v.Float(), 'f', -1, 64))
|
||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
||||
buffer.WriteString(strconv.FormatInt(v.Int(), 10))
|
||||
case reflect.String:
|
||||
buffer.WriteString(v.String())
|
||||
case reflect.Array, reflect.Slice:
|
||||
buffer.WriteString("[")
|
||||
for i := 0; i < v.Len(); i++ {
|
||||
text, err := j.evalToText(v.Index(i))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
buffer.Write(text)
|
||||
if i != v.Len()-1 {
|
||||
buffer.WriteString(", ")
|
||||
}
|
||||
}
|
||||
buffer.WriteString("]")
|
||||
case reflect.Struct:
|
||||
buffer.WriteString("{")
|
||||
for i := 0; i < v.NumField(); i++ {
|
||||
text, err := j.evalToText(v.Field(i))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
pair := fmt.Sprintf("%s: %s", v.Type().Field(i).Name, text)
|
||||
buffer.WriteString(pair)
|
||||
if i != v.NumField()-1 {
|
||||
buffer.WriteString(", ")
|
||||
}
|
||||
}
|
||||
buffer.WriteString("}")
|
||||
case reflect.Map:
|
||||
buffer.WriteString("{")
|
||||
for i, key := range v.MapKeys() {
|
||||
text, err := j.evalToText(v.MapIndex(key))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
pair := fmt.Sprintf("%s: %s", key, text)
|
||||
buffer.WriteString(pair)
|
||||
if i != len(v.MapKeys())-1 {
|
||||
buffer.WriteString(", ")
|
||||
}
|
||||
}
|
||||
buffer.WriteString("}")
|
||||
|
||||
default:
|
||||
return nil, fmt.Errorf("%v is not printable", v.Kind())
|
||||
}
|
||||
fmt.Fprint(&buffer, iface)
|
||||
return buffer.Bytes(), nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user