feat: added basic http support. Renamed html to Render.
This commit is contained in:
parent
15a6039b46
commit
0e45d090ab
8 changed files with 150 additions and 33 deletions
|
@ -1,5 +1,6 @@
|
||||||
fmt := import("fmt")
|
fmt := import("fmt")
|
||||||
html := import("html").new_render()
|
http := import("http")
|
||||||
|
html := import("html").Renderer()
|
||||||
|
|
||||||
added := html.ul()
|
added := html.ul()
|
||||||
for i in [1, 2, 3, 4, 5] {
|
for i in [1, 2, 3, 4, 5] {
|
||||||
|
|
19
tests/http.xgo
Normal file
19
tests/http.xgo
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
fmt := import("fmt")
|
||||||
|
http := import("http")
|
||||||
|
os := import("os")
|
||||||
|
|
||||||
|
resp := http.post_json(
|
||||||
|
"https://jsonplaceholder.typicode.com/posts", {
|
||||||
|
title: "Hello, World!",
|
||||||
|
body: "Checking shit out!",
|
||||||
|
userId: 1
|
||||||
|
}
|
||||||
|
)
|
||||||
|
if is_error(resp) {
|
||||||
|
fmt.println(resp)
|
||||||
|
os.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
body := resp.body_json
|
||||||
|
fmt.println(body)
|
||||||
|
|
|
@ -15,11 +15,11 @@ type Decoder struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Decoder) TypeName() string {
|
func (d *Decoder) TypeName() string {
|
||||||
return "*sjson.Decoder"
|
return "cjson.Decoder"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Decoder) String() string {
|
func (d *Decoder) String() string {
|
||||||
return "sjson.Decoder{...}"
|
return "cjson.Decoder{...}"
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDecoder(args ...tengo.Object) (tengo.Object, error) {
|
func NewDecoder(args ...tengo.Object) (tengo.Object, error) {
|
||||||
|
|
|
@ -10,14 +10,6 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
var Module = map[string]tengo.Object{
|
var Module = map[string]tengo.Object{
|
||||||
"__check": &tengo.BuiltinFunction{
|
|
||||||
Name: "__check",
|
|
||||||
Value: func(
|
|
||||||
args ...tengo.Object,
|
|
||||||
) (tengo.Object, error) {
|
|
||||||
return tengo.FromInterface("Hello, Check!")
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"new_decoder": &tengo.BuiltinFunction{
|
"new_decoder": &tengo.BuiltinFunction{
|
||||||
Name: "new_decoder",
|
Name: "new_decoder",
|
||||||
Value: NewDecoder,
|
Value: NewDecoder,
|
||||||
|
|
|
@ -1,37 +1,27 @@
|
||||||
package htmlx
|
package htmlx
|
||||||
|
|
||||||
import "github.com/d5/tengo/v2"
|
import "github.com/d5/tengo/v2"
|
||||||
import "log"
|
|
||||||
|
|
||||||
var Module = map[string] tengo.Object{
|
var Module = map[string] tengo.Object{
|
||||||
"new_render" : &tengo.UserFunction{
|
"Renderer" : &tengo.BuiltinFunction{
|
||||||
Name: "new_render",
|
Name: "Renderer",
|
||||||
Value: func(args ...tengo.Object) (tengo.Object, error){
|
Value: func(args ...tengo.Object) (tengo.Object, error){
|
||||||
ret := &HTML{}
|
ret := &Renderer{}
|
||||||
return ret, nil
|
return ret, nil
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
type HTML struct{
|
type Renderer struct{
|
||||||
tengo.ObjectImpl
|
tengo.ObjectImpl
|
||||||
}
|
}
|
||||||
|
|
||||||
func (html *HTML) Import(moduleName string) (any, error) {
|
func (html *Renderer) TypeName() string {
|
||||||
log.Println("import:", moduleName)
|
return "htmlx.Renderer"
|
||||||
switch moduleName {
|
|
||||||
case "html":
|
|
||||||
return html, nil
|
|
||||||
}
|
|
||||||
return nil, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (html *HTML) TypeName() string {
|
func (html *Renderer) String() (string) {
|
||||||
return "blablabla"
|
return "htmlx.Renderer{...}"
|
||||||
}
|
|
||||||
|
|
||||||
func (html *HTML) String() (string) {
|
|
||||||
return "HTML{...}"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -46,7 +36,7 @@ html.div({
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
func (html *HTML) IndexGet(
|
func (html *Renderer) IndexGet(
|
||||||
index tengo.Object,
|
index tengo.Object,
|
||||||
) (tengo.Object, error) {
|
) (tengo.Object, error) {
|
||||||
str, ok := tengo.ToString(index)
|
str, ok := tengo.ToString(index)
|
||||||
|
|
|
@ -1,7 +1,71 @@
|
||||||
package httpx
|
package httpx
|
||||||
|
|
||||||
import "github.com/d5/tengo/v2"
|
import "github.com/d5/tengo/v2"
|
||||||
|
import "net/http"
|
||||||
|
import "bytes"
|
||||||
|
import tjson "github.com/d5/tengo/v2/stdlib/json"
|
||||||
|
|
||||||
var Module = map[string] tengo.Object {
|
var Module = map[string] tengo.Object {
|
||||||
|
"get": &tengo.BuiltinFunction{
|
||||||
|
Name: "get",
|
||||||
|
Value: func(
|
||||||
|
args ...tengo.Object,
|
||||||
|
) (tengo.Object, error){
|
||||||
|
if len(args) != 1 {
|
||||||
|
return nil, tengo.ErrWrongNumArguments
|
||||||
|
}
|
||||||
|
url, ok := tengo.ToString(args[0])
|
||||||
|
if !ok {
|
||||||
|
return nil, tengo.ErrInvalidArgumentType{
|
||||||
|
Name: "first",
|
||||||
|
Expected: "string",
|
||||||
|
Found: args[0].TypeName(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resp, err := http.Get(url)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &Response{
|
||||||
|
Response: resp,
|
||||||
|
}, nil
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"post_json": &tengo.BuiltinFunction{
|
||||||
|
Name: "post",
|
||||||
|
Value: func(
|
||||||
|
args ...tengo.Object,
|
||||||
|
) (tengo.Object, error){
|
||||||
|
if len(args) < 2 {
|
||||||
|
return nil, tengo.ErrWrongNumArguments
|
||||||
|
}
|
||||||
|
url, ok := tengo.ToString(args[0])
|
||||||
|
if !ok {
|
||||||
|
return nil, tengo.ErrInvalidArgumentType{
|
||||||
|
Name: "first",
|
||||||
|
Expected: "string",
|
||||||
|
Found: args[0].TypeName(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var body bytes.Buffer
|
||||||
|
ret, err := tjson.Encode(args[1])
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
body.Write(ret)
|
||||||
|
|
||||||
|
resp, err := http.Post(
|
||||||
|
url, "application/json",
|
||||||
|
&body,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &Response{
|
||||||
|
Response: resp,
|
||||||
|
}, nil
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,16 +8,16 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type Request struct {
|
type Request struct {
|
||||||
tengo.ObjectImpl
|
|
||||||
*http.Request
|
*http.Request
|
||||||
|
tengo.ObjectImpl
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Request) TypeName() string {
|
func (r *Request) TypeName() string {
|
||||||
return "*http.Request"
|
return "http.Request"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Request) String() string {
|
func (r *Request) String() string {
|
||||||
return "*http.Request{...}"
|
return "http.Request{...}"
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Request) IndexGet(
|
func (r *Request) IndexGet(
|
||||||
|
|
51
xmodules/httpx/response.go
Normal file
51
xmodules/httpx/response.go
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
package httpx
|
||||||
|
|
||||||
|
import "net/http"
|
||||||
|
import "github.com/d5/tengo/v2"
|
||||||
|
import "io"
|
||||||
|
//import "encoding/json"
|
||||||
|
import tjson "github.com/d5/tengo/v2/stdlib/json"
|
||||||
|
|
||||||
|
type Response struct {
|
||||||
|
*http.Response
|
||||||
|
tengo.ObjectImpl
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Response) TypeName() string {
|
||||||
|
return "http.Response"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Response) String() string {
|
||||||
|
return "http.Response{...}"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Response) IndexGet(
|
||||||
|
index tengo.Object,
|
||||||
|
) (tengo.Object, error) {
|
||||||
|
key, ok := tengo.ToString(index)
|
||||||
|
if !ok {
|
||||||
|
return nil, tengo.ErrInvalidIndexValueType
|
||||||
|
}
|
||||||
|
|
||||||
|
switch key {
|
||||||
|
case "body" :
|
||||||
|
bts, err := io.ReadAll(r.Body)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &tengo.Bytes{
|
||||||
|
Value: bts,
|
||||||
|
}, nil
|
||||||
|
case "body_json" :
|
||||||
|
bts, err := io.ReadAll(r.Body)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return tjson.Decode(bts)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Nothing found.
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue