Skip to content

Commit

Permalink
new funcs like nl and pink, ssh integration and example, errors tests…
Browse files Browse the repository at this point in the history
… starting
  • Loading branch information
refaktor committed Apr 15, 2024
1 parent 41a74f1 commit 2b4c3c1
Show file tree
Hide file tree
Showing 5 changed files with 238 additions and 0 deletions.
28 changes: 28 additions & 0 deletions evaldo/builtins.go
Original file line number Diff line number Diff line change
Expand Up @@ -5281,6 +5281,34 @@ var builtins = map[string]*env.Builtin{
},
},

"nl": {
Argsn: 1,
Doc: "Returns the argument 1 a d a newline character.",
Pure: true,
Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object {
switch s1 := arg0.(type) {
case env.String:
return *env.NewString(s1.Value + "\n")
default:
return MakeArgError(ps, 1, []env.Type{env.StringType}, "left")
}
},
},

"pink": {
Argsn: 1,
Doc: "Returns the argument 1 a d a newline character.",
Pure: true,
Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object {
switch s1 := arg0.(type) {
case env.String:
return *env.NewString("\033[35m" + s1.Value + "\033[0m")
default:
return MakeArgError(ps, 1, []env.Type{env.StringType}, "left")
}
},
},

"trim": {
Argsn: 1,
Doc: "Trims the String of spacing characters.",
Expand Down
139 changes: 139 additions & 0 deletions evaldo/builtins_ssh.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
//go:build b_ssh
// +build b_ssh

package evaldo

import (
"io"

"github.com/gliderlabs/ssh"
"github.com/jinzhu/copier"
"github.com/refaktor/rye/env"
"github.com/refaktor/rye/util"
)

/*
http-handle "/" fn { w req } { write w "Hello world!" }
ws-handle "/ws" fn { c } { forever { msg: receive c write c "GOT:" + msg }
http-serve ":9000"
new-server ":9000" |with {
.handle "/" fn { w req } { write w "Hello world!" } ,
.handle-ws "/ws" fn { c } { forever { msg: receive c write c "GOT:" + msg } } ,
.serve
}
TODO -- integrate gowabs into this and implement their example first just as handle-ws ... no rye code executed
if this all works with resetc exits multiple at the same time then implement the callFunction ... but we need to make a local programstate probably
*/

var Builtins_ssh = map[string]*env.Builtin{

"ssh-server": {
Argsn: 1,
Doc: "Create new ssh server.",
Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object {
switch addr := arg0.(type) {
case env.String:
return *env.NewNative(ps.Idx, &ssh.Server{Addr: addr.Value}, "ssh-server")
default:
ps.FailureFlag = true
return MakeArgError(ps, 1, []env.Type{env.StringType}, "ssh-server")
}

},
},
"ssh-server//handle": {
Argsn: 2,
Doc: "HTTP handle function for server.",
Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object {
switch server := arg0.(type) {
case env.Native:
switch handler := arg1.(type) {
case env.Function:
server.Value.(*ssh.Server).Handle(func(s ssh.Session) {
ps.FailureFlag = false
ps.ErrorFlag = false
ps.ReturnFlag = false
psTemp := env.ProgramState{}
copier.Copy(&psTemp, &ps)
CallFunction(handler, ps, *env.NewNative(ps.Idx, s, "ssh-session"), false, nil)
})
return arg0
default:
ps.FailureFlag = true
return MakeArgError(ps, 2, []env.Type{env.FunctionType}, "ssh-server//handle")
}
default:
ps.FailureFlag = true
return MakeArgError(ps, 1, []env.Type{env.NativeType}, "ssh-server//handle")
}
},
},
"ssh-server//password-auth": {
Argsn: 2,
Doc: "HTTP handler for password authentication.",
Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object {
switch server := arg0.(type) {
case env.Native:
switch handler := arg1.(type) {
case env.Function:
pwda := ssh.PasswordAuth(func(ctx ssh.Context, pass string) bool {
ps.FailureFlag = false
ps.ErrorFlag = false
ps.ReturnFlag = false
psTemp := env.ProgramState{}
copier.Copy(&psTemp, &ps)
newPs := CallFunction(handler, ps, *env.NewString(pass), false, nil)
return util.IsTruthy(newPs.Res)
})
server.Value.(*ssh.Server).SetOption(pwda)
return arg0
default:
ps.FailureFlag = true
return MakeArgError(ps, 2, []env.Type{env.FunctionType}, "ssh-server//handle")
}
default:
ps.FailureFlag = true
return MakeArgError(ps, 1, []env.Type{env.NativeType}, "ssh-server//handle")
}
},
},
"ssh-server//serve": {
Argsn: 1,
Doc: "Listen and serve new server.",
Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object {
switch server := arg0.(type) {
case env.Native:
server.Value.(*ssh.Server).ListenAndServe()
return arg0
default:
ps.FailureFlag = true
return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server//serve")
}
},
},

"ssh-session//write": {
Argsn: 2,
Doc: "SSH session write function.",
Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object {
switch session := arg0.(type) {
case env.Native:
switch val := arg1.(type) {
case env.String:
io.WriteString(session.Value.(ssh.Session), val.Value)
return arg0
default:
ps.FailureFlag = true
return MakeArgError(ps, 2, []env.Type{env.StringType}, "ssh-session//write")
}
default:
ps.FailureFlag = true
return MakeArgError(ps, 1, []env.Type{env.NativeType}, "ssh-session//write")
}
},
},
}
27 changes: 27 additions & 0 deletions evaldo/builtins_ssh_not.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//go:build !b_ssh
// +build !b_ssh

package evaldo

import (
"github.com/refaktor/rye/env"
)

/*
http-handle "/" fn { w req } { write w "Hello world!" }
ws-handle "/ws" fn { c } { forever { msg: receive c write c "GOT:" + msg }
http-serve ":9000"
new-server ":9000" |with {
.handle "/" fn { w req } { write w "Hello world!" } ,
.handle-ws "/ws" fn { c } { forever { msg: receive c write c "GOT:" + msg } } ,
.serve
}
TODO -- integrate gowabs into this and implement their example first just as handle-ws ... no rye code executed
if this all works with resetc exits multiple at the same time then implement the callFunction ... but we need to make a local programstate probably
*/

var Builtins_ssh = map[string]*env.Builtin{}
12 changes: 12 additions & 0 deletions examples/ssh/ssh_http_server.rye
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
rye .needs { http ssh }

ssh-server ":2222"
\handle fn { s } { write s pink "I c you :)" .nl }
\password-auth fn { p } { = "1234" } :ssh

http-server ":8080"
\handle "/" fn { w r } { .write "I htttp u" .nl } :http

go does { serve ssh } go does { serve http }

select { }
32 changes: 32 additions & 0 deletions tests/errors.rye
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
section "Runtime error detection"
""
{
group "do"
""
{ { object } }
{
error { do { print } }
error { do { 1 / 0 } }
}
group "loop"
""
{ { object } }
{
error { loop 2 { print } }
error { loop 2 { 1 / 0 } }
}
group "for"
""
{ { object } }
{
error { for [ 1 2 ] { print } }
error { for [ 1 2 ] { 1 / 0 } }
}
group "with"
""
{ { object } }
{
error { with { print } }
error { with { 1 / 0 } }
}
}

0 comments on commit 2b4c3c1

Please sign in to comment.