diff --git a/go.mod b/go.mod index 84fcc1458..7686c920d 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.36.0 go.opentelemetry.io/otel/trace v1.36.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.36.0 // indirect golang.org/x/sys v0.33.0 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect ) go 1.24.1 diff --git a/go.sum b/go.sum index ddfa5eee4..b1d08e92a 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.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= 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 ded99325d..42066a00e 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)