The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
grafana/pkg/tsdb/grafana-testdata-datasource/sims/utils.go

77 lines
1.5 KiB

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
}