feat: port jsonnet decoder from influxdb (#143)
This commit is contained in:
34
pkg/jsonnet/decode.go
Normal file
34
pkg/jsonnet/decode.go
Normal file
@ -0,0 +1,34 @@
|
||||
package jsonnet
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
|
||||
"github.com/google/go-jsonnet"
|
||||
)
|
||||
|
||||
// Decoder type can decode a jsonnet stream into the given output.
|
||||
type Decoder struct {
|
||||
r io.Reader
|
||||
}
|
||||
|
||||
// NewDecoder creates a new decoder.
|
||||
func NewDecoder(r io.Reader) *Decoder {
|
||||
return &Decoder{r: r}
|
||||
}
|
||||
|
||||
// Decode decodes the stream into the provide value.
|
||||
func (d *Decoder) Decode(v interface{}) error {
|
||||
b, err := ioutil.ReadAll(d.r)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
vm := jsonnet.MakeVM()
|
||||
jsonStr, err := vm.EvaluateAnonymousSnippet("memory", string(b))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return json.Unmarshal([]byte(jsonStr), &v)
|
||||
}
|
46
pkg/jsonnet/decode_test.go
Normal file
46
pkg/jsonnet/decode_test.go
Normal file
@ -0,0 +1,46 @@
|
||||
package jsonnet_test
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/influxdata/influx-cli/v2/pkg/jsonnet"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestDecoder(t *testing.T) {
|
||||
type (
|
||||
person struct {
|
||||
Name string `json:"name"`
|
||||
Welcome string `json:"welcome"`
|
||||
}
|
||||
|
||||
persons struct {
|
||||
Person1 person `json:"person1"`
|
||||
Person2 person `json:"person2"`
|
||||
}
|
||||
)
|
||||
|
||||
const entry = `{
|
||||
person1: {
|
||||
name: "Alice",
|
||||
welcome: "Hello " + self.name + "!",
|
||||
},
|
||||
person2: self.person1 { name: "Bob" },
|
||||
}`
|
||||
|
||||
var out persons
|
||||
require.NoError(t, jsonnet.NewDecoder(strings.NewReader(entry)).Decode(&out))
|
||||
|
||||
expected := persons{
|
||||
Person1: person{
|
||||
Name: "Alice",
|
||||
Welcome: "Hello Alice!",
|
||||
},
|
||||
Person2: person{
|
||||
Name: "Bob",
|
||||
Welcome: "Hello Bob!",
|
||||
},
|
||||
}
|
||||
require.Equal(t, expected, out)
|
||||
}
|
Reference in New Issue
Block a user