Skip to content

Commit 270fd29

Browse files
committed
bloblang: add typeid function
Generate typeid string with or without a prefix, for example, `typeid("prefix")`. https://github.com/jetify-com/typeid
1 parent 777e4fb commit 270fd29

4 files changed

Lines changed: 60 additions & 1 deletion

File tree

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ require (
3737
github.com/urfave/cli/v2 v2.27.6
3838
github.com/xeipuuv/gojsonschema v1.2.0
3939
github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a
40+
go.jetify.com/typeid v1.3.0
4041
go.opentelemetry.io/otel v1.35.0
4142
go.opentelemetry.io/otel/trace v1.35.0
4243
go.uber.org/multierr v1.11.0
@@ -70,7 +71,6 @@ require (
7071
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
7172
go.opentelemetry.io/otel/metric v1.35.0 // indirect
7273
golang.org/x/sys v0.32.0 // indirect
73-
gopkg.in/yaml.v2 v2.4.0 // indirect
7474
)
7575

7676
go 1.23.0

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,8 @@ github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGC
154154
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
155155
github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a h1:fZHgsYlfvtyqToslyjUt3VOPF4J7aK/3MPcK7xp3PDk=
156156
github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a/go.mod h1:ul22v+Nro/R083muKhosV54bj5niojjWZvU8xrevuH4=
157+
go.jetify.com/typeid v1.3.0 h1:fuWV7oxO4mSsgpxwhaVpFXgt0IfjogR29p+XAjDCVKY=
158+
go.jetify.com/typeid v1.3.0/go.mod h1:CtVGyt2+TSp4Rq5+ARLvGsJqdNypKBAC6INQ9TLPlmk=
157159
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
158160
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
159161
go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=

internal/bloblang/query/functions.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/gofrs/uuid/v5"
1616
gonanoid "github.com/matoous/go-nanoid/v2"
1717
"github.com/segmentio/ksuid"
18+
"go.jetify.com/typeid"
1819

1920
"github.com/redpanda-data/benthos/v4/internal/tracing"
2021
"github.com/redpanda-data/benthos/v4/internal/value"
@@ -954,6 +955,35 @@ var _ = registerFunction(
954955

955956
//------------------------------------------------------------------------------
956957

958+
var _ = registerFunction(
959+
NewFunctionSpec(
960+
FunctionCategoryGeneral, "typeid",
961+
"Generates a new typeid each time it is invoked and prints a string representation.",
962+
NewExampleSpec("", `root.id = typeid()`),
963+
NewExampleSpec("It is also possible to specify a prefix for the typeid", `root.id = typeid("prefix")`),
964+
).Param(ParamString("prefix", "An optional prefix to use for the typeid.").Optional()),
965+
func(args *ParsedParams) (Function, error) {
966+
prefixArg, err := args.FieldOptionalString("prefix")
967+
if err != nil {
968+
return nil, err
969+
}
970+
return ClosureFunction("function typeid", func(_ FunctionContext) (any, error) {
971+
var prefix string
972+
if prefixArg != nil {
973+
prefix = *prefixArg
974+
}
975+
976+
tid, err := typeid.WithPrefix(prefix)
977+
if err != nil {
978+
return nil, fmt.Errorf("unable to generate typeid: %w", err)
979+
}
980+
return tid, nil
981+
}, nil), nil
982+
},
983+
)
984+
985+
//------------------------------------------------------------------------------
986+
957987
var _ = registerFunction(
958988
NewFunctionSpec(
959989
FunctionCategoryGeneral, "nanoid",

internal/bloblang/query/functions_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/gofrs/uuid/v5"
1414
"github.com/stretchr/testify/assert"
1515
"github.com/stretchr/testify/require"
16+
"go.jetify.com/typeid"
1617

1718
"github.com/redpanda-data/benthos/v4/internal/message"
1819
)
@@ -273,6 +274,32 @@ func TestUUIDV7FunctionAtTime(t *testing.T) {
273274
assert.Equal(t, ts.Truncate(time.Millisecond), actual, "expected: %s, got: %s", ts, actual)
274275
}
275276

277+
func TestTypeidFunction(t *testing.T) {
278+
e, err := InitFunctionHelper("typeid")
279+
require.NoError(t, err)
280+
281+
res, err := e.Exec(FunctionContext{})
282+
require.NoError(t, err)
283+
284+
id, ok := res.(typeid.AnyID)
285+
require.True(t, ok)
286+
require.Equal(t, "", id.Prefix())
287+
require.NotEmpty(t, id.Suffix())
288+
}
289+
290+
func TestTypeidFunctionPrefix(t *testing.T) {
291+
e, err := InitFunctionHelper("typeid", "user")
292+
require.NoError(t, err)
293+
294+
res, err := e.Exec(FunctionContext{})
295+
require.NoError(t, err)
296+
297+
id, ok := res.(typeid.AnyID)
298+
require.True(t, ok)
299+
require.Equal(t, "user", id.Prefix())
300+
require.NotEmpty(t, id.Suffix())
301+
}
302+
276303
func TestNanoidFunction(t *testing.T) {
277304
e, err := InitFunctionHelper("nanoid")
278305
require.NoError(t, err)

0 commit comments

Comments
 (0)