mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
PeakQ: (Chore) Update Render to work with UTF (#82107)
This commit is contained in:
@@ -165,7 +165,7 @@ func Render(qt peakq.QueryTemplateSpec, selectedValues map[string][]string) (*pe
|
||||
o := rawTargetObjects[targetIdx]
|
||||
nodes, err := o.JSONPath(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return nil, fmt.Errorf("failed to find path %v: %w", path, err)
|
||||
}
|
||||
if len(nodes) != 1 {
|
||||
return nil, fmt.Errorf("expected one lead node at path %v but got %v", path, len(nodes))
|
||||
@@ -174,24 +174,21 @@ func Render(qt peakq.QueryTemplateSpec, selectedValues map[string][]string) (*pe
|
||||
if !n.IsString() {
|
||||
return nil, fmt.Errorf("only string type leaf notes supported currently, %v is not a string", path)
|
||||
}
|
||||
s := n.String()
|
||||
s := []rune(n.String())
|
||||
s = s[1 : len(s)-1]
|
||||
var offSet int64
|
||||
for _, r := range reps {
|
||||
// I think breaks with utf...something...?
|
||||
// TODO: Probably simpler to store the non-template parts and insert the values into that, then don't have to track
|
||||
// offsets
|
||||
if r.Position == nil {
|
||||
return nil, fmt.Errorf("nil position not support yet, will be full replacement")
|
||||
}
|
||||
if len(selectedValues[r.Key]) != 1 {
|
||||
return nil, fmt.Errorf("selected value missing, or more then one provided")
|
||||
}
|
||||
value := selectedValues[r.Key][0]
|
||||
s = s[:r.Start+offSet] + value + s[r.End+offSet:]
|
||||
offSet = int64(len(value)+int(offSet)) - (r.End - r.Start)
|
||||
value := []rune(selectedValues[r.Key][0])
|
||||
s = append(s[:r.Start+offSet], append(value, s[r.End+offSet:]...)...)
|
||||
offSet += int64(len(value)) - (r.End - r.Start)
|
||||
}
|
||||
if err = n.SetString(s); err != nil {
|
||||
if err = n.SetString(string(s)); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
@@ -180,3 +180,42 @@ func TestMultiVarTemplate(t *testing.T) {
|
||||
rT.Targets,
|
||||
)
|
||||
}
|
||||
|
||||
func TestRenderWithRune(t *testing.T) {
|
||||
qt := peakq.QueryTemplateSpec{
|
||||
Variables: []peakq.TemplateVariable{
|
||||
{
|
||||
Key: "name",
|
||||
},
|
||||
},
|
||||
Targets: []peakq.Target{
|
||||
{
|
||||
Properties: common.Unstructured{
|
||||
Object: map[string]any{
|
||||
"message": "🐦 name!",
|
||||
},
|
||||
},
|
||||
Variables: map[string][]peakq.VariableReplacement{
|
||||
"name": {
|
||||
{
|
||||
Path: "$.message",
|
||||
Position: &peakq.Position{
|
||||
Start: 2,
|
||||
End: 6,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
selectedValues := map[string][]string{
|
||||
"name": {"🦥"},
|
||||
}
|
||||
|
||||
rq, err := Render(qt, selectedValues)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, "🐦 🦥!", rq.Targets[0].Properties.Object["message"])
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user