feat: port jsonnet decoder from influxdb (#143)

This commit is contained in:
Daniel Moran
2021-06-23 13:37:46 -04:00
committed by GitHub
parent d519890f03
commit 8972d23024
4 changed files with 95 additions and 5 deletions

34
pkg/jsonnet/decode.go Normal file
View 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)
}

View 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)
}