From 1d32d54883333c971396268022764f3d421568cf Mon Sep 17 00:00:00 2001 From: Rob Crowe Date: Fri, 25 Apr 2025 10:32:29 +0100 Subject: [PATCH 1/2] bloblang: add typeid function Generate typeid string with or without a prefix, for example, `typeid("prefix")`. https://github.com/jetify-com/typeid Fix lint violation --- go.mod | 2 +- go.sum | 2 ++ internal/bloblang/query/functions.go | 30 +++++++++++++++++++++++ internal/bloblang/query/functions_test.go | 27 ++++++++++++++++++++ 4 files changed, 60 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 112f4e26a..e441c283e 100644 --- a/go.mod +++ b/go.mod @@ -37,6 +37,7 @@ require ( github.com/urfave/cli/v2 v2.27.6 github.com/xeipuuv/gojsonschema v1.2.0 github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a + go.jetify.com/typeid v1.3.0 go.opentelemetry.io/otel v1.35.0 go.opentelemetry.io/otel/trace v1.35.0 go.uber.org/multierr v1.11.0 @@ -70,7 +71,6 @@ require ( go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/otel/metric v1.35.0 // indirect golang.org/x/sys v0.32.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect ) go 1.23.0 diff --git a/go.sum b/go.sum index bd5392819..4a3a91aed 100644 --- a/go.sum +++ b/go.sum @@ -154,6 +154,8 @@ github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGC github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM= github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk= github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4= +go.jetify.com/typeid v1.3.0 h1:fuWV7oxO4mSsgpxwhaVpFXgt0IfjogR29p+XAjDCVKY= +go.jetify.com/typeid v1.3.0/go.mod h1:CtVGyt2+TSp4Rq5+ARLvGsJqdNypKBAC6INQ9TLPlmk= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= diff --git a/internal/bloblang/query/functions.go b/internal/bloblang/query/functions.go index 88044b008..6f510cc1f 100644 --- a/internal/bloblang/query/functions.go +++ b/internal/bloblang/query/functions.go @@ -15,6 +15,7 @@ import ( "github.com/gofrs/uuid/v5" gonanoid "github.com/matoous/go-nanoid/v2" "github.com/segmentio/ksuid" + "go.jetify.com/typeid" "github.com/redpanda-data/benthos/v4/internal/tracing" "github.com/redpanda-data/benthos/v4/internal/value" @@ -954,6 +955,35 @@ var _ = registerFunction( //------------------------------------------------------------------------------ +var _ = registerFunction( + NewFunctionSpec( + FunctionCategoryGeneral, "typeid", + "Generates a new typeid each time it is invoked and prints a string representation.", + NewExampleSpec("", `root.id = typeid()`), + NewExampleSpec("It is also possible to specify a prefix for the typeid", `root.id = typeid("prefix")`), + ).Param(ParamString("prefix", "An optional prefix to use for the typeid.").Optional()), + func(args *ParsedParams) (Function, error) { + prefixArg, err := args.FieldOptionalString("prefix") + if err != nil { + return nil, err + } + return ClosureFunction("function typeid", func(_ FunctionContext) (any, error) { + var prefix string + if prefixArg != nil { + prefix = *prefixArg + } + + tid, err := typeid.WithPrefix(prefix) + if err != nil { + return nil, fmt.Errorf("unable to generate typeid: %w", err) + } + return tid, nil + }, nil), nil + }, +) + +//------------------------------------------------------------------------------ + var _ = registerFunction( NewFunctionSpec( FunctionCategoryGeneral, "nanoid", diff --git a/internal/bloblang/query/functions_test.go b/internal/bloblang/query/functions_test.go index fc3efa23e..8523fc753 100644 --- a/internal/bloblang/query/functions_test.go +++ b/internal/bloblang/query/functions_test.go @@ -13,6 +13,7 @@ import ( "github.com/gofrs/uuid/v5" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "go.jetify.com/typeid" "github.com/redpanda-data/benthos/v4/internal/message" ) @@ -273,6 +274,32 @@ func TestUUIDV7FunctionAtTime(t *testing.T) { assert.Equal(t, ts.Truncate(time.Millisecond), actual, "expected: %s, got: %s", ts, actual) } +func TestTypeidFunction(t *testing.T) { + e, err := InitFunctionHelper("typeid") + require.NoError(t, err) + + res, err := e.Exec(FunctionContext{}) + require.NoError(t, err) + + id, ok := res.(typeid.AnyID) + require.True(t, ok) + require.Empty(t, id.Prefix()) + require.NotEmpty(t, id.Suffix()) +} + +func TestTypeidFunctionPrefix(t *testing.T) { + e, err := InitFunctionHelper("typeid", "user") + require.NoError(t, err) + + res, err := e.Exec(FunctionContext{}) + require.NoError(t, err) + + id, ok := res.(typeid.AnyID) + require.True(t, ok) + require.Equal(t, "user", id.Prefix()) + require.NotEmpty(t, id.Suffix()) +} + func TestNanoidFunction(t *testing.T) { e, err := InitFunctionHelper("nanoid") require.NoError(t, err) From d76536e42e62af9b45f08f6250ca379ad02d49b7 Mon Sep 17 00:00:00 2001 From: Rob Crowe Date: Wed, 28 May 2025 20:42:19 +0100 Subject: [PATCH 2/2] mod tidy --- go.mod | 1 - 1 file changed, 1 deletion(-) diff --git a/go.mod b/go.mod index 4a966ea99..7686c920d 100644 --- a/go.mod +++ b/go.mod @@ -71,7 +71,6 @@ require ( go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/otel/metric v1.36.0 // indirect golang.org/x/sys v0.33.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect ) go 1.24.1