From e922420b2d4411d61e549de7a621ecc16011f716 Mon Sep 17 00:00:00 2001 From: Shunsuke Suzuki Date: Mon, 3 Jun 2024 15:52:57 +0900 Subject: [PATCH] feat: add a package net/url (#169) --- pkg/net/url/url.go | 52 ++++++++++++++++++++++++++++++++++++++ pkg/net/url/url_test.go | 55 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 pkg/net/url/url.go create mode 100644 pkg/net/url/url_test.go diff --git a/pkg/net/url/url.go b/pkg/net/url/url.go new file mode 100644 index 0000000..c845192 --- /dev/null +++ b/pkg/net/url/url.go @@ -0,0 +1,52 @@ +package url + +import ( + "net/url" + + "github.com/google/go-jsonnet" + "github.com/google/go-jsonnet/ast" + "github.com/lintnet/go-jsonnet-native-functions/util" +) + +func Parse(name string) *jsonnet.NativeFunction { + return &jsonnet.NativeFunction{ + Name: name, + Params: ast.Identifiers{"rawURL"}, + Func: func(s []any) (any, error) { + rawURL, ok := s[0].(string) + if !ok { + return []any{ + nil, util.NewErrorf("rawURL must be a string: %v", s[0]), + }, nil + } + u, err := url.Parse(rawURL) + if err != nil { + return []any{ + nil, util.NewError(err.Error()), + }, nil + } + q := u.Query() + query := make(map[string]any, len(q)) + for k, v := range q { + a := make([]any, len(v)) + for i, b := range v { + a[i] = b + } + query[k] = a + } + return []any{map[string]any{ + "Scheme": u.Scheme, + "Opaque": u.Opaque, + "Host": u.Host, + "Path": u.Path, + "RawPath": u.RawPath, + "OmitHost": u.OmitHost, + "ForceQuery": u.ForceQuery, + "RawQuery": u.RawQuery, + "Fragment": u.Fragment, + "RawFragment": u.RawFragment, + "Query": query, + }, nil}, nil + }, + } +} diff --git a/pkg/net/url/url_test.go b/pkg/net/url/url_test.go new file mode 100644 index 0000000..e11de59 --- /dev/null +++ b/pkg/net/url/url_test.go @@ -0,0 +1,55 @@ +package url_test + +import ( + "fmt" + "testing" + + "github.com/google/go-jsonnet" + "github.com/lintnet/go-jsonnet-native-functions/pkg/net/url" + "github.com/lintnet/go-jsonnet-native-functions/testutil" + "github.com/lintnet/go-jsonnet-native-functions/util" +) + +func TestParse(t *testing.T) { + t.Parallel() + data := []struct { + name string + rawURL any + exp []any + }{ + { + name: "true", + rawURL: `"http://example.com/foo/bar?lang=en&tag=go#top"`, + exp: []any{map[string]any{ + "Scheme": "http", + "Opaque": "", + "Host": "example.com", + "Path": "/foo/bar", + "RawPath": "", + "OmitHost": false, + "ForceQuery": false, + "RawQuery": "lang=en&tag=go", + "Fragment": "top", + "RawFragment": "", + "Query": map[string]any{ + "lang": []any{"en"}, + "tag": []any{"go"}, + }, + }, nil}, + }, + { + name: "rawURL must be a string", + rawURL: 0, + exp: []any{nil, util.NewError("rawURL must be a string: 0")}, + }, + } + vm := jsonnet.MakeVM() + vm.NativeFunction(url.Parse("url.Parse")) + for _, d := range data { + t.Run(d.name, func(t *testing.T) { + t.Parallel() + code := fmt.Sprintf(`std.native("url.Parse")(%v)`, d.rawURL) + testutil.Check(t, vm, code, d.exp) + }) + } +}