Skip to content

Commit

Permalink
feat: add a package net/url (#169)
Browse files Browse the repository at this point in the history
  • Loading branch information
suzuki-shunsuke authored Jun 3, 2024
1 parent d79e214 commit e922420
Show file tree
Hide file tree
Showing 2 changed files with 107 additions and 0 deletions.
52 changes: 52 additions & 0 deletions pkg/net/url/url.go
Original file line number Diff line number Diff line change
@@ -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
},
}
}
55 changes: 55 additions & 0 deletions pkg/net/url/url_test.go
Original file line number Diff line number Diff line change
@@ -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)
})
}
}

0 comments on commit e922420

Please sign in to comment.