mirror of
https://github.com/mikefarah/yq.git
synced 2024-12-19 20:19:04 +00:00
Added array splat functionality
This commit is contained in:
parent
fea6e0db3d
commit
e4d5769f29
20
README.md
20
README.md
@ -56,6 +56,26 @@ yaml sample.yaml b.e[1].name
|
|||||||
```
|
```
|
||||||
will output 'sam'
|
will output 'sam'
|
||||||
|
|
||||||
|
#### Array Splat
|
||||||
|
e.g.: given a sample file of
|
||||||
|
```yaml
|
||||||
|
b:
|
||||||
|
e:
|
||||||
|
- name: fred
|
||||||
|
value: 3
|
||||||
|
- name: sam
|
||||||
|
value: 4
|
||||||
|
```
|
||||||
|
then
|
||||||
|
```
|
||||||
|
yaml sample.yaml b.e[*].name
|
||||||
|
```
|
||||||
|
will output:
|
||||||
|
```
|
||||||
|
- fred
|
||||||
|
- sam
|
||||||
|
```
|
||||||
|
|
||||||
### Updating yaml
|
### Updating yaml
|
||||||
Given a sample.yaml file of:
|
Given a sample.yaml file of:
|
||||||
```yaml
|
```yaml
|
||||||
|
@ -25,6 +25,9 @@ func readMap(context map[interface{}]interface{}, head string, tail []string) in
|
|||||||
func recurse(value interface{}, head string, tail []string) interface{} {
|
func recurse(value interface{}, head string, tail []string) interface{} {
|
||||||
switch value.(type) {
|
switch value.(type) {
|
||||||
case []interface{}:
|
case []interface{}:
|
||||||
|
if head == "*" {
|
||||||
|
return readArraySplat(value.([]interface{}), tail)
|
||||||
|
}
|
||||||
index, err := strconv.ParseInt(head, 10, 64)
|
index, err := strconv.ParseInt(head, 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Error accessing array: %v", err)
|
log.Fatalf("Error accessing array: %v", err)
|
||||||
@ -48,3 +51,18 @@ func readArray(array []interface{}, head int64, tail []string) interface{} {
|
|||||||
}
|
}
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func readArraySplat(array []interface{}, tail []string) interface{} {
|
||||||
|
var newArray = make([]interface{}, len(array))
|
||||||
|
for index, value := range array {
|
||||||
|
newArray[index] = calculateValue(value, tail)
|
||||||
|
}
|
||||||
|
return newArray
|
||||||
|
}
|
||||||
|
|
||||||
|
func calculateValue(value interface{}, tail []string) interface{} {
|
||||||
|
if len(tail) > 0 {
|
||||||
|
return recurse(value, tail[0], tail[1:len(tail)])
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
@ -8,10 +8,20 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var rawData = `
|
var rawData = `
|
||||||
|
---
|
||||||
a: Easy!
|
a: Easy!
|
||||||
b:
|
b:
|
||||||
c: 2
|
c: 2
|
||||||
d: [3, 4]
|
d:
|
||||||
|
- 3
|
||||||
|
- 4
|
||||||
|
e:
|
||||||
|
-
|
||||||
|
name: Fred
|
||||||
|
thing: cat
|
||||||
|
-
|
||||||
|
name: Sam
|
||||||
|
thing: dog
|
||||||
`
|
`
|
||||||
|
|
||||||
var parsedData map[interface{}]interface{}
|
var parsedData map[interface{}]interface{}
|
||||||
@ -42,6 +52,10 @@ func TestReadMap_with_array_out_of_bounds(t *testing.T) {
|
|||||||
assertResult(t, nil, readMap(parsedData, "b", []string{"d", "3"}))
|
assertResult(t, nil, readMap(parsedData, "b", []string{"d", "3"}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestReadMap_with_array_splat(t *testing.T) {
|
||||||
|
assertResult(t, "[Fred Sam]", fmt.Sprintf("%v", readMap(parsedData, "e", []string{"*", "name"})))
|
||||||
|
}
|
||||||
|
|
||||||
func TestWrite_simple(t *testing.T) {
|
func TestWrite_simple(t *testing.T) {
|
||||||
|
|
||||||
write(parsedData, "b", []string{"c"}, "4")
|
write(parsedData, "b", []string{"c"}, "4")
|
||||||
@ -52,11 +66,12 @@ func TestWrite_simple(t *testing.T) {
|
|||||||
|
|
||||||
func assertResult(t *testing.T, expectedValue interface{}, actualValue interface{}) {
|
func assertResult(t *testing.T, expectedValue interface{}, actualValue interface{}) {
|
||||||
if expectedValue != actualValue {
|
if expectedValue != actualValue {
|
||||||
t.Error("Expected <", expectedValue, "> but got <", actualValue, ">")
|
t.Error("Expected <", expectedValue, "> but got <", actualValue, ">", fmt.Sprintf("%T", actualValue))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func assertResultWithContext(t *testing.T, expectedValue interface{}, actualValue interface{}, context interface{}) {
|
func assertResultWithContext(t *testing.T, expectedValue interface{}, actualValue interface{}, context interface{}) {
|
||||||
|
|
||||||
if expectedValue != actualValue {
|
if expectedValue != actualValue {
|
||||||
t.Error(context)
|
t.Error(context)
|
||||||
t.Error(": expected <", expectedValue, "> but got <", actualValue, ">")
|
t.Error(": expected <", expectedValue, "> but got <", actualValue, ">")
|
||||||
|
Loading…
Reference in New Issue
Block a user