From 3ad860a63c1fb65e71dffaedcf91a6e85b764377 Mon Sep 17 00:00:00 2001 From: Kyle Brandt Date: Wed, 7 Feb 2024 10:48:53 -0500 Subject: [PATCH] PeakQ: (Chore) Update Render to work with UTF (#82107) --- pkg/registry/apis/peakq/render.go | 15 ++++------ pkg/registry/apis/peakq/render_test.go | 39 ++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/pkg/registry/apis/peakq/render.go b/pkg/registry/apis/peakq/render.go index f6a62a9e75c..bb3d20ed16f 100644 --- a/pkg/registry/apis/peakq/render.go +++ b/pkg/registry/apis/peakq/render.go @@ -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 } } diff --git a/pkg/registry/apis/peakq/render_test.go b/pkg/registry/apis/peakq/render_test.go index ea8c1a1ce0c..0e4d5f49013 100644 --- a/pkg/registry/apis/peakq/render_test.go +++ b/pkg/registry/apis/peakq/render_test.go @@ -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"]) +}