grafana/pkg/tsdb/grafana-testdata-datasource/sims/utils.go

77 lines
1.5 KiB
Go

package sims
import (
"encoding/json"
"net/http"
"github.com/grafana/grafana-plugin-sdk-go/data"
)
// updateConfigObjectFromJSON will use json serialization to update any properties
func updateConfigObjectFromJSON(cfg any, input any) error {
current, err := asStringMap(cfg)
if err != nil {
return err
}
next, err := asStringMap(input)
if err != nil {
return err
}
for k, v := range next {
if v == nil {
delete(current, k)
} else {
current[k] = v
}
}
b, err := json.Marshal(current)
if err != nil {
return err
}
return json.Unmarshal(b, cfg)
}
func asStringMap(input any) (map[string]any, error) {
v, ok := input.(map[string]any)
if ok {
return v, nil
}
v = make(map[string]any)
b, err := json.Marshal(input)
if err != nil {
return nil, err
}
err = json.Unmarshal(b, &v)
return v, err
}
func setFrameRow(frame *data.Frame, idx int, values map[string]any) {
for _, field := range frame.Fields {
v, ok := values[field.Name]
if ok {
field.Set(idx, v)
}
}
}
func appendFrameRow(frame *data.Frame, values map[string]any) {
for _, field := range frame.Fields {
v, ok := values[field.Name]
if ok {
field.Append(v)
} else {
field.Extend(1) // fill with nullable value
}
}
}
func getBodyFromRequest(req *http.Request) (map[string]any, error) {
result := make(map[string]any, 10)
err := json.NewDecoder(req.Body).Decode(&result)
// TODO? create the map based on form parameters not JSON post
return result, err
}