Skip to content

Commit

Permalink
feate(stdlib): add os and http module.
Browse files Browse the repository at this point in the history
  • Loading branch information
moisespsena committed May 24, 2024
1 parent 313bb95 commit 5087a93
Show file tree
Hide file tree
Showing 6 changed files with 375 additions and 1 deletion.
5 changes: 5 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,18 @@ require (
github.com/peterh/liner v1.2.2
github.com/shopspring/decimal v1.3.1
github.com/stretchr/testify v1.8.2
github.com/unapu-go/cmd-utils v0.0.0-20210819145619-98d5bccf2672
)

require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/mattn/go-runewidth v0.0.14 // indirect
github.com/moisespsena-go/path-helpers v0.0.3 // indirect
github.com/phayes/permbits v0.0.0-20190612203442-39d7c581d2ee // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rivo/uniseg v0.2.0 // indirect
golang.org/x/sys v0.8.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
mvdan.cc/sh/v3 v3.3.1 // indirect
)
31 changes: 30 additions & 1 deletion go.sum
Original file line number Diff line number Diff line change
@@ -1,15 +1,33 @@
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/creack/pty v1.1.13/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/google/renameio v1.0.1/go.mod h1:t/HQoYBZSsWSNK35C6CO/TpPLDVWvxOHboWUAweKUpk=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU=
github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/moisespsena-go/path-helpers v0.0.3 h1:SdDktF5ubateJKQNhIkiABTeG+Ct1sTvzGv5DBFKxLA=
github.com/moisespsena-go/path-helpers v0.0.3/go.mod h1:wgQw5+Ei7COdNIwKFG8eC1jyDDpTOIjjkrWPBZe1XU0=
github.com/peterh/liner v1.2.2 h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw=
github.com/peterh/liner v1.2.2/go.mod h1:xFwJyiKIXJZUKItq5dGHZSTBRAuG/CpeNpWLyiNRNwI=
github.com/phayes/permbits v0.0.0-20190612203442-39d7c581d2ee h1:P6U24L02WMfj9ymZTxl7CxS73JC99x3ukk+DBkgQGQs=
github.com/phayes/permbits v0.0.0-20190612203442-39d7c581d2ee/go.mod h1:3uODdxMgOaPYeWU7RzZLxVtJHZ/x1f/iHkBZuKJDzuY=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
Expand All @@ -19,11 +37,22 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/unapu-go/cmd-utils v0.0.0-20210819145619-98d5bccf2672 h1:RlDkuKA7H2UgQfKVgQBIzrra3q6Bd3LBn5hkiSFnAFk=
github.com/unapu-go/cmd-utils v0.0.0-20210819145619-98d5bccf2672/go.mod h1:Tkl9jCYnxcLfvxZ0k6pwAptO8Xcpntvar1W8JpGDXAo=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
mvdan.cc/editorconfig v0.2.0/go.mod h1:lvnnD3BNdBYkhq+B4uBuFFKatfp02eB6HixDvEz91C0=
mvdan.cc/sh/v3 v3.3.1 h1:aA0i7NZOc1oV5jfAH20FCz+QsmI/TX7FiAquC5Rdo5o=
mvdan.cc/sh/v3 v3.3.1/go.mod h1:DpbFT2B4fXpKiq69fEoMe+71JrmUn5aUekYy9fNKnQw=
127 changes: 127 additions & 0 deletions stdlib/http/funcs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package http

import (
"fmt"
"io"
"net/http"
"net/url"

"github.com/gad-lang/gad"
)

func Request(call gad.Call) (_ gad.Object, err error) {
var (
url = gad.Arg{
Name: "url",
TypeAssertion: gad.TypeAssertionFromTypes(gad.TStr),
}
methodVar = gad.NamedArgVar{
Name: "method",
TypeAssertion: gad.TypeAssertionFromTypes(gad.TStr),
}
bodyVar = gad.NamedArgVar{
Name: "body",
TypeAssertion: gad.TypeAssertionFromTypes(gad.TReader),
}

method = "get"
body io.Reader
)

if err = call.Args.Destructure(&url); err != nil {
return
}

if err = call.NamedArgs.Get(&methodVar, &bodyVar); err != nil {
return
}

if methodVar.Value != nil && !methodVar.Value.IsFalsy() {
method = methodVar.Value.ToString()
}

if bodyVar.Value != nil && !bodyVar.Value.IsFalsy() {
body = bodyVar.Value.(gad.Reader)
}

var r *http.Request
if r, err = http.NewRequest(method, url.Value.ToString(), body); err != nil {
return
}
return gad.ToObject(r)
}

func Get(call gad.Call) (_ gad.Object, err error) {
url := gad.Arg{
Name: "url",
}

if err = call.Args.Destructure(&url); err != nil {
return
}

var r *http.Response
if r, err = http.Get(url.Value.ToString()); err != nil {
return
}
if r.Body != nil {
defer r.Body.Close()
}
if r.StatusCode < 300 {
var b gad.Buffer
if _, err = io.Copy(&b, r.Body); err != nil {
return
}

return &b, nil
}
return nil, gad.ErrType.NewError(fmt.Sprintf("unseccessful response type %d %s", r.StatusCode, r.Status))
}

func Url(call gad.Call) (_ gad.Object, err error) {

Check failure on line 81 in stdlib/http/funcs.go

View workflow job for this annotation

GitHub Actions / Test and Build go1.21_ubuntu-latest_amd64

func Url should be URL (ST1003)
var (
s = gad.Arg{
Name: "url",
TypeAssertion: gad.TypeAssertionFromTypes(gad.TStr),
}
)

if err = call.Args.Destructure(&s); err != nil {
return
}

var Url *url.URL

Check failure on line 93 in stdlib/http/funcs.go

View workflow job for this annotation

GitHub Actions / Test and Build go1.21_ubuntu-latest_amd64

var Url should be URL (ST1003)

if Url, err = url.Parse(s.Value.ToString()); err != nil {
return
}

q := Url.Query()

call.NamedArgs.Walk(func(na *gad.KeyValue) error {
q.Add(na.K.ToString(), na.V.ToString())
return nil
})

Url.RawQuery = ""
return gad.Str(Url.String()), nil
}

func Header(call gad.Call) (gad.Object, error) {
h := make(http.Header)
call.NamedArgs.Walk(func(na *gad.KeyValue) error {
k := na.K.ToString()
switch t := na.V.(type) {
case gad.Array:
arr := make([]string, len(t))
for i, v := range t {
arr[i] = v.ToString()
}
h[k] = arr
default:
h.Add(k, t.ToString())
}
return nil
})
return gad.MustToObject(h), nil
}
27 changes: 27 additions & 0 deletions stdlib/http/http.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package http

import (
"net/http"

"github.com/gad-lang/gad"
)

var Module = gad.Dict{
"url": &gad.Function{
Name: "url",
Value: Url,
},
"header": &gad.Function{
Name: "header",
Value: Header,
},
"request": &gad.Function{
Name: "request",
Value: Request,
},
"get": &gad.Function{
Name: "get",
Value: Get,
},
"exec": gad.MustNewReflectValue(http.DefaultClient.Do),
}
145 changes: 145 additions & 0 deletions stdlib/os/funcs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
package os

import (
"os"
"reflect"

"github.com/gad-lang/gad"
"github.com/gad-lang/gad/helper"
cmdu "github.com/unapu-go/cmd-utils"
)

func Exec(c gad.Call) (o gad.Object, err error) {
var (
naio = c.NamedArgs.GetValueOrNil("io")
typ = gad.NewReflectType(reflect.TypeOf(cmdu.CmdBuilder{}))
)

if o, err = typ.Call(c); err != nil {
return
}

var (
Cmd *cmdu.Cmd
builder = o.(gad.ReflectValuer).ToInterface().(cmdu.CmdBuilder)
)

o = gad.Nil

if Cmd, err = builder.Build(nil); err != nil {
return
}

if naio != nil {
var values gad.KeyValueArray

if values, err = values.AppendObject(naio); err != nil {
return
}

var (
na = gad.NewNamedArgs(values)
stdin = helper.NamedArgOfReader("stdin")
stdout = helper.NamedArgOfWriter("stdout")
stderr = helper.NamedArgOfWriter("stderr")
)

if err = na.Get(stdin, stdout, stderr); err != nil {
return
}

if stdin.Value != nil {
Cmd.Stdin = stdin.Value.(gad.Reader).GoReader()
}
if stdout.Value != nil {
Cmd.Stdout = stdout.Value.(gad.Writer).GoWriter()
}
if stdout.Value != nil {
Cmd.Stderr = stdout.Value.(gad.Writer).GoWriter()
}
}

if err = Cmd.StartContext(c.VM.Context); err != nil {
return
}
o, _ = gad.NewReflectValue(Cmd)
err = Cmd.Wait()
return
}

func Exists(c gad.Call) (o gad.Object, err error) {
pth := &gad.Arg{
Name: "path",
TypeAssertion: gad.TypeAssertionFromTypes(gad.TStr),
}
if err = c.Args.Destructure(pth); err != nil {
return
}

if _, err = os.Stat(pth.Value.ToString()); err != nil {
if os.IsNotExist(err) {
return gad.False, nil
}
return
}
return gad.True, nil
}

func CreateFile(c gad.Call) (o gad.Object, err error) {
var (
pth = &gad.Arg{
Name: "path",
TypeAssertion: gad.TypeAssertionFromTypes(gad.TStr),
}

mode = &gad.NamedArgVar{
Name: "mode",
TypeAssertion: gad.TypeAssertionFromTypes(gad.TInt),
Value: gad.Int(0),
}

data = helper.NamedArgOfReader("data")

closes = &gad.NamedArgVar{
Name: "close",
TypeAssertion: gad.TypeAssertionFlag(),
Value: gad.No,
}
)

if err = c.Args.Destructure(pth); err != nil {
return
}
if err = c.NamedArgs.Get(mode, data, closes); err != nil {
return
}

var f *os.File

if mode := mode.Value.(gad.Int); mode > 0 {
f, err = os.OpenFile(pth.Value.ToString(), os.O_RDWR|os.O_CREATE|os.O_TRUNC, os.FileMode(mode))
} else {
f, err = os.Create(pth.Value.ToString())
}

if err != nil {
return
}

if !closes.Value.IsFalsy() {
defer f.Close()
}

o = gad.MustNewReflectValue(f)

if data.Value != nil {
if _, err = c.VM.Builtins.Call(gad.BuiltinCopy, gad.Call{
VM: c.VM,
Args: gad.Args{gad.Array{o, data.Value}},
}); err != nil {
return
}
}

return
}

0 comments on commit 5087a93

Please sign in to comment.