From 4fadc9ccee02b5d92bf42b35689ac1decea0e241 Mon Sep 17 00:00:00 2001 From: refaktor Date: Wed, 15 Jul 2026 02:09:36 +0200 Subject: [PATCH 01/12] transfering and code reordering into batteries and creating a embed subpackage, still in the provess of clearing things out --- {evaldo => batteries}/builtins_bcrypt.go | 15 +- {evaldo => batteries}/builtins_bcrypt_not.go | 2 +- {evaldo => batteries}/builtins_bson.go | 17 +- {evaldo => batteries}/builtins_bson_not.go | 2 +- {evaldo => batteries}/builtins_chitosocket.go | 87 +- .../builtins_chitosocket_not.go | 2 +- {evaldo => batteries}/builtins_cli.go | 17 +- {evaldo => batteries}/builtins_cmd.go | 55 +- {evaldo => batteries}/builtins_complex.go | 15 +- {evaldo => batteries}/builtins_console.go | 11 +- {evaldo => batteries}/builtins_console_not.go | 2 +- {evaldo => batteries}/builtins_conversion.go | 17 +- {evaldo => batteries}/builtins_crypto.go | 211 ++--- {evaldo => batteries}/builtins_crypto_not.go | 2 +- {evaldo => batteries}/builtins_docker_not.go | 2 +- {evaldo => batteries}/builtins_echarts.go | 189 ++--- {evaldo => batteries}/builtins_echarts_not.go | 2 +- {evaldo => batteries}/builtins_email.go | 47 +- {evaldo => batteries}/builtins_email_not.go | 2 +- {evaldo => batteries}/builtins_encoding.go | 39 +- .../builtins_error_handling.go | 179 ++-- {evaldo => batteries}/builtins_eyr.go | 57 +- {evaldo => batteries}/builtins_flui.go | 25 +- batteries/builtins_flui_v2.go | 277 +++++++ {evaldo => batteries}/builtins_git_not.go | 2 +- {evaldo => batteries}/builtins_goroutines.go | 91 ++- .../builtins_goroutines_not.go | 2 +- {evaldo => batteries}/builtins_html.go | 61 +- {evaldo => batteries}/builtins_html_not.go | 2 +- {evaldo => batteries}/builtins_http.go | 169 ++-- {evaldo => batteries}/builtins_http_not.go | 2 +- {evaldo => batteries}/builtins_imap.go | 79 +- {evaldo => batteries}/builtins_io.go | 289 +++---- {evaldo => batteries}/builtins_io_not.go | 2 +- {evaldo => batteries}/builtins_js_interop.go | 51 +- batteries/builtins_js_interop_fixed.go | 221 +++++ .../builtins_js_interop_not.go | 2 +- {evaldo => batteries}/builtins_json.go | 11 +- {evaldo => batteries}/builtins_json_not.go | 2 +- {evaldo => batteries}/builtins_mail.go | 17 +- {evaldo => batteries}/builtins_mail_not.go | 2 +- {evaldo => batteries}/builtins_markdown.go | 75 +- {evaldo => batteries}/builtins_match.go | 33 +- {evaldo => batteries}/builtins_math.go | 170 ++-- batteries/builtins_math_not.go | 18 + {evaldo => batteries}/builtins_matrix.go | 182 +++-- batteries/builtins_matrix_not.go | 10 + {evaldo => batteries}/builtins_mcp.go | 75 +- {evaldo => batteries}/builtins_mcp_not.go | 2 +- .../builtins_mime-mail_more-raw.go | 2 +- {evaldo => batteries}/builtins_mqtt.go | 107 +-- .../builtins_msgdispatcher.go | 59 +- {evaldo => batteries}/builtins_mysql.go | 47 +- {evaldo => batteries}/builtins_mysql_not.go | 2 +- {evaldo => batteries}/builtins_os.go | 367 ++++----- {evaldo => batteries}/builtins_os_not.go | 2 +- .../builtins_persistent_contexts.go | 14 +- batteries/builtins_persistent_contexts_not.go | 23 + {evaldo => batteries}/builtins_pipes.go | 311 +++---- {evaldo => batteries}/builtins_pipes_not.go | 2 +- {evaldo => batteries}/builtins_prometheus.go | 115 +-- .../builtins_prometheus_not.go | 5 +- {evaldo => batteries}/builtins_psql.go | 43 +- {evaldo => batteries}/builtins_psql_not.go | 2 +- {evaldo => batteries}/builtins_regexp.go | 51 +- {evaldo => batteries}/builtins_smtpd.go | 13 +- {evaldo => batteries}/builtins_smtpd_not.go | 2 +- {evaldo => batteries}/builtins_sql.go | 2 +- {evaldo => batteries}/builtins_sqlite.go | 43 +- {evaldo => batteries}/builtins_sqlite_not.go | 2 +- {evaldo => batteries}/builtins_ssh.go | 25 +- {evaldo => batteries}/builtins_ssh_not.go | 2 +- {evaldo => batteries}/builtins_stackless.go | 29 +- {evaldo => batteries}/builtins_structures.go | 31 +- {evaldo => batteries}/builtins_sxml.go | 47 +- {evaldo => batteries}/builtins_sxml_not.go | 2 +- {evaldo => batteries}/builtins_table.go | 566 ++++++------- batteries/builtins_table_not.go | 12 + {evaldo => batteries}/builtins_telegrambot.go | 31 +- .../builtins_telegrambot_not.go | 2 +- {evaldo => batteries}/builtins_term.go | 33 +- {evaldo => batteries}/builtins_termstr.go | 2 +- batteries/builtins_tinygo.go | 29 + {evaldo => batteries}/builtins_trees.go | 37 +- {evaldo => batteries}/builtins_tui.go | 161 ++-- {evaldo => batteries}/builtins_tui_not.go | 2 +- {evaldo => batteries}/builtins_unique.go | 11 +- {evaldo => batteries}/builtins_validation.go | 9 +- .../builtins_validation_not.go | 7 +- {evaldo => batteries}/builtins_vector.go | 74 +- batteries/builtins_vector_not.go | 10 + {evaldo => batteries}/builtins_web.go | 29 +- {evaldo => batteries}/builtins_web_not.go | 2 +- batteries/register.go | 100 +++ embed/example/main.go | 117 +++ embed/go.mod | 35 + embed/go.sum | 60 ++ embed/rye.go | 252 ++++++ env/object.go | 104 --- env/persistent_table.go | 484 ----------- evaldo/builtins.go | 140 +--- evaldo/builtins_base_printing.go | 10 +- evaldo/builtins_base_types.go | 6 +- evaldo/evaldo.go | 2 +- evaldo/evalspruce.go_LATER | 135 --- evaldo/evalspruce_test.go_LATER | 121 --- evaldo/repl.go | 6 +- evaldo/repl_dual.go | 772 ------------------ main_wasm.go | 3 + runner/runner.go | 10 + 110 files changed, 3538 insertions(+), 4030 deletions(-) rename {evaldo => batteries}/builtins_bcrypt.go (85%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_bcrypt_not.go (88%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_bson.go (91%) rename {evaldo => batteries}/builtins_bson_not.go (87%) rename {evaldo => batteries}/builtins_chitosocket.go (78%) rename {evaldo => batteries}/builtins_chitosocket_not.go (90%) rename {evaldo => batteries}/builtins_cli.go (98%) rename {evaldo => batteries}/builtins_cmd.go (86%) rename {evaldo => batteries}/builtins_complex.go (88%) rename {evaldo => batteries}/builtins_console.go (88%) rename {evaldo => batteries}/builtins_console_not.go (87%) rename {evaldo => batteries}/builtins_conversion.go (89%) rename {evaldo => batteries}/builtins_crypto.go (83%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_crypto_not.go (88%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_docker_not.go (89%) rename {evaldo => batteries}/builtins_echarts.go (69%) rename {evaldo => batteries}/builtins_echarts_not.go (88%) rename {evaldo => batteries}/builtins_email.go (84%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_email_not.go (87%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_encoding.go (87%) rename {evaldo => batteries}/builtins_error_handling.go (88%) rename {evaldo => batteries}/builtins_eyr.go (91%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_flui.go (89%) create mode 100644 batteries/builtins_flui_v2.go rename {evaldo => batteries}/builtins_git_not.go (87%) rename {evaldo => batteries}/builtins_goroutines.go (82%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_goroutines_not.go (88%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_html.go (86%) rename {evaldo => batteries}/builtins_html_not.go (87%) rename {evaldo => batteries}/builtins_http.go (82%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_http_not.go (87%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_imap.go (84%) rename {evaldo => batteries}/builtins_io.go (80%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_io_not.go (87%) rename {evaldo => batteries}/builtins_js_interop.go (89%) create mode 100644 batteries/builtins_js_interop_fixed.go rename {evaldo => batteries}/builtins_js_interop_not.go (90%) rename {evaldo => batteries}/builtins_json.go (96%) rename {evaldo => batteries}/builtins_json_not.go (98%) rename {evaldo => batteries}/builtins_mail.go (88%) rename {evaldo => batteries}/builtins_mail_not.go (87%) rename {evaldo => batteries}/builtins_markdown.go (91%) rename {evaldo => batteries}/builtins_match.go (90%) rename {evaldo => batteries}/builtins_math.go (84%) create mode 100644 batteries/builtins_math_not.go rename {evaldo => batteries}/builtins_matrix.go (78%) create mode 100644 batteries/builtins_matrix_not.go rename {evaldo => batteries}/builtins_mcp.go (74%) rename {evaldo => batteries}/builtins_mcp_not.go (91%) rename {evaldo => batteries}/builtins_mime-mail_more-raw.go (99%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_mqtt.go (79%) rename {evaldo => batteries}/builtins_msgdispatcher.go (79%) rename {evaldo => batteries}/builtins_mysql.go (77%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_mysql_not.go (87%) rename {evaldo => batteries}/builtins_os.go (82%) rename {evaldo => batteries}/builtins_os_not.go (88%) rename {evaldo => batteries}/builtins_persistent_contexts.go (96%) create mode 100644 batteries/builtins_persistent_contexts_not.go rename {evaldo => batteries}/builtins_pipes.go (80%) rename {evaldo => batteries}/builtins_pipes_not.go (87%) rename {evaldo => batteries}/builtins_prometheus.go (75%) rename {evaldo => batteries}/builtins_prometheus_not.go (71%) rename {evaldo => batteries}/builtins_psql.go (80%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_psql_not.go (87%) rename {evaldo => batteries}/builtins_regexp.go (81%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_smtpd.go (89%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_smtpd_not.go (87%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_sql.go (99%) rename {evaldo => batteries}/builtins_sqlite.go (80%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_sqlite_not.go (88%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_ssh.go (82%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_ssh_not.go (87%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_stackless.go (84%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_structures.go (94%) rename {evaldo => batteries}/builtins_sxml.go (84%) rename {evaldo => batteries}/builtins_sxml_not.go (98%) rename {evaldo => batteries}/builtins_table.go (81%) create mode 100644 batteries/builtins_table_not.go rename {evaldo => batteries}/builtins_telegrambot.go (79%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_telegrambot_not.go (88%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_term.go (95%) rename {evaldo => batteries}/builtins_termstr.go (99%) create mode 100644 batteries/builtins_tinygo.go rename {evaldo => batteries}/builtins_trees.go (88%) rename {evaldo => batteries}/builtins_tui.go (91%) rename {evaldo => batteries}/builtins_tui_not.go (89%) rename {evaldo => batteries}/builtins_unique.go (88%) rename {evaldo => batteries}/builtins_validation.go (98%) rename {evaldo => batteries}/builtins_validation_not.go (96%) rename {evaldo => batteries}/builtins_vector.go (78%) mode change 100755 => 100644 create mode 100644 batteries/builtins_vector_not.go rename {evaldo => batteries}/builtins_web.go (85%) mode change 100755 => 100644 rename {evaldo => batteries}/builtins_web_not.go (95%) create mode 100644 batteries/register.go create mode 100644 embed/example/main.go create mode 100644 embed/go.mod create mode 100644 embed/go.sum create mode 100644 embed/rye.go delete mode 100644 env/persistent_table.go delete mode 100755 evaldo/evalspruce.go_LATER delete mode 100755 evaldo/evalspruce_test.go_LATER delete mode 100644 evaldo/repl_dual.go diff --git a/evaldo/builtins_bcrypt.go b/batteries/builtins_bcrypt.go old mode 100755 new mode 100644 similarity index 85% rename from evaldo/builtins_bcrypt.go rename to batteries/builtins_bcrypt.go index 213aef36..760afce0 --- a/evaldo/builtins_bcrypt.go +++ b/batteries/builtins_bcrypt.go @@ -1,13 +1,14 @@ //go:build !no_bcrypt // +build !no_bcrypt -package evaldo +package batteries import ( "crypto/rand" "encoding/hex" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "golang.org/x/crypto/bcrypt" ) @@ -18,12 +19,12 @@ func __bcrypt_hash(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 bytes, err := bcrypt.GenerateFromPassword([]byte(str.Value), bcrypt.DefaultCost) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Problem in hashing.", "__bcrypt_hash") + return evaldo.MakeBuiltinError(ps, "Problem in hashing.", "__bcrypt_hash") } return env.NewString(string(bytes)) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "__bcrypt_hash") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "__bcrypt_hash") } } @@ -40,11 +41,11 @@ func __bcrypt_check(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "__bcrypt_check") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "__bcrypt_check") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "__bcrypt_check") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "__bcrypt_check") } } @@ -53,12 +54,12 @@ func __generate_token(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, ar case env.Integer: b := make([]byte, n.Value) if _, err := rand.Read(b); err != nil { - return MakeBuiltinError(ps, "Problem reading random stream.", "__generate_token") + return evaldo.MakeBuiltinError(ps, "Problem reading random stream.", "__generate_token") } return env.NewString(hex.EncodeToString(b)) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "__generate_token") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "__generate_token") } } diff --git a/evaldo/builtins_bcrypt_not.go b/batteries/builtins_bcrypt_not.go old mode 100755 new mode 100644 similarity index 88% rename from evaldo/builtins_bcrypt_not.go rename to batteries/builtins_bcrypt_not.go index f57e99ed..ebbc4c0f --- a/evaldo/builtins_bcrypt_not.go +++ b/batteries/builtins_bcrypt_not.go @@ -1,7 +1,7 @@ //go:build no_bcrypt // +build no_bcrypt -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_bson.go b/batteries/builtins_bson.go similarity index 91% rename from evaldo/builtins_bson.go rename to batteries/builtins_bson.go index a9d11a3a..8e4922db 100644 --- a/evaldo/builtins_bson.go +++ b/batteries/builtins_bson.go @@ -1,12 +1,13 @@ //go:build !no_bson // +build !no_bson -package evaldo +package batteries import ( "fmt" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/drewlanenga/govector" "go.mongodb.org/mongo-driver/bson" @@ -146,7 +147,7 @@ func BsonToValue_Map(ps *env.ProgramState, val any, typ string, meta any, topLev } ret, err := govector.AsVector(rrval) if err != nil { - return makeError(ps, err.Error()) + return evaldo.MakeError(ps, err.Error()) } return *env.NewVector(ret) case "block": @@ -157,10 +158,10 @@ func BsonToValue_Map(ps *env.ProgramState, val any, typ string, meta any, topLev } return *env.NewBlock(*env.NewTSeries(rrval)) default: - return MakeBuiltinError(ps, "No matching arguments found.", "BsonToValue_Map") + return evaldo.MakeBuiltinError(ps, "No matching arguments found.", "BsonToValue_Map") } } - return MakeBuiltinError(ps, "bson type not found.", "BsonToValue_Map") + return evaldo.MakeBuiltinError(ps, "bson type not found.", "BsonToValue_Map") } func BsonToValue_Val(ps *env.ProgramState, val any, topLevel bool) env.Object { @@ -175,7 +176,7 @@ func BsonToValue_Val(ps *env.ProgramState, val any, topLevel bool) env.Object { val := BsonToValue_Map(ps, rval["col"], rval["typ"].(string), rval["met"], false) return val default: - return MakeBuiltinError(ps, "bson type not found.", "BsonToValue_Val") + return evaldo.MakeBuiltinError(ps, "bson type not found.", "BsonToValue_Val") } } @@ -201,12 +202,12 @@ var Builtins_bson = map[string]*env.Builtin{ // err := bson.Unmarshal(arg0.(env.Native).Value.([]byte), &val) err := bson.Unmarshal(arg0.(env.Bytes).Value, &val) if err != nil { - return MakeBuiltinError(ps, err.Error(), "from-bson") + return evaldo.MakeBuiltinError(ps, err.Error(), "from-bson") } return BsonToValue_Map(ps, val["val"], val["typ"].(string), val["met"], true) //return BsonToValue_Val(ps, val, true) - // return makeError(ps, "bson type not found") + // return evaldo.MakeError(ps, "bson type not found") }, }, // Tests: @@ -223,7 +224,7 @@ var Builtins_bson = map[string]*env.Builtin{ value := ValueToBSON(arg0, true) encoded, err := bson.Marshal(value) if err != nil { - return MakeBuiltinError(ps, err.Error(), "to-bson") + return evaldo.MakeBuiltinError(ps, err.Error(), "to-bson") } return *env.NewBytes(encoded) }, diff --git a/evaldo/builtins_bson_not.go b/batteries/builtins_bson_not.go similarity index 87% rename from evaldo/builtins_bson_not.go rename to batteries/builtins_bson_not.go index d61dee86..966339e0 100644 --- a/evaldo/builtins_bson_not.go +++ b/batteries/builtins_bson_not.go @@ -1,7 +1,7 @@ //go:build no_bson // +build no_bson -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_chitosocket.go b/batteries/builtins_chitosocket.go similarity index 78% rename from evaldo/builtins_chitosocket.go rename to batteries/builtins_chitosocket.go index 0384c081..b8f88432 100644 --- a/evaldo/builtins_chitosocket.go +++ b/batteries/builtins_chitosocket.go @@ -1,13 +1,14 @@ //go:build linux && !no_chitosocket // +build linux,!no_chitosocket -package evaldo +package batteries import ( "encoding/json" "net/http" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/sairash/chitosocket" ) @@ -33,12 +34,12 @@ var Builtins_chitosocket = map[string]*env.Builtin{ socket, err := chitosocket.StartUp(int(cores.Value)) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "chitosocket") + return evaldo.MakeBuiltinError(ps, err.Error(), "chitosocket") } return *env.NewNative(ps.Idx, socket, "Chitosocket-server") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "chitosocket") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "chitosocket") } }, }, @@ -58,12 +59,12 @@ var Builtins_chitosocket = map[string]*env.Builtin{ err := sock.Close() if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "Chitosocket-server//close") + return evaldo.MakeBuiltinError(ps, err.Error(), "Chitosocket-server//close") } return *env.NewInteger(1) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//close") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//close") } }, }, @@ -97,12 +98,12 @@ var Builtins_chitosocket = map[string]*env.Builtin{ dataStr := *env.NewString(string(data)) // Call the Rye handler function - CallFunctionArgs2(handler, ps, subNative, dataStr, nil) + evaldo.CallFunctionArgs2(handler, ps, subNative, dataStr, nil) } return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.FunctionType}, "Chitosocket-server//on") + return evaldo.MakeArgError(ps, 3, []env.Type{env.FunctionType}, "Chitosocket-server//on") } case env.Word: switch handler := arg2.(type) { @@ -117,20 +118,20 @@ var Builtins_chitosocket = map[string]*env.Builtin{ subNative := *env.NewNative(ps.Idx, sub, "Chitosocket-subscriber") dataStr := *env.NewString(string(data)) - CallFunctionArgs2(handler, ps, subNative, dataStr, nil) + evaldo.CallFunctionArgs2(handler, ps, subNative, dataStr, nil) } return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.FunctionType}, "Chitosocket-server//on") + return evaldo.MakeArgError(ps, 3, []env.Type{env.FunctionType}, "Chitosocket-server//on") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType, env.WordType}, "Chitosocket-server//on") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType, env.WordType}, "Chitosocket-server//on") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//on") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//on") } }, }, @@ -160,13 +161,13 @@ var Builtins_chitosocket = map[string]*env.Builtin{ if !ok1 || !ok2 { ps.FailureFlag = true - return MakeBuiltinError(ps, "Invalid HTTP request or response writer types", "Chitosocket-server//upgrade-connection") + return evaldo.MakeBuiltinError(ps, "Invalid HTTP request or response writer types", "Chitosocket-server//upgrade-connection") } conn, rw, sub, err := sock.UpgradeConnection(httpReq, httpWriter) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "Chitosocket-server//upgrade-connection") + return evaldo.MakeBuiltinError(ps, err.Error(), "Chitosocket-server//upgrade-connection") } // Return block with connection, response writer, and subscriber @@ -178,15 +179,15 @@ var Builtins_chitosocket = map[string]*env.Builtin{ return *env.NewBlock(*env.NewTSeries(result)) default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.NativeType}, "Chitosocket-server//upgrade-connection") + return evaldo.MakeArgError(ps, 3, []env.Type{env.NativeType}, "Chitosocket-server//upgrade-connection") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "Chitosocket-server//upgrade-connection") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "Chitosocket-server//upgrade-connection") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//upgrade-connection") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//upgrade-connection") } }, }, @@ -220,7 +221,7 @@ var Builtins_chitosocket = map[string]*env.Builtin{ jsonData, err := json.Marshal(data.Data) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "Chitosocket-server//emit-direct") + return evaldo.MakeBuiltinError(ps, err.Error(), "Chitosocket-server//emit-direct") } dataBytes = jsonData default: @@ -231,15 +232,15 @@ var Builtins_chitosocket = map[string]*env.Builtin{ return *env.NewInteger(1) default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.StringType}, "Chitosocket-server//emit-direct") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "Chitosocket-server//emit-direct") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "Chitosocket-server//emit-direct") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "Chitosocket-server//emit-direct") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//emit-direct") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//emit-direct") } }, }, @@ -272,7 +273,7 @@ var Builtins_chitosocket = map[string]*env.Builtin{ jsonData, err := json.Marshal(data.Data) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "Chitosocket-server//emit") + return evaldo.MakeBuiltinError(ps, err.Error(), "Chitosocket-server//emit") } dataBytes = jsonData default: @@ -284,15 +285,15 @@ var Builtins_chitosocket = map[string]*env.Builtin{ return *env.NewInteger(1) default: ps.FailureFlag = true - return MakeArgError(ps, 4, []env.Type{env.StringType}, "Chitosocket-server//emit") + return evaldo.MakeArgError(ps, 4, []env.Type{env.StringType}, "Chitosocket-server//emit") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Chitosocket-server//emit") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Chitosocket-server//emit") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//emit") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//emit") } }, }, @@ -322,7 +323,7 @@ var Builtins_chitosocket = map[string]*env.Builtin{ jsonData, err := json.Marshal(data.Data) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "Chitosocket-server//broadcast") + return evaldo.MakeBuiltinError(ps, err.Error(), "Chitosocket-server//broadcast") } dataBytes = jsonData default: @@ -333,11 +334,11 @@ var Builtins_chitosocket = map[string]*env.Builtin{ return *env.NewInteger(1) default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Chitosocket-server//broadcast") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Chitosocket-server//broadcast") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//broadcast") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//broadcast") } }, }, @@ -365,15 +366,15 @@ var Builtins_chitosocket = map[string]*env.Builtin{ return *env.NewInteger(1) default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.StringType}, "Chitosocket-server//add-to-room") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "Chitosocket-server//add-to-room") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "Chitosocket-server//add-to-room") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "Chitosocket-server//add-to-room") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//add-to-room") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//add-to-room") } }, }, @@ -401,15 +402,15 @@ var Builtins_chitosocket = map[string]*env.Builtin{ return *env.NewInteger(1) default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.StringType}, "Chitosocket-server//remove-from-room") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "Chitosocket-server//remove-from-room") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "Chitosocket-server//remove-from-room") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "Chitosocket-server//remove-from-room") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//remove-from-room") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//remove-from-room") } }, }, @@ -433,11 +434,11 @@ var Builtins_chitosocket = map[string]*env.Builtin{ return *env.NewInteger(int64(count)) default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Chitosocket-server//room-count?") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Chitosocket-server//room-count?") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//room-count?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//room-count?") } }, }, @@ -461,7 +462,7 @@ var Builtins_chitosocket = map[string]*env.Builtin{ return *env.NewString(subscriber.ID) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-subscriber//id?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-subscriber//id?") } }, }, @@ -487,11 +488,11 @@ var Builtins_chitosocket = map[string]*env.Builtin{ return env.Void{} default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Chitosocket-server//handler?") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Chitosocket-server//handler?") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//handler?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//handler?") } }, }, @@ -528,11 +529,11 @@ var Builtins_chitosocket = map[string]*env.Builtin{ return *env.NewInteger(1) default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "Chitosocket-handler//call") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "Chitosocket-handler//call") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-handler//call") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-handler//call") } }, }, @@ -556,16 +557,16 @@ var Builtins_chitosocket = map[string]*env.Builtin{ err := sock.Remove(subscriber) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "Chitosocket-server//remove") + return evaldo.MakeBuiltinError(ps, err.Error(), "Chitosocket-server//remove") } return *env.NewInteger(1) default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "Chitosocket-server//remove") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "Chitosocket-server//remove") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//remove") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Chitosocket-server//remove") } }, }, diff --git a/evaldo/builtins_chitosocket_not.go b/batteries/builtins_chitosocket_not.go similarity index 90% rename from evaldo/builtins_chitosocket_not.go rename to batteries/builtins_chitosocket_not.go index 40dd495e..c1eb7370 100644 --- a/evaldo/builtins_chitosocket_not.go +++ b/batteries/builtins_chitosocket_not.go @@ -1,7 +1,7 @@ //go:build !linux || no_chitosocket // +build !linux no_chitosocket -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_cli.go b/batteries/builtins_cli.go similarity index 98% rename from evaldo/builtins_cli.go rename to batteries/builtins_cli.go index 52bf42d0..0fabed5a 100644 --- a/evaldo/builtins_cli.go +++ b/batteries/builtins_cli.go @@ -1,13 +1,14 @@ //go:build !no_cli // +build !no_cli -package evaldo +package batteries import ( "fmt" "strings" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" ) // ArgSpec holds the specification for a single argument @@ -591,7 +592,7 @@ func validateWithCheck(es *env.ProgramState, value env.Object, spec *ArgSpec) er es.Ser = blockSer // Evaluate block with value injected - EvalBlockInj(es, value, true) + evaldo.EvalBlockInj(es, value, true) // Restore series es.Ser = ser @@ -1091,13 +1092,13 @@ func BuiParseArgs(es *env.ProgramState, args env.Object, specBlock env.Object) e argsBlock, ok := args.(env.Block) if !ok { es.FailureFlag = true - return MakeArgError(es, 1, []env.Type{env.BlockType}, "parse-args") + return evaldo.MakeArgError(es, 1, []env.Type{env.BlockType}, "parse-args") } spec, ok := specBlock.(env.Block) if !ok { es.FailureFlag = true - return MakeArgError(es, 2, []env.Type{env.BlockType}, "parse-args") + return evaldo.MakeArgError(es, 2, []env.Type{env.BlockType}, "parse-args") } // Parse the specification @@ -1298,7 +1299,7 @@ var Builtins_cli = map[string]*env.Builtin{ spec, ok := arg0.(env.Block) if !ok { es.FailureFlag = true - return MakeArgError(es, 1, []env.Type{env.BlockType}, "generate-help") + return evaldo.MakeArgError(es, 1, []env.Type{env.BlockType}, "generate-help") } cliSpec, err := CLI_ParseSpec(es, spec) @@ -1328,7 +1329,7 @@ var Builtins_cli = map[string]*env.Builtin{ spec, ok := arg0.(env.Block) if !ok { es.FailureFlag = true - return MakeArgError(es, 1, []env.Type{env.BlockType}, "generate-help\\command") + return evaldo.MakeArgError(es, 1, []env.Type{env.BlockType}, "generate-help\\command") } cmdPath := make([]string, 0) @@ -1350,7 +1351,7 @@ var Builtins_cli = map[string]*env.Builtin{ } default: es.FailureFlag = true - return MakeArgError(es, 2, []env.Type{env.StringType, env.BlockType}, "generate-help\\command") + return evaldo.MakeArgError(es, 2, []env.Type{env.StringType, env.BlockType}, "generate-help\\command") } cliSpec, err := CLI_ParseSpec(es, spec) @@ -1392,7 +1393,7 @@ var Builtins_cli = map[string]*env.Builtin{ return *env.NewString(errObj.Message) default: es.FailureFlag = true - return MakeArgError(es, 1, []env.Type{env.DictType}, "format-parse-errors") + return evaldo.MakeArgError(es, 1, []env.Type{env.DictType}, "format-parse-errors") } }, }, diff --git a/evaldo/builtins_cmd.go b/batteries/builtins_cmd.go similarity index 86% rename from evaldo/builtins_cmd.go rename to batteries/builtins_cmd.go index d0b67428..04a7666c 100644 --- a/evaldo/builtins_cmd.go +++ b/batteries/builtins_cmd.go @@ -1,4 +1,4 @@ -package evaldo +package batteries import ( "errors" @@ -9,6 +9,7 @@ import ( "strconv" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" ) type command struct { @@ -78,7 +79,7 @@ func listToCmdArgs(ps *env.ProgramState, input ...any) ([]string, *env.Error) { args = append(args, newArgs...) case env.Flagword: if it.HasLong() && it.HasShort() { - return nil, MakeBuiltinError(ps, fmt.Sprintf("ambiguous flagword %s", it.Print(*ps.Idx)), "cmd") + return nil, evaldo.MakeBuiltinError(ps, fmt.Sprintf("ambiguous flagword %s", it.Print(*ps.Idx)), "cmd") } args = append(args, it.Print(*ps.Idx)) case env.Uri: @@ -88,7 +89,7 @@ func listToCmdArgs(ps *env.ProgramState, input ...any) ([]string, *env.Error) { args = append(args, it.GetFullUri(*ps.Idx)) } default: - return nil, MakeBuiltinError(ps, fmt.Sprintf("Command argument must be string, integer, flagword, URI, or list, got %T", c), "cmd") + return nil, evaldo.MakeBuiltinError(ps, fmt.Sprintf("Command argument must be string, integer, flagword, URI, or list, got %T", c), "cmd") } } return args, nil @@ -112,7 +113,7 @@ func commandOutputFd(ps *env.ProgramState, c *command, arg1 env.Object) (io.Writ case env.Uri: file, err := os.Create(s.Path) if err != nil { - return nil, MakeBuiltinError(ps, err.Error(), "Stdout!") + return nil, evaldo.MakeBuiltinError(ps, err.Error(), "Stdout!") } c.files = append(c.files, file) return file, nil @@ -124,9 +125,9 @@ func commandOutputFd(ps *env.ProgramState, c *command, arg1 env.Object) (io.Writ case io.Writer: return it, nil } - return nil, MakeBuiltinError(ps, "arg1 must be of kind file or writer", "Stdout!") + return nil, evaldo.MakeBuiltinError(ps, "arg1 must be of kind file or writer", "Stdout!") default: - return nil, MakeArgError(ps, 2, []env.Type{env.UriType, env.NativeType}, "Stdout!") + return nil, evaldo.MakeArgError(ps, 2, []env.Type{env.UriType, env.NativeType}, "Stdout!") } } @@ -136,7 +137,7 @@ func commandInputFd(ps *env.ProgramState, c *command, arg1 env.Object) (io.Reade case env.Uri: file, err := os.Open(s.Path) if err != nil { - return nil, MakeBuiltinError(ps, err.Error(), "Stdin!") + return nil, evaldo.MakeBuiltinError(ps, err.Error(), "Stdin!") } c.files = append(c.files, file) return file, nil @@ -148,9 +149,9 @@ func commandInputFd(ps *env.ProgramState, c *command, arg1 env.Object) (io.Reade case io.Reader: return it, nil } - return nil, MakeBuiltinError(ps, "arg1 must be of kind file or reader", "Stdin!") + return nil, evaldo.MakeBuiltinError(ps, "arg1 must be of kind file or reader", "Stdin!") default: - return nil, MakeArgError(ps, 2, []env.Type{env.UriType, env.NativeType}, "Stdin!") + return nil, evaldo.MakeArgError(ps, 2, []env.Type{env.UriType, env.NativeType}, "Stdin!") } } @@ -161,7 +162,7 @@ func commandFn(name string, fn func(ps *env.ProgramState, c *command, arg0 env.O c := r.Value.(*command) return fn(ps, c, arg0, arg1, arg2, arg3, arg4) default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, name) + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, name) } } } @@ -200,7 +201,7 @@ var Builtins_cmd = map[string]*env.Builtin{ case env.Pipeword: word := it.ToWord().Print(*ps.Idx) if len(args) == 0 { - return MakeBuiltinError(ps, "missing command before pipe", "cmd") + return evaldo.MakeBuiltinError(ps, "missing command before pipe", "cmd") } pipecmd := exec.Command(args[0], args[1:]...) pipecmd.Stdin = os.Stdin @@ -208,7 +209,7 @@ var Builtins_cmd = map[string]*env.Builtin{ pipe = append(pipe, pipecmd) args = []string{word} case env.Getword: - EvalGetword(ps, it, nil, false) + evaldo.EvalGetword(ps, it, nil, false) if ps.ErrorFlag { return ps.Res } @@ -222,8 +223,8 @@ var Builtins_cmd = map[string]*env.Builtin{ ps.Ser = it.Series ps.BlockFile = it.FileName ps.BlockLine = it.Line - Eval(ps) - MaybeDisplayFailureOrError(ps, ps.Idx, "cmd") + evaldo.Eval(ps) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "cmd") if ps.ErrorFlag { ps.Ser = ser return ps.Res @@ -245,11 +246,11 @@ var Builtins_cmd = map[string]*env.Builtin{ } } default: - return MakeArgError(ps, 1, []env.Type{env.BlockType, env.ListType}, "cmd") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType, env.ListType}, "cmd") } if len(args) == 0 { - return MakeBuiltinError(ps, "missing command", "cmd") + return evaldo.MakeBuiltinError(ps, "missing command", "cmd") } cmd := exec.Command(args[0], args[1:]...) cmd.Stdin = os.Stdin @@ -274,7 +275,7 @@ var Builtins_cmd = map[string]*env.Builtin{ c.cmd.Dir = s.Path return arg0 default: - return MakeArgError(ps, 2, []env.Type{env.UriType}, "Dir!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.UriType}, "Dir!") } }), }, @@ -345,10 +346,10 @@ var Builtins_cmd = map[string]*env.Builtin{ if c2, ok := it.Value.(*command); ok { return *env.NewNative(ps.Idx, pipeCommands(c, c2), "command") } else { - return MakeBuiltinError(ps, "arg1 must be of kind command", "Pipe!") + return evaldo.MakeBuiltinError(ps, "arg1 must be of kind command", "Pipe!") } default: - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "Pipe") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "Pipe") } }), }, @@ -366,12 +367,12 @@ var Builtins_cmd = map[string]*env.Builtin{ err := c.StartPipe() if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "Run") + return evaldo.MakeBuiltinError(ps, err.Error(), "Run") } err = c.cmd.Run() if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "Run") + return evaldo.MakeBuiltinError(ps, err.Error(), "Run") } return *env.NewBoolean(true) }), @@ -393,14 +394,14 @@ var Builtins_cmd = map[string]*env.Builtin{ if err != nil { c.Close() ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "Status") + return evaldo.MakeBuiltinError(ps, err.Error(), "Status") } err = c.cmd.Run() c.Close() status := c.cmd.ProcessState.ExitCode() if err != nil && status == -1 { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "Status") + return evaldo.MakeBuiltinError(ps, err.Error(), "Status") } if len(c.pipe) > 0 { var statusList []any @@ -425,13 +426,13 @@ var Builtins_cmd = map[string]*env.Builtin{ err := c.StartPipe() if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "Output") + return evaldo.MakeBuiltinError(ps, err.Error(), "Output") } c.cmd.Stdout = nil out, err := c.cmd.Output() if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "Output") + return evaldo.MakeBuiltinError(ps, err.Error(), "Output") } return *env.NewString(string(out)) }), @@ -448,14 +449,14 @@ var Builtins_cmd = map[string]*env.Builtin{ err := c.StartPipe() if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "CombinedOutput") + return evaldo.MakeBuiltinError(ps, err.Error(), "CombinedOutput") } c.cmd.Stdout = nil c.cmd.Stderr = nil out, err := c.cmd.CombinedOutput() if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "CombinedOutput") + return evaldo.MakeBuiltinError(ps, err.Error(), "CombinedOutput") } return *env.NewString(string(out)) }), diff --git a/evaldo/builtins_complex.go b/batteries/builtins_complex.go similarity index 88% rename from evaldo/builtins_complex.go rename to batteries/builtins_complex.go index 0f4f26b5..6ca18e83 100644 --- a/evaldo/builtins_complex.go +++ b/batteries/builtins_complex.go @@ -1,9 +1,10 @@ -package evaldo +package batteries import ( "math/cmplx" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" ) var builtins_complex = map[string]*env.Builtin{ @@ -35,7 +36,7 @@ var builtins_complex = map[string]*env.Builtin{ case env.Decimal: real = r.Value default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "complex") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "complex") } // Handle imaginary part @@ -45,7 +46,7 @@ var builtins_complex = map[string]*env.Builtin{ case env.Decimal: imag = i.Value default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "complex") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "complex") } return *env.NewComplexFromParts(real, imag) @@ -87,7 +88,7 @@ var builtins_complex = map[string]*env.Builtin{ case env.Complex: return *env.NewDecimal(real(c.Value)) default: - return MakeArgError(ps, 1, []env.Type{env.ComplexType}, "real") + return evaldo.MakeArgError(ps, 1, []env.Type{env.ComplexType}, "real") } }, }, @@ -109,7 +110,7 @@ var builtins_complex = map[string]*env.Builtin{ case env.Complex: return *env.NewDecimal(imag(c.Value)) default: - return MakeArgError(ps, 1, []env.Type{env.ComplexType}, "imag") + return evaldo.MakeArgError(ps, 1, []env.Type{env.ComplexType}, "imag") } }, }, @@ -131,7 +132,7 @@ var builtins_complex = map[string]*env.Builtin{ case env.Complex: return *env.NewComplex(cmplx.Conj(z.Value)) default: - return MakeArgError(ps, 1, []env.Type{env.ComplexType}, "complex-conj") + return evaldo.MakeArgError(ps, 1, []env.Type{env.ComplexType}, "complex-conj") } }, }, @@ -153,7 +154,7 @@ var builtins_complex = map[string]*env.Builtin{ case env.Complex: return *env.NewDecimal(cmplx.Phase(z.Value)) default: - return MakeArgError(ps, 1, []env.Type{env.ComplexType}, "complex-phase") + return evaldo.MakeArgError(ps, 1, []env.Type{env.ComplexType}, "complex-phase") } }, }, diff --git a/evaldo/builtins_console.go b/batteries/builtins_console.go similarity index 88% rename from evaldo/builtins_console.go rename to batteries/builtins_console.go index 5a8e5d9c..84fa29fe 100644 --- a/evaldo/builtins_console.go +++ b/batteries/builtins_console.go @@ -1,11 +1,12 @@ //go:build !b_norepl && !wasm && !js -package evaldo +package batteries import ( "fmt" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" ) var Builtins_console = map[string]*env.Builtin{ @@ -26,7 +27,7 @@ var Builtins_console = map[string]*env.Builtin{ case env.String: ser := ps.Ser /* ps.Ser = bloc.Series - Eval(ps) + evaldo.Eval(ps) ps.Ser = ser */ //reader := bufio.NewReader(os.Stdin) @@ -50,17 +51,17 @@ var Builtins_console = map[string]*env.Builtin{ // fmt.Println(1111) block, genv := loader.LoadString("{ " + text + " }") ps := env.AddToProgramState(ps, block.Series, genv) - Eval(ps) + evaldo.Eval(ps) fmt.Println(ps.Res.Inspect(*ps.Idx)) } } */ - DoRyeRepl(ps, "rye", ShowResults, false, "") + evaldo.DoRyeRepl(ps, "rye", evaldo.ShowResults, false, "") fmt.Println("-------------------------------------------------------------") ps.Ser = ser return ps.Res default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "enter-console") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "enter-console") } }, }, diff --git a/evaldo/builtins_console_not.go b/batteries/builtins_console_not.go similarity index 87% rename from evaldo/builtins_console_not.go rename to batteries/builtins_console_not.go index 3af3ebe1..8ea9b60f 100644 --- a/evaldo/builtins_console_not.go +++ b/batteries/builtins_console_not.go @@ -1,6 +1,6 @@ //go:build b_norepl || wasm || js -package evaldo +package batteries import "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_conversion.go b/batteries/builtins_conversion.go similarity index 89% rename from evaldo/builtins_conversion.go rename to batteries/builtins_conversion.go index d4c3cd7f..b5526cb9 100644 --- a/evaldo/builtins_conversion.go +++ b/batteries/builtins_conversion.go @@ -1,7 +1,8 @@ -package evaldo +package batteries import ( "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" ) // Integer represents an integer. @@ -118,8 +119,8 @@ func conversion_evalWord(word env.Word, ps *env.ProgramState, vals env.Object) ( case env.Block: ser := ps.Ser ps.Ser = blk.Series - EvalBlockInj(ps, vals, true) - MaybeDisplayFailureOrError(ps, ps.Idx, "conversion eval word") + evaldo.EvalBlockInj(ps, vals, true) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "conversion eval word") if ps.ErrorFlag { ps.Ser = ser return ps.Res, nil @@ -153,12 +154,12 @@ func BuiConvert(ps *env.ProgramState, arg0 env.Object, arg1 env.Object) env.Obje case env.Dict: vals = Conversion_EvalBlockDict(ps, rmap) default: - return MakeArgError(ps, 1, []env.Type{env.DictType, env.ContextType}, "BuiConvert") + return evaldo.MakeArgError(ps, 1, []env.Type{env.DictType, env.ContextType}, "BuiConvert") } ps.Ser = ser1 return vals default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "BuiConvert") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "BuiConvert") } } @@ -206,13 +207,13 @@ var Builtins_conversion = map[string]*env.Builtin{ obj2.SetConverter(obj1.Kind.Index, spec) return obj2 default: - return MakeArgError(ps, 3, []env.Type{env.BlockType}, "converter") + return evaldo.MakeArgError(ps, 3, []env.Type{env.BlockType}, "converter") } default: - return MakeArgError(ps, 2, []env.Type{env.KindType, env.BlockType}, "converter") + return evaldo.MakeArgError(ps, 2, []env.Type{env.KindType, env.BlockType}, "converter") } default: - return MakeArgError(ps, 1, []env.Type{env.KindType}, "converter") + return evaldo.MakeArgError(ps, 1, []env.Type{env.KindType}, "converter") } }, }, diff --git a/evaldo/builtins_crypto.go b/batteries/builtins_crypto.go old mode 100755 new mode 100644 similarity index 83% rename from evaldo/builtins_crypto.go rename to batteries/builtins_crypto.go index d858cd12..c66c3a52 --- a/evaldo/builtins_crypto.go +++ b/batteries/builtins_crypto.go @@ -1,7 +1,7 @@ //go:build !no_crypto // +build !no_crypto -package evaldo +package batteries import ( "bytes" @@ -23,6 +23,7 @@ import ( // "x/crypto/pkcs12" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" sslmate "software.sslmate.com/src/go-pkcs12" "filippo.io/age" @@ -87,12 +88,12 @@ var Builtins_crypto = map[string]*env.Builtin{ r, err := hex.DecodeString(addr.Value) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Failure to decode string.", "decode\\hex") + return evaldo.MakeBuiltinError(ps, "Failure to decode string.", "decode\\hex") } return *env.NewBytes(r) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "decode\\hex") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "decode\\hex") } }, }, @@ -113,7 +114,7 @@ var Builtins_crypto = map[string]*env.Builtin{ return *env.NewString(hex.EncodeToString(addr.Value)) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.BytesType}, "bytes//to-string") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BytesType}, "bytes//to-string") } }, }, @@ -133,7 +134,7 @@ var Builtins_crypto = map[string]*env.Builtin{ return *env.NewString(hex.EncodeToString(addr.Value.(ed25519.PublicKey))) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Ed25519-pub-key//To-string") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Ed25519-pub-key//To-string") } }, }, @@ -153,7 +154,7 @@ var Builtins_crypto = map[string]*env.Builtin{ return *env.NewString(hex.EncodeToString(addr.Value.(ed25519.PrivateKey))) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Ed25519-priv-key//To-string") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Ed25519-priv-key//To-string") } }, }, @@ -177,7 +178,7 @@ var Builtins_crypto = map[string]*env.Builtin{ puk, pvk, err := ed25519.GenerateKey(nil) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Failed to generate keys.", "ed25519-generate-keys") + return evaldo.MakeBuiltinError(ps, "Failed to generate keys.", "ed25519-generate-keys") } keys[0] = *env.NewNative(ps.Idx, puk, "Ed25519-pub-key") keys[1] = *env.NewNative(ps.Idx, pvk, "Ed25519-priv-key") @@ -207,11 +208,11 @@ var Builtins_crypto = map[string]*env.Builtin{ pkey, err = hex.DecodeString(server.Value) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error in decoding string.", "ed25519-private-key") + return evaldo.MakeBuiltinError(ps, "Error in decoding string.", "ed25519-private-key") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType, env.StringType}, "ed25519-private-key") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType, env.StringType}, "ed25519-private-key") } return *env.NewNative(ps.Idx, ed25519.PrivateKey(pkey), "Ed25519-priv-key") @@ -239,11 +240,11 @@ var Builtins_crypto = map[string]*env.Builtin{ pkey, err = hex.DecodeString(server.Value) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error in decoding string.", "ed25519-public-key") + return evaldo.MakeBuiltinError(ps, "Error in decoding string.", "ed25519-public-key") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType, env.StringType}, "ed25519-public-key") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType, env.StringType}, "ed25519-public-key") } return *env.NewNative(ps.Idx, ed25519.PublicKey(pkey), "Ed25519-pub-key") @@ -276,11 +277,11 @@ var Builtins_crypto = map[string]*env.Builtin{ return *env.NewBytes(sigb) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "Ed25519-priv-key//Sign") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "Ed25519-priv-key//Sign") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Ed25519-priv-key//Sign") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Ed25519-priv-key//Sign") } }, }, @@ -305,7 +306,7 @@ var Builtins_crypto = map[string]*env.Builtin{ return *env.NewString(hex.EncodeToString(bs[:])) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "sha512") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "sha512") } }, }, @@ -325,7 +326,7 @@ var Builtins_crypto = map[string]*env.Builtin{ identity, err := age.GenerateX25519Identity() if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Failed to generate key pair.", "age-generate-keys") + return evaldo.MakeBuiltinError(ps, "Failed to generate key pair.", "age-generate-keys") } keys := make([]env.Object, 2) keys[0] = *env.NewNative(ps.Idx, identity, "age-identity") @@ -350,17 +351,17 @@ var Builtins_crypto = map[string]*env.Builtin{ identity, err = age.ParseX25519Identity(hex.EncodeToString(ident.Value)) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error in parsing identity: "+err.Error(), "age-identity") + return evaldo.MakeBuiltinError(ps, "Error in parsing identity: "+err.Error(), "age-identity") } case env.String: identity, err = age.ParseX25519Identity(ident.Value) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error in decoding string: "+err.Error(), "age-identity") + return evaldo.MakeBuiltinError(ps, "Error in decoding string: "+err.Error(), "age-identity") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.BytesType, env.StringType}, "age-identity") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BytesType, env.StringType}, "age-identity") } return *env.NewNative(ps.Idx, identity, "age-identity") }, @@ -381,17 +382,17 @@ var Builtins_crypto = map[string]*env.Builtin{ recipient, err = age.ParseX25519Recipient(hex.EncodeToString(rec.Value)) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error in parsing recipient: "+err.Error(), "age-recipient") + return evaldo.MakeBuiltinError(ps, "Error in parsing recipient: "+err.Error(), "age-recipient") } case env.String: recipient, err = age.ParseX25519Recipient(rec.Value) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error in decoding string: "+err.Error(), "age-recipient") + return evaldo.MakeBuiltinError(ps, "Error in decoding string: "+err.Error(), "age-recipient") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.BytesType, env.StringType}, "age-recipient") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BytesType, env.StringType}, "age-recipient") } return *env.NewNative(ps.Idx, recipient, "age-recipient") }, @@ -411,7 +412,7 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(r.GetKind()) != "reader" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "age-encrypt") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "age-encrypt") } reader := r.Value.(io.Reader) var recipient age.Recipient @@ -419,7 +420,7 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(rec.GetKind()) != "age-recipient" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "age-encrypt") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "age-encrypt") } recipient = rec.Value.(*age.X25519Recipient) case env.String: @@ -427,34 +428,34 @@ var Builtins_crypto = map[string]*env.Builtin{ recipient, err = age.NewScryptRecipient(rec.Value) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error in creating recipient: "+err.Error(), "age-encrypt") + return evaldo.MakeBuiltinError(ps, "Error in creating recipient: "+err.Error(), "age-encrypt") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType, env.StringType}, "age-encrypt") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType, env.StringType}, "age-encrypt") } buf := new(bytes.Buffer) w, err := age.Encrypt(buf, recipient) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error in encrypting: "+err.Error(), "age-encrypt") + return evaldo.MakeBuiltinError(ps, "Error in encrypting: "+err.Error(), "age-encrypt") } data, err := io.ReadAll(reader) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error reading from reader: "+err.Error(), "age-encrypt") + return evaldo.MakeBuiltinError(ps, "Error reading from reader: "+err.Error(), "age-encrypt") } if _, err := w.Write(data); err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error in writing to buffer: "+err.Error(), "age-encrypt") + return evaldo.MakeBuiltinError(ps, "Error in writing to buffer: "+err.Error(), "age-encrypt") } w.Close() return *env.NewNative(ps.Idx, bytes.NewReader(buf.Bytes()), "reader") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "age-encrypt") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "age-encrypt") } }, }, @@ -478,7 +479,7 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(r.GetKind()) != "reader" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "age-decrypt") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "age-decrypt") } reader := r.Value.(io.Reader) var identity age.Identity @@ -486,7 +487,7 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(ident.GetKind()) != "age-identity" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "age-decrypt") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "age-decrypt") } identity = ident.Value.(*age.X25519Identity) case env.String: @@ -494,21 +495,21 @@ var Builtins_crypto = map[string]*env.Builtin{ identity, err = age.NewScryptIdentity(ident.Value) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error in creating identity: "+err.Error(), "age-decrypt") + return evaldo.MakeBuiltinError(ps, "Error in creating identity: "+err.Error(), "age-decrypt") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType, env.StringType}, "age-decrypt") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType, env.StringType}, "age-decrypt") } decrypted, err := age.Decrypt(reader, identity) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error in decrypting: "+err.Error(), "age-decrypt") + return evaldo.MakeBuiltinError(ps, "Error in decrypting: "+err.Error(), "age-decrypt") } return *env.NewNative(ps.Idx, decrypted, "reader") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "age-decrypt") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "age-decrypt") } }, }, @@ -536,7 +537,7 @@ var Builtins_crypto = map[string]*env.Builtin{ blocks, err := pkcs12.ToPEM(p12Data.Value, password.Value) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, fmt.Sprintf("Failed to convert .p12 to PEM: %v", err), "pkcs12-to-pem") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to convert .p12 to PEM: %v", err), "pkcs12-to-pem") } // Return a block of PEM blocks as Native objects objects := make([]env.Object, len(blocks)) @@ -547,11 +548,11 @@ var Builtins_crypto = map[string]*env.Builtin{ return *env.NewBlock(ser) default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "pkcs12-to-pem") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "pkcs12-to-pem") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.BytesType}, "pkcs12-to-pem") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BytesType}, "pkcs12-to-pem") } }, }, @@ -564,7 +565,7 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(cert.GetKind()) != "x509-certificate" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "pkcs12-encode-to-memory") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "pkcs12-encode-to-memory") } switch key := arg1.(type) { case env.Native: @@ -574,20 +575,20 @@ var Builtins_crypto = map[string]*env.Builtin{ p12Data, err := pkcs12.EncodeToMemory(cert.Value.(*x509.Certificate), key.Value, password.Value) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, fmt.Sprintf("Failed to encode to .p12: %v", err), "pkcs12-encode-to-memory") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to encode to .p12: %v", err), "pkcs12-encode-to-memory") } return *env.NewNative(ps.Idx, p12Data, "Go-bytes") default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.StringType}, "pkcs12-encode-to-memory") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "pkcs12-encode-to-memory") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "pkcs12-encode-to-memory") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "pkcs12-encode-to-memory") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "pkcs12-encode-to-memory") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "pkcs12-encode-to-memory") } }, },*/ @@ -615,7 +616,7 @@ var Builtins_crypto = map[string]*env.Builtin{ key, cert, caCerts, err := sslmate.DecodeChain(p12Data.Value, password.Value) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, fmt.Sprintf("Failed to decode .p12: %v", err), "pkcs12-decode") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to decode .p12: %v", err), "pkcs12-decode") } // Create certificates block @@ -647,11 +648,11 @@ var Builtins_crypto = map[string]*env.Builtin{ return *env.NewBlock(ser) default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "pkcs12-decode") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "pkcs12-decode") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.BytesType}, "pkcs12-decode") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BytesType}, "pkcs12-decode") } }, }, @@ -673,17 +674,17 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(certData.GetKind()) != "pem-block" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-parse-certificate") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-parse-certificate") } pb, ok := certData.Value.(*pem.Block) if ok { return *env.NewString(pb.Type) } - return MakeBuiltinError(ps, fmt.Sprintf("Failed to parse certificate"), "x509-parse-certificate") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to parse certificate"), "x509-parse-certificate") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-parse-certificate") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-parse-certificate") } }, }, @@ -702,7 +703,7 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(certData.GetKind()) != "pem-block" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-parse-certificate") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-parse-certificate") } pb, ok := certData.Value.(*pem.Block) if ok { @@ -712,11 +713,11 @@ var Builtins_crypto = map[string]*env.Builtin{ } return *env.NewDict(headers) } - return MakeBuiltinError(ps, fmt.Sprintf("Failed to parse certificate"), "x509-parse-certificate") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to parse certificate"), "x509-parse-certificate") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-parse-certificate") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-parse-certificate") } }, }, @@ -736,22 +737,22 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(certData.GetKind()) != "pem-block" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-parse-certificate") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-parse-certificate") } pb, ok := certData.Value.(*pem.Block) if ok { cert, err := x509.ParseCertificate(pb.Bytes) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, fmt.Sprintf("Failed to parse certificate: %v", err), "x509-parse-certificate") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to parse certificate: %v", err), "x509-parse-certificate") } return *env.NewNative(ps.Idx, cert, "x509-certificate") } - return MakeBuiltinError(ps, fmt.Sprintf("Failed to parse certificate"), "x509-parse-certificate") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to parse certificate"), "x509-parse-certificate") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-parse-certificate") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-parse-certificate") } }, }, @@ -773,13 +774,13 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(cert.GetKind()) != "x509-certificate" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//is-expired") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//is-expired") } c := cert.Value.(*x509.Certificate) return *env.NewTime(c.NotAfter) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//is-expired") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//is-expired") } }, }, @@ -798,13 +799,13 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(cert.GetKind()) != "x509-certificate" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//is-expired") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//is-expired") } c := cert.Value.(*x509.Certificate) return *env.NewTime(c.NotBefore) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//is-expired") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//is-expired") } }, }, @@ -824,7 +825,7 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(cert.GetKind()) != "x509-certificate" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//is-expired") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//is-expired") } c := cert.Value.(*x509.Certificate) if time.Now().After(c.NotAfter) { @@ -833,7 +834,7 @@ var Builtins_crypto = map[string]*env.Builtin{ return env.Integer{0} // False default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//is-expired") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//is-expired") } }, }, @@ -860,7 +861,7 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Integer: if keySize.Value < 2048 { ps.FailureFlag = true - return MakeBuiltinError(ps, "Key size must be at least 2048 bits", "generate-self-signed-certificate") + return evaldo.MakeBuiltinError(ps, "Key size must be at least 2048 bits", "generate-self-signed-certificate") } // Arg1: Subject info (dict with fields like "CommonName", "Organization", etc.) switch subjectDict := arg1.(type) { @@ -869,7 +870,7 @@ var Builtins_crypto = map[string]*env.Builtin{ privateKey, err := rsa.GenerateKey(rand.Reader, int(keySize.Value)) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, fmt.Sprintf("Failed to generate RSA key: %v", err), "generate-self-signed-certificate") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to generate RSA key: %v", err), "generate-self-signed-certificate") } // Set up certificate template @@ -901,7 +902,7 @@ var Builtins_crypto = map[string]*env.Builtin{ certBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &privateKey.PublicKey, privateKey) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, fmt.Sprintf("Failed to create certificate: %v", err), "generate-self-signed-certificate") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to create certificate: %v", err), "generate-self-signed-certificate") } // Return block with [certificate, private-key] @@ -913,11 +914,11 @@ var Builtins_crypto = map[string]*env.Builtin{ return *env.NewBlock(ser) default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.DictType}, "generate-self-signed-certificate") + return evaldo.MakeArgError(ps, 2, []env.Type{env.DictType}, "generate-self-signed-certificate") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "generate-self-signed-certificate") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "generate-self-signed-certificate") } }, }, @@ -943,14 +944,14 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(certObj.GetKind()) != "x509-certificate" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "encode-to-pem") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "encode-to-pem") } cert := certObj.Value.(*x509.Certificate) switch keyObj := arg1.(type) { case env.Native: if ps.Idx.GetWord(keyObj.GetKind()) != "rsa-private-key" { ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "encode-to-pem") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "encode-to-pem") } privateKey := keyObj.Value.(*rsa.PrivateKey) // Encode certificate to PEM @@ -961,7 +962,7 @@ var Builtins_crypto = map[string]*env.Builtin{ }) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, fmt.Sprintf("Failed to encode certificate to PEM: %v", err), "encode-to-pem") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to encode certificate to PEM: %v", err), "encode-to-pem") } // Encode private key to PEM keyPEM := &bytes.Buffer{} @@ -971,7 +972,7 @@ var Builtins_crypto = map[string]*env.Builtin{ }) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, fmt.Sprintf("Failed to encode private key to PEM: %v", err), "encode-to-pem") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to encode private key to PEM: %v", err), "encode-to-pem") } // Return block with [cert-bytes, key-bytes] objects := []env.Object{ @@ -982,11 +983,11 @@ var Builtins_crypto = map[string]*env.Builtin{ return *env.NewBlock(ser) default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "encode-to-pem") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "encode-to-pem") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "encode-to-pem") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "encode-to-pem") } }, }, @@ -1008,14 +1009,14 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(certObj.GetKind()) != "x509-certificate" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "encode-to-p12") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "encode-to-p12") } cert := certObj.Value.(*x509.Certificate) switch keyObj := arg1.(type) { case env.Native: if ps.Idx.GetWord(keyObj.GetKind()) != "rsa-private-key" { ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "encode-to-p12") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "encode-to-p12") } privateKey := keyObj.Value.(*rsa.PrivateKey) switch password := arg2.(type) { @@ -1023,20 +1024,20 @@ var Builtins_crypto = map[string]*env.Builtin{ p12Bytes, err := sslmate.Encode(rand.Reader, privateKey, cert, nil, password.Value) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, fmt.Sprintf("Failed to encode to .p12: %v", err), "encode-to-p12") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to encode to .p12: %v", err), "encode-to-p12") } return *env.NewNative(ps.Idx, p12Bytes, "Go-bytes") default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.StringType}, "encode-to-p12") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "encode-to-p12") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "encode-to-p12") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "encode-to-p12") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "encode-to-p12") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "encode-to-p12") } }, }, @@ -1055,13 +1056,13 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(cert.GetKind()) != "x509-certificate" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//Subject?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//Subject?") } c := cert.Value.(*x509.Certificate) return *env.NewString(c.Subject.String()) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//Subject?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//Subject?") } }, }, @@ -1080,13 +1081,13 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(cert.GetKind()) != "x509-certificate" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//issuer?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//issuer?") } c := cert.Value.(*x509.Certificate) return *env.NewString(c.Issuer.String()) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//issuer?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//issuer?") } }, }, @@ -1105,13 +1106,13 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(cert.GetKind()) != "x509-certificate" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//serial-number?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//serial-number?") } c := cert.Value.(*x509.Certificate) return *env.NewString(c.SerialNumber.String()) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//serial-number?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//serial-number?") } }, }, @@ -1130,13 +1131,13 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(cert.GetKind()) != "x509-certificate" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//signature-algorithm?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//signature-algorithm?") } c := cert.Value.(*x509.Certificate) return *env.NewString(c.SignatureAlgorithm.String()) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//signature-algorithm?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//signature-algorithm?") } }, }, @@ -1155,13 +1156,13 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(cert.GetKind()) != "x509-certificate" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//public-key-algorithm?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//public-key-algorithm?") } c := cert.Value.(*x509.Certificate) return *env.NewString(c.PublicKeyAlgorithm.String()) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//public-key-algorithm?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//public-key-algorithm?") } }, }, @@ -1180,7 +1181,7 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(cert.GetKind()) != "x509-certificate" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//key-usage?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//key-usage?") } c := cert.Value.(*x509.Certificate) var usages []env.Object @@ -1215,7 +1216,7 @@ var Builtins_crypto = map[string]*env.Builtin{ return *env.NewBlock(ser) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//key-usage?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//key-usage?") } }, }, @@ -1234,7 +1235,7 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(cert.GetKind()) != "x509-certificate" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//extended-key-usage?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//extended-key-usage?") } c := cert.Value.(*x509.Certificate) usages := make([]env.Object, len(c.ExtKeyUsage)) @@ -1262,7 +1263,7 @@ var Builtins_crypto = map[string]*env.Builtin{ return *env.NewBlock(ser) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//extended-key-usage?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//extended-key-usage?") } }, }, @@ -1281,7 +1282,7 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(cert.GetKind()) != "x509-certificate" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//dns-names?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//dns-names?") } c := cert.Value.(*x509.Certificate) names := make([]env.Object, len(c.DNSNames)) @@ -1292,7 +1293,7 @@ var Builtins_crypto = map[string]*env.Builtin{ return *env.NewBlock(ser) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//dns-names?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//dns-names?") } }, }, @@ -1311,7 +1312,7 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(cert.GetKind()) != "x509-certificate" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//ip-addresses?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//ip-addresses?") } c := cert.Value.(*x509.Certificate) addresses := make([]env.Object, len(c.IPAddresses)) @@ -1322,7 +1323,7 @@ var Builtins_crypto = map[string]*env.Builtin{ return *env.NewBlock(ser) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//ip-addresses?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//ip-addresses?") } }, }, @@ -1341,7 +1342,7 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(cert.GetKind()) != "x509-certificate" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//email-addresses?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//email-addresses?") } c := cert.Value.(*x509.Certificate) emails := make([]env.Object, len(c.EmailAddresses)) @@ -1352,7 +1353,7 @@ var Builtins_crypto = map[string]*env.Builtin{ return *env.NewBlock(ser) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//email-addresses?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//email-addresses?") } }, }, @@ -1371,7 +1372,7 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(cert.GetKind()) != "x509-certificate" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//to-pem") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//to-pem") } c := cert.Value.(*x509.Certificate) pemBlock := &pem.Block{Type: "CERTIFICATE", Bytes: c.Raw} @@ -1379,7 +1380,7 @@ var Builtins_crypto = map[string]*env.Builtin{ return *env.NewString(string(pemBytes)) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//to-pem") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//to-pem") } }, }, @@ -1398,12 +1399,12 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(key.GetKind()) != "private-key" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "private-key//type?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "private-key//type?") } return *env.NewString(fmt.Sprintf("%T", key.Value)) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "private-key//type?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "private-key//type?") } }, }, @@ -1423,7 +1424,7 @@ var Builtins_crypto = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(cert.GetKind()) != "x509-certificate" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//to-dict") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//to-dict") } c := cert.Value.(*x509.Certificate) @@ -1526,7 +1527,7 @@ var Builtins_crypto = map[string]*env.Builtin{ return *env.NewDict(certDict) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//to-dict") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "x509-certificate//to-dict") } }, }, diff --git a/evaldo/builtins_crypto_not.go b/batteries/builtins_crypto_not.go old mode 100755 new mode 100644 similarity index 88% rename from evaldo/builtins_crypto_not.go rename to batteries/builtins_crypto_not.go index 6142dd83..7414960f --- a/evaldo/builtins_crypto_not.go +++ b/batteries/builtins_crypto_not.go @@ -1,7 +1,7 @@ //go:build no_crypto // +build no_crypto -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_docker_not.go b/batteries/builtins_docker_not.go similarity index 89% rename from evaldo/builtins_docker_not.go rename to batteries/builtins_docker_not.go index 8c752b0b..39c32a4c 100644 --- a/evaldo/builtins_docker_not.go +++ b/batteries/builtins_docker_not.go @@ -1,7 +1,7 @@ //go:build no_docker || wasm || js // +build no_docker wasm js -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_echarts.go b/batteries/builtins_echarts.go similarity index 69% rename from evaldo/builtins_echarts.go rename to batteries/builtins_echarts.go index a5d9216d..09c729e9 100644 --- a/evaldo/builtins_echarts.go +++ b/batteries/builtins_echarts.go @@ -1,7 +1,7 @@ //go:build !no_echarts // +build !no_echarts -package evaldo +package batteries import ( "io" @@ -9,6 +9,7 @@ import ( "github.com/go-echarts/go-echarts/v2/charts" "github.com/go-echarts/go-echarts/v2/opts" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" ) // ---- helpers ---- @@ -24,7 +25,7 @@ func blockToLineData(ps *env.ProgramState, blk env.Block) ([]opts.LineData, *env case env.Decimal: items = append(items, opts.LineData{Value: v.Value}) default: - return nil, MakeBuiltinError(ps, "line-data block must contain integers or decimals", "line-data") + return nil, evaldo.MakeBuiltinError(ps, "line-data block must contain integers or decimals", "line-data") } } return items, nil @@ -41,7 +42,7 @@ func blockToBarData(ps *env.ProgramState, blk env.Block) ([]opts.BarData, *env.E case env.Decimal: items = append(items, opts.BarData{Value: v.Value}) default: - return nil, MakeBuiltinError(ps, "bar-data block must contain integers or decimals", "bar-data") + return nil, evaldo.MakeBuiltinError(ps, "bar-data block must contain integers or decimals", "bar-data") } } return items, nil @@ -52,14 +53,14 @@ func blockToPieData(ps *env.ProgramState, blk env.Block) ([]opts.PieData, *env.E items := make([]opts.PieData, 0) for i := 0; i < blk.Series.Len(); i += 2 { if i+1 >= blk.Series.Len() { - return nil, MakeBuiltinError(ps, "pie-data needs pairs of name and value", "pie-data") + return nil, evaldo.MakeBuiltinError(ps, "pie-data needs pairs of name and value", "pie-data") } nameObj := blk.Series.Get(i) valueObj := blk.Series.Get(i + 1) name, ok := nameObj.(env.String) if !ok { - return nil, MakeBuiltinError(ps, "pie-data name must be string", "pie-data") + return nil, evaldo.MakeBuiltinError(ps, "pie-data name must be string", "pie-data") } var value interface{} @@ -69,7 +70,7 @@ func blockToPieData(ps *env.ProgramState, blk env.Block) ([]opts.PieData, *env.E case env.Decimal: value = v.Value default: - return nil, MakeBuiltinError(ps, "pie-data value must be integer or decimal", "pie-data") + return nil, evaldo.MakeBuiltinError(ps, "pie-data value must be integer or decimal", "pie-data") } items = append(items, opts.PieData{Name: name.Value, Value: value}) @@ -84,7 +85,7 @@ func blockToScatterData(ps *env.ProgramState, blk env.Block) ([]opts.ScatterData pointObj := blk.Series.Get(i) pointBlk, ok := pointObj.(env.Block) if !ok || pointBlk.Series.Len() != 2 { - return nil, MakeBuiltinError(ps, "scatter-data needs blocks of 2 values [x y]", "scatter-data") + return nil, evaldo.MakeBuiltinError(ps, "scatter-data needs blocks of 2 values [x y]", "scatter-data") } xObj := pointBlk.Series.Get(0) @@ -97,7 +98,7 @@ func blockToScatterData(ps *env.ProgramState, blk env.Block) ([]opts.ScatterData case env.Decimal: x = v.Value default: - return nil, MakeBuiltinError(ps, "scatter x value must be integer or decimal", "scatter-data") + return nil, evaldo.MakeBuiltinError(ps, "scatter x value must be integer or decimal", "scatter-data") } switch v := yObj.(type) { @@ -106,7 +107,7 @@ func blockToScatterData(ps *env.ProgramState, blk env.Block) ([]opts.ScatterData case env.Decimal: y = v.Value default: - return nil, MakeBuiltinError(ps, "scatter y value must be integer or decimal", "scatter-data") + return nil, evaldo.MakeBuiltinError(ps, "scatter y value must be integer or decimal", "scatter-data") } items = append(items, opts.ScatterData{Value: []interface{}{x, y}}) @@ -123,7 +124,7 @@ func blockToStringSlice(ps *env.ProgramState, blk env.Block) ([]string, *env.Err case env.String: items = append(items, v.Value) default: - return nil, MakeBuiltinError(ps, "block must contain strings", "set-x-axis") + return nil, evaldo.MakeBuiltinError(ps, "block must contain strings", "set-x-axis") } } return items, nil @@ -168,7 +169,7 @@ var Builtins_echarts = map[string]*env.Builtin{ } return *env.NewNative(ps.Idx, items, "echarts-bar-data") default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "bar-data") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "bar-data") } }, }, @@ -186,11 +187,11 @@ var Builtins_echarts = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { title, ok := arg0.(env.String) if !ok { - return MakeArgError(ps, 1, []env.Type{env.StringType}, "title-opts") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "title-opts") } subtitle, ok := arg1.(env.String) if !ok { - return MakeArgError(ps, 2, []env.Type{env.StringType}, "title-opts") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "title-opts") } titleOpts := opts.Title{ Title: title.Value, @@ -214,12 +215,12 @@ var Builtins_echarts = map[string]*env.Builtin{ case env.Native: titleOpts, ok := nat.Value.(opts.Title) if !ok { - return MakeNativeArgError(ps, 1, []string{"echarts-title-opts"}, "with-title-opts") + return evaldo.MakeNativeArgError(ps, 1, []string{"echarts-title-opts"}, "with-title-opts") } opt := charts.WithTitleOpts(titleOpts) return *env.NewNative(ps.Idx, opt, "echarts-global-opts") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "with-title-opts") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "with-title-opts") } }, }, @@ -237,11 +238,11 @@ var Builtins_echarts = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { barNat, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-bar//Global-options!") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-bar//Global-options!") } bar, ok := barNat.Value.(*charts.Bar) if !ok { - return MakeNativeArgError(ps, 1, []string{"echarts-bar"}, "echarts-bar//Global-options!") + return evaldo.MakeNativeArgError(ps, 1, []string{"echarts-bar"}, "echarts-bar//Global-options!") } // Collect options @@ -250,7 +251,7 @@ var Builtins_echarts = map[string]*env.Builtin{ case env.Native: gopt, ok := opt.Value.(charts.GlobalOpts) if !ok { - return MakeNativeArgError(ps, 2, []string{"echarts-global-opts"}, "echarts-bar//Global-options!") + return evaldo.MakeNativeArgError(ps, 2, []string{"echarts-global-opts"}, "echarts-bar//Global-options!") } gopts = append(gopts, gopt) case env.Block: @@ -258,16 +259,16 @@ var Builtins_echarts = map[string]*env.Builtin{ obj := opt.Series.Get(i) nat, ok := obj.(env.Native) if !ok { - return MakeBuiltinError(ps, "block must contain native echarts-global-opts", "echarts-bar//Global-options!") + return evaldo.MakeBuiltinError(ps, "block must contain native echarts-global-opts", "echarts-bar//Global-options!") } gopt, ok := nat.Value.(charts.GlobalOpts) if !ok { - return MakeBuiltinError(ps, "block must contain echarts-global-opts natives", "echarts-bar//Global-options!") + return evaldo.MakeBuiltinError(ps, "block must contain echarts-global-opts natives", "echarts-bar//Global-options!") } gopts = append(gopts, gopt) } default: - return MakeArgError(ps, 2, []env.Type{env.NativeType, env.BlockType}, "echarts-bar//Global-options!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType, env.BlockType}, "echarts-bar//Global-options!") } bar.SetGlobalOptions(gopts...) @@ -288,11 +289,11 @@ var Builtins_echarts = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { barNat, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-bar//X-axis!") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-bar//X-axis!") } bar, ok := barNat.Value.(*charts.Bar) if !ok { - return MakeNativeArgError(ps, 1, []string{"echarts-bar"}, "echarts-bar//X-axis!") + return evaldo.MakeNativeArgError(ps, 1, []string{"echarts-bar"}, "echarts-bar//X-axis!") } switch blk := arg1.(type) { case env.Block: @@ -303,7 +304,7 @@ var Builtins_echarts = map[string]*env.Builtin{ bar.SetXAxis(labels) return barNat default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "echarts-bar//X-axis!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "echarts-bar//X-axis!") } }, }, @@ -322,23 +323,23 @@ var Builtins_echarts = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { barNat, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-bar//Add-series") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-bar//Add-series") } bar, ok := barNat.Value.(*charts.Bar) if !ok { - return MakeNativeArgError(ps, 1, []string{"echarts-bar"}, "echarts-bar//Add-series") + return evaldo.MakeNativeArgError(ps, 1, []string{"echarts-bar"}, "echarts-bar//Add-series") } name, ok := arg1.(env.String) if !ok { - return MakeArgError(ps, 2, []env.Type{env.StringType}, "echarts-bar//Add-series") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "echarts-bar//Add-series") } dataNat, ok := arg2.(env.Native) if !ok { - return MakeArgError(ps, 3, []env.Type{env.NativeType}, "echarts-bar//Add-series") + return evaldo.MakeArgError(ps, 3, []env.Type{env.NativeType}, "echarts-bar//Add-series") } data, ok := dataNat.Value.([]opts.BarData) if !ok { - return MakeNativeArgError(ps, 3, []string{"echarts-bar-data"}, "echarts-bar//Add-series") + return evaldo.MakeNativeArgError(ps, 3, []string{"echarts-bar-data"}, "echarts-bar//Add-series") } bar.AddSeries(name.Value, data) return barNat @@ -358,23 +359,23 @@ var Builtins_echarts = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { barNat, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-bar//Render") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-bar//Render") } bar, ok := barNat.Value.(*charts.Bar) if !ok { - return MakeNativeArgError(ps, 1, []string{"echarts-bar"}, "echarts-bar//Render") + return evaldo.MakeNativeArgError(ps, 1, []string{"echarts-bar"}, "echarts-bar//Render") } writerNat, ok := arg1.(env.Native) if !ok { - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "echarts-bar//Render") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "echarts-bar//Render") } writer, ok := writerNat.Value.(io.Writer) if !ok { - return MakeNativeArgError(ps, 2, []string{"io.Writer (e.g., file)"}, "echarts-bar//Render") + return evaldo.MakeNativeArgError(ps, 2, []string{"io.Writer (e.g., file)"}, "echarts-bar//Render") } err := bar.Render(writer) if err != nil { - return MakeBuiltinError(ps, err.Error(), "echarts-bar//Render") + return evaldo.MakeBuiltinError(ps, err.Error(), "echarts-bar//Render") } return barNat }, @@ -405,7 +406,7 @@ var Builtins_echarts = map[string]*env.Builtin{ } return *env.NewNative(ps.Idx, items, "echarts-line-data") default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "line-data") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "line-data") } }, }, @@ -416,11 +417,11 @@ var Builtins_echarts = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { lineNat, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-line//Global-options!") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-line//Global-options!") } line, ok := lineNat.Value.(*charts.Line) if !ok { - return MakeNativeArgError(ps, 1, []string{"echarts-line"}, "echarts-line//Global-options!") + return evaldo.MakeNativeArgError(ps, 1, []string{"echarts-line"}, "echarts-line//Global-options!") } var gopts []charts.GlobalOpts @@ -428,7 +429,7 @@ var Builtins_echarts = map[string]*env.Builtin{ case env.Native: gopt, ok := opt.Value.(charts.GlobalOpts) if !ok { - return MakeNativeArgError(ps, 2, []string{"echarts-global-opts"}, "echarts-line//Global-options!") + return evaldo.MakeNativeArgError(ps, 2, []string{"echarts-global-opts"}, "echarts-line//Global-options!") } gopts = append(gopts, gopt) case env.Block: @@ -436,16 +437,16 @@ var Builtins_echarts = map[string]*env.Builtin{ obj := opt.Series.Get(i) nat, ok := obj.(env.Native) if !ok { - return MakeBuiltinError(ps, "block must contain native echarts-global-opts", "echarts-line//Global-options!") + return evaldo.MakeBuiltinError(ps, "block must contain native echarts-global-opts", "echarts-line//Global-options!") } gopt, ok := nat.Value.(charts.GlobalOpts) if !ok { - return MakeBuiltinError(ps, "block must contain echarts-global-opts natives", "echarts-line//Global-options!") + return evaldo.MakeBuiltinError(ps, "block must contain echarts-global-opts natives", "echarts-line//Global-options!") } gopts = append(gopts, gopt) } default: - return MakeArgError(ps, 2, []env.Type{env.NativeType, env.BlockType}, "echarts-line//Global-options!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType, env.BlockType}, "echarts-line//Global-options!") } line.SetGlobalOptions(gopts...) @@ -459,11 +460,11 @@ var Builtins_echarts = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { lineNat, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-line//X-axis!") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-line//X-axis!") } line, ok := lineNat.Value.(*charts.Line) if !ok { - return MakeNativeArgError(ps, 1, []string{"echarts-line"}, "echarts-line//X-axis!") + return evaldo.MakeNativeArgError(ps, 1, []string{"echarts-line"}, "echarts-line//X-axis!") } switch blk := arg1.(type) { case env.Block: @@ -474,7 +475,7 @@ var Builtins_echarts = map[string]*env.Builtin{ line.SetXAxis(labels) return lineNat default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "echarts-line//X-axis!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "echarts-line//X-axis!") } }, }, @@ -485,23 +486,23 @@ var Builtins_echarts = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { lineNat, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-line//Add-series") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-line//Add-series") } line, ok := lineNat.Value.(*charts.Line) if !ok { - return MakeNativeArgError(ps, 1, []string{"echarts-line"}, "echarts-line//Add-series") + return evaldo.MakeNativeArgError(ps, 1, []string{"echarts-line"}, "echarts-line//Add-series") } name, ok := arg1.(env.String) if !ok { - return MakeArgError(ps, 2, []env.Type{env.StringType}, "echarts-line//Add-series") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "echarts-line//Add-series") } dataNat, ok := arg2.(env.Native) if !ok { - return MakeArgError(ps, 3, []env.Type{env.NativeType}, "echarts-line//Add-series") + return evaldo.MakeArgError(ps, 3, []env.Type{env.NativeType}, "echarts-line//Add-series") } data, ok := dataNat.Value.([]opts.LineData) if !ok { - return MakeNativeArgError(ps, 3, []string{"echarts-line-data"}, "echarts-line//Add-series") + return evaldo.MakeNativeArgError(ps, 3, []string{"echarts-line-data"}, "echarts-line//Add-series") } line.AddSeries(name.Value, data) return lineNat @@ -514,23 +515,23 @@ var Builtins_echarts = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { lineNat, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-line//Render") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-line//Render") } line, ok := lineNat.Value.(*charts.Line) if !ok { - return MakeNativeArgError(ps, 1, []string{"echarts-line"}, "echarts-line//Render") + return evaldo.MakeNativeArgError(ps, 1, []string{"echarts-line"}, "echarts-line//Render") } writerNat, ok := arg1.(env.Native) if !ok { - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "echarts-line//Render") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "echarts-line//Render") } writer, ok := writerNat.Value.(io.Writer) if !ok { - return MakeNativeArgError(ps, 2, []string{"io.Writer"}, "echarts-line//Render") + return evaldo.MakeNativeArgError(ps, 2, []string{"io.Writer"}, "echarts-line//Render") } err := line.Render(writer) if err != nil { - return MakeBuiltinError(ps, err.Error(), "echarts-line//Render") + return evaldo.MakeBuiltinError(ps, err.Error(), "echarts-line//Render") } return lineNat }, @@ -561,7 +562,7 @@ var Builtins_echarts = map[string]*env.Builtin{ } return *env.NewNative(ps.Idx, items, "echarts-pie-data") default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "pie-data") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "pie-data") } }, }, @@ -572,11 +573,11 @@ var Builtins_echarts = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { pieNat, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-pie//Global-options!") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-pie//Global-options!") } pie, ok := pieNat.Value.(*charts.Pie) if !ok { - return MakeNativeArgError(ps, 1, []string{"echarts-pie"}, "echarts-pie//Global-options!") + return evaldo.MakeNativeArgError(ps, 1, []string{"echarts-pie"}, "echarts-pie//Global-options!") } var gopts []charts.GlobalOpts @@ -584,7 +585,7 @@ var Builtins_echarts = map[string]*env.Builtin{ case env.Native: gopt, ok := opt.Value.(charts.GlobalOpts) if !ok { - return MakeNativeArgError(ps, 2, []string{"echarts-global-opts"}, "echarts-pie//Global-options!") + return evaldo.MakeNativeArgError(ps, 2, []string{"echarts-global-opts"}, "echarts-pie//Global-options!") } gopts = append(gopts, gopt) case env.Block: @@ -592,16 +593,16 @@ var Builtins_echarts = map[string]*env.Builtin{ obj := opt.Series.Get(i) nat, ok := obj.(env.Native) if !ok { - return MakeBuiltinError(ps, "block must contain native echarts-global-opts", "echarts-pie//Global-options!") + return evaldo.MakeBuiltinError(ps, "block must contain native echarts-global-opts", "echarts-pie//Global-options!") } gopt, ok := nat.Value.(charts.GlobalOpts) if !ok { - return MakeBuiltinError(ps, "block must contain echarts-global-opts natives", "echarts-pie//Global-options!") + return evaldo.MakeBuiltinError(ps, "block must contain echarts-global-opts natives", "echarts-pie//Global-options!") } gopts = append(gopts, gopt) } default: - return MakeArgError(ps, 2, []env.Type{env.NativeType, env.BlockType}, "echarts-pie//Global-options!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType, env.BlockType}, "echarts-pie//Global-options!") } pie.SetGlobalOptions(gopts...) @@ -615,19 +616,19 @@ var Builtins_echarts = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { pieNat, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-pie//Add-series") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-pie//Add-series") } pie, ok := pieNat.Value.(*charts.Pie) if !ok { - return MakeNativeArgError(ps, 1, []string{"echarts-pie"}, "echarts-pie//Add-series") + return evaldo.MakeNativeArgError(ps, 1, []string{"echarts-pie"}, "echarts-pie//Add-series") } dataNat, ok := arg1.(env.Native) if !ok { - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "echarts-pie//Add-series") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "echarts-pie//Add-series") } data, ok := dataNat.Value.([]opts.PieData) if !ok { - return MakeNativeArgError(ps, 2, []string{"echarts-pie-data"}, "echarts-pie//Add-series") + return evaldo.MakeNativeArgError(ps, 2, []string{"echarts-pie-data"}, "echarts-pie//Add-series") } pie.AddSeries("pie", data) return pieNat @@ -640,23 +641,23 @@ var Builtins_echarts = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { pieNat, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-pie//Render") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-pie//Render") } pie, ok := pieNat.Value.(*charts.Pie) if !ok { - return MakeNativeArgError(ps, 1, []string{"echarts-pie"}, "echarts-pie//Render") + return evaldo.MakeNativeArgError(ps, 1, []string{"echarts-pie"}, "echarts-pie//Render") } writerNat, ok := arg1.(env.Native) if !ok { - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "echarts-pie//Render") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "echarts-pie//Render") } writer, ok := writerNat.Value.(io.Writer) if !ok { - return MakeNativeArgError(ps, 2, []string{"io.Writer"}, "echarts-pie//Render") + return evaldo.MakeNativeArgError(ps, 2, []string{"io.Writer"}, "echarts-pie//Render") } err := pie.Render(writer) if err != nil { - return MakeBuiltinError(ps, err.Error(), "echarts-pie//Render") + return evaldo.MakeBuiltinError(ps, err.Error(), "echarts-pie//Render") } return pieNat }, @@ -687,7 +688,7 @@ var Builtins_echarts = map[string]*env.Builtin{ } return *env.NewNative(ps.Idx, items, "echarts-scatter-data") default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "scatter-data") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "scatter-data") } }, }, @@ -698,11 +699,11 @@ var Builtins_echarts = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { scatterNat, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-scatter//Global-options!") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-scatter//Global-options!") } scatter, ok := scatterNat.Value.(*charts.Scatter) if !ok { - return MakeNativeArgError(ps, 1, []string{"echarts-scatter"}, "echarts-scatter//Global-options!") + return evaldo.MakeNativeArgError(ps, 1, []string{"echarts-scatter"}, "echarts-scatter//Global-options!") } var gopts []charts.GlobalOpts @@ -710,7 +711,7 @@ var Builtins_echarts = map[string]*env.Builtin{ case env.Native: gopt, ok := opt.Value.(charts.GlobalOpts) if !ok { - return MakeNativeArgError(ps, 2, []string{"echarts-global-opts"}, "echarts-scatter//Global-options!") + return evaldo.MakeNativeArgError(ps, 2, []string{"echarts-global-opts"}, "echarts-scatter//Global-options!") } gopts = append(gopts, gopt) case env.Block: @@ -718,16 +719,16 @@ var Builtins_echarts = map[string]*env.Builtin{ obj := opt.Series.Get(i) nat, ok := obj.(env.Native) if !ok { - return MakeBuiltinError(ps, "block must contain native echarts-global-opts", "echarts-scatter//Global-options!") + return evaldo.MakeBuiltinError(ps, "block must contain native echarts-global-opts", "echarts-scatter//Global-options!") } gopt, ok := nat.Value.(charts.GlobalOpts) if !ok { - return MakeBuiltinError(ps, "block must contain echarts-global-opts natives", "echarts-scatter//Global-options!") + return evaldo.MakeBuiltinError(ps, "block must contain echarts-global-opts natives", "echarts-scatter//Global-options!") } gopts = append(gopts, gopt) } default: - return MakeArgError(ps, 2, []env.Type{env.NativeType, env.BlockType}, "echarts-scatter//Global-options!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType, env.BlockType}, "echarts-scatter//Global-options!") } scatter.SetGlobalOptions(gopts...) @@ -741,11 +742,11 @@ var Builtins_echarts = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { scatterNat, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-scatter//X-axis!") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-scatter//X-axis!") } scatter, ok := scatterNat.Value.(*charts.Scatter) if !ok { - return MakeNativeArgError(ps, 1, []string{"echarts-scatter"}, "echarts-scatter//X-axis!") + return evaldo.MakeNativeArgError(ps, 1, []string{"echarts-scatter"}, "echarts-scatter//X-axis!") } switch blk := arg1.(type) { case env.Block: @@ -756,7 +757,7 @@ var Builtins_echarts = map[string]*env.Builtin{ scatter.SetXAxis(labels) return scatterNat default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "echarts-scatter//X-axis!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "echarts-scatter//X-axis!") } }, }, @@ -767,23 +768,23 @@ var Builtins_echarts = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { scatterNat, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-scatter//Add-series") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-scatter//Add-series") } scatter, ok := scatterNat.Value.(*charts.Scatter) if !ok { - return MakeNativeArgError(ps, 1, []string{"echarts-scatter"}, "echarts-scatter//Add-series") + return evaldo.MakeNativeArgError(ps, 1, []string{"echarts-scatter"}, "echarts-scatter//Add-series") } name, ok := arg1.(env.String) if !ok { - return MakeArgError(ps, 2, []env.Type{env.StringType}, "echarts-scatter//Add-series") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "echarts-scatter//Add-series") } dataNat, ok := arg2.(env.Native) if !ok { - return MakeArgError(ps, 3, []env.Type{env.NativeType}, "echarts-scatter//Add-series") + return evaldo.MakeArgError(ps, 3, []env.Type{env.NativeType}, "echarts-scatter//Add-series") } data, ok := dataNat.Value.([]opts.ScatterData) if !ok { - return MakeNativeArgError(ps, 3, []string{"echarts-scatter-data"}, "echarts-scatter//Add-series") + return evaldo.MakeNativeArgError(ps, 3, []string{"echarts-scatter-data"}, "echarts-scatter//Add-series") } scatter.AddSeries(name.Value, data) return scatterNat @@ -796,23 +797,23 @@ var Builtins_echarts = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { scatterNat, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-scatter//Render") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "echarts-scatter//Render") } scatter, ok := scatterNat.Value.(*charts.Scatter) if !ok { - return MakeNativeArgError(ps, 1, []string{"echarts-scatter"}, "echarts-scatter//Render") + return evaldo.MakeNativeArgError(ps, 1, []string{"echarts-scatter"}, "echarts-scatter//Render") } writerNat, ok := arg1.(env.Native) if !ok { - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "echarts-scatter//Render") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "echarts-scatter//Render") } writer, ok := writerNat.Value.(io.Writer) if !ok { - return MakeNativeArgError(ps, 2, []string{"io.Writer"}, "echarts-scatter//Render") + return evaldo.MakeNativeArgError(ps, 2, []string{"io.Writer"}, "echarts-scatter//Render") } err := scatter.Render(writer) if err != nil { - return MakeBuiltinError(ps, err.Error(), "echarts-scatter//Render") + return evaldo.MakeBuiltinError(ps, err.Error(), "echarts-scatter//Render") } return scatterNat }, @@ -839,12 +840,12 @@ var Builtins_echarts = map[string]*env.Builtin{ case env.Native: legendOpts, ok := nat.Value.(opts.Legend) if !ok { - return MakeNativeArgError(ps, 1, []string{"echarts-legend-opts"}, "with-legend-opts") + return evaldo.MakeNativeArgError(ps, 1, []string{"echarts-legend-opts"}, "with-legend-opts") } opt := charts.WithLegendOpts(legendOpts) return *env.NewNative(ps.Idx, opt, "echarts-global-opts") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "with-legend-opts") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "with-legend-opts") } }, }, @@ -866,12 +867,12 @@ var Builtins_echarts = map[string]*env.Builtin{ case env.Native: tooltipOpts, ok := nat.Value.(opts.Tooltip) if !ok { - return MakeNativeArgError(ps, 1, []string{"echarts-tooltip-opts"}, "with-tooltip-opts") + return evaldo.MakeNativeArgError(ps, 1, []string{"echarts-tooltip-opts"}, "with-tooltip-opts") } opt := charts.WithTooltipOpts(tooltipOpts) return *env.NewNative(ps.Idx, opt, "echarts-global-opts") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "with-tooltip-opts") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "with-tooltip-opts") } }, }, diff --git a/evaldo/builtins_echarts_not.go b/batteries/builtins_echarts_not.go similarity index 88% rename from evaldo/builtins_echarts_not.go rename to batteries/builtins_echarts_not.go index 70948cad..f46585f7 100644 --- a/evaldo/builtins_echarts_not.go +++ b/batteries/builtins_echarts_not.go @@ -1,7 +1,7 @@ //go:build no_echarts // +build no_echarts -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_email.go b/batteries/builtins_email.go old mode 100755 new mode 100644 similarity index 84% rename from evaldo/builtins_email.go rename to batteries/builtins_email.go index 5c1be7e8..bcc11715 --- a/evaldo/builtins_email.go +++ b/batteries/builtins_email.go @@ -1,12 +1,13 @@ //go:build !no_email // +build !no_email -package evaldo +package batteries import ( "strings" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/go-gomail/gomail" ) @@ -28,7 +29,7 @@ func __setHeader(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 en case env.Email: val = value.Address // Use email address from Email type default: - return MakeArgError(ps, 3, []env.Type{env.StringType, env.EmailType}, "gomail-message//Set-header") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType, env.EmailType}, "gomail-message//Set-header") } // Extract field name from String or Tagword switch field := arg1.(type) { @@ -37,17 +38,17 @@ func __setHeader(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 en case env.Tagword: fld = ps.Idx.GetWord(field.Index) // Convert tagword to string default: - return MakeArgError(ps, 2, []env.Type{env.StringType, env.TagwordType}, "gomail-message//Set-header") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType, env.TagwordType}, "gomail-message//Set-header") } // Set the header if both field and value are non-empty if fld != "" && val != "" { mailobj.Value.(*gomail.Message).SetHeader(fld, val) return arg0 } else { - return MakeBuiltinError(ps, "Not both values were defined.", "gomail-message//Set-header") + return evaldo.MakeBuiltinError(ps, "Not both values were defined.", "gomail-message//Set-header") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "gomail-message//Set-header") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "gomail-message//Set-header") } } @@ -65,19 +66,19 @@ func __setAddressHeader(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 4, []env.Type{env.StringType}, "gomail-message//Set-address-header") + return evaldo.MakeArgError(ps, 4, []env.Type{env.StringType}, "gomail-message//Set-address-header") } default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.StringType}, "gomail-message//Set-address-header") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "gomail-message//Set-address-header") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "gomail-message//Set-address-header") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "gomail-message//Set-address-header") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "gomail-message//Set-address-header") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "gomail-message//Set-address-header") } } @@ -93,15 +94,15 @@ func __setBody(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env. return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.StringType}, "gomail-message//Set-body") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "gomail-message//Set-body") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "gomail-message//Set-body") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "gomail-message//Set-body") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "gomail-message//Set-body") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "gomail-message//Set-body") } } @@ -116,11 +117,11 @@ func __attach(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.O return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.UriType}, "gomail-message//Attach") + return evaldo.MakeArgError(ps, 2, []env.Type{env.UriType}, "gomail-message//Attach") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "gomail-message//Attach") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "gomail-message//Attach") } } @@ -136,15 +137,15 @@ func __addAlternative(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, ar return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.StringType}, "gomail-message//Add-alternative") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "gomail-message//Add-alternative") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "gomail-message//Add-alternative") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "gomail-message//Add-alternative") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "gomail-message//Add-alternative") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "gomail-message//Add-alternative") } } @@ -161,19 +162,19 @@ func __newDialer(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 en return *env.NewNative(ps.Idx, gomail.NewDialer(url.Value, int(port.Value), username.Value, pwd.Value), "gomail-dialer") default: ps.FailureFlag = true - return MakeArgError(ps, 4, []env.Type{env.StringType}, "new-email-dialer") + return evaldo.MakeArgError(ps, 4, []env.Type{env.StringType}, "new-email-dialer") } default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.StringType}, "new-email-dialer") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "new-email-dialer") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "new-email-dialer") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "new-email-dialer") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "new-email-dialer") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "new-email-dialer") } } @@ -190,11 +191,11 @@ func __dialAndSend(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "gomail-dialer//Dial-and-send") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "gomail-dialer//Dial-and-send") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "gomail-dialer//Dial-and-send") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "gomail-dialer//Dial-and-send") } } diff --git a/evaldo/builtins_email_not.go b/batteries/builtins_email_not.go old mode 100755 new mode 100644 similarity index 87% rename from evaldo/builtins_email_not.go rename to batteries/builtins_email_not.go index 2deb46a1..e762510a --- a/evaldo/builtins_email_not.go +++ b/batteries/builtins_email_not.go @@ -1,7 +1,7 @@ //go:build no_email // +build no_email -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_encoding.go b/batteries/builtins_encoding.go similarity index 87% rename from evaldo/builtins_encoding.go rename to batteries/builtins_encoding.go index d5f62e0c..a04d7e9b 100644 --- a/evaldo/builtins_encoding.go +++ b/batteries/builtins_encoding.go @@ -1,4 +1,4 @@ -package evaldo +package batteries import ( "encoding/hex" @@ -9,6 +9,7 @@ import ( "golang.org/x/text/encoding/charmap" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" ) var Builtins_encoding = map[string]*env.Builtin{ @@ -35,12 +36,12 @@ var Builtins_encoding = map[string]*env.Builtin{ decoded, err := hex.DecodeString(hexStr.Value) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Failed to decode hex string: "+err.Error(), "hex\\decode-string") + return evaldo.MakeBuiltinError(ps, "Failed to decode hex string: "+err.Error(), "hex\\decode-string") } return *env.NewString(string(decoded)) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "hex\\decode-string") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "hex\\decode-string") } }, }, @@ -64,7 +65,7 @@ var Builtins_encoding = map[string]*env.Builtin{ return *env.NewString(encoded) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "hex\\encode-string") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "hex\\encode-string") } }, }, @@ -99,7 +100,7 @@ var Builtins_encoding = map[string]*env.Builtin{ return *env.NewString(result) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "hex\\clean-string") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "hex\\clean-string") } }, }, @@ -232,14 +233,14 @@ var Builtins_encoding = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(encoding.GetKind()) != "charmap-encoding" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "charmap-encoding\\new-decoder") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "charmap-encoding\\new-decoder") } enc := encoding.Value.(*charmap.Charmap) decoder := enc.NewDecoder() return *env.NewNative(ps.Idx, decoder, "text-decoder") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "charmap-encoding\\new-decoder") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "charmap-encoding\\new-decoder") } }, }, @@ -260,14 +261,14 @@ var Builtins_encoding = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(encoding.GetKind()) != "charmap-encoding" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "charmap-encoding\\new-encoder") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "charmap-encoding\\new-encoder") } enc := encoding.Value.(*charmap.Charmap) encoder := enc.NewEncoder() return *env.NewNative(ps.Idx, encoder, "text-encoder") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "charmap-encoding\\new-encoder") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "charmap-encoding\\new-encoder") } }, }, @@ -290,7 +291,7 @@ var Builtins_encoding = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(decoder.GetKind()) != "text-decoder" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "text-decoder\\string") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "text-decoder\\string") } switch input := arg1.(type) { case env.String: @@ -298,16 +299,16 @@ var Builtins_encoding = map[string]*env.Builtin{ decoded, err := dec.String(input.Value) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Failed to decode string: "+err.Error(), "text-decoder\\string") + return evaldo.MakeBuiltinError(ps, "Failed to decode string: "+err.Error(), "text-decoder\\string") } return *env.NewString(decoded) default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "text-decoder\\string") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "text-decoder\\string") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "text-decoder\\string") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "text-decoder\\string") } }, }, @@ -329,7 +330,7 @@ var Builtins_encoding = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(encoder.GetKind()) != "text-encoder" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "text-encoder\\string") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "text-encoder\\string") } switch input := arg1.(type) { case env.String: @@ -337,16 +338,16 @@ var Builtins_encoding = map[string]*env.Builtin{ encoded, err := enc.String(input.Value) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Failed to encode string: "+err.Error(), "text-encoder\\string") + return evaldo.MakeBuiltinError(ps, "Failed to encode string: "+err.Error(), "text-encoder\\string") } return *env.NewString(encoded) default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "text-encoder\\string") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "text-encoder\\string") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "text-encoder\\string") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "text-encoder\\string") } }, }, @@ -383,7 +384,7 @@ var Builtins_encoding = map[string]*env.Builtin{ return *env.NewInteger(0) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "is-space?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "is-space?") } }, }, @@ -413,7 +414,7 @@ var Builtins_encoding = map[string]*env.Builtin{ return *env.NewString(sb.String()) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "remove-all-space") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "remove-all-space") } }, }, diff --git a/evaldo/builtins_error_handling.go b/batteries/builtins_error_handling.go similarity index 88% rename from evaldo/builtins_error_handling.go rename to batteries/builtins_error_handling.go index d5c6b489..b970ea55 100644 --- a/evaldo/builtins_error_handling.go +++ b/batteries/builtins_error_handling.go @@ -1,11 +1,12 @@ // builtins_error_handling.go -package evaldo +package batteries import ( "fmt" "time" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/refaktor/rye/util" ) @@ -27,7 +28,7 @@ var ErrorCreationBuiltins = map[string]*env.Builtin{ Doc: "Creates an error and sets the failure flag, but continues execution (unlike ^fail).", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { ps.FailureFlag = true - return MakeRyeError(ps, arg0, nil) + return evaldo.MakeRyeError(ps, arg0, nil) }, }, @@ -46,7 +47,7 @@ var ErrorCreationBuiltins = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { ps.FailureFlag = true ps.ReturnFlag = true - return MakeRyeError(ps, arg0, nil) + return evaldo.MakeRyeError(ps, arg0, nil) }, }, @@ -57,9 +58,9 @@ var ErrorCreationBuiltins = map[string]*env.Builtin{ switch er := arg0.(type) { case *env.Error: ps.FailureFlag = true - return MakeRyeError(ps, arg1, er) + return evaldo.MakeRyeError(ps, arg1, er) default: - return MakeArgError(ps, 1, []env.Type{env.ErrorType}, "reraise") + return evaldo.MakeArgError(ps, 1, []env.Type{env.ErrorType}, "reraise") } }, }, @@ -76,7 +77,7 @@ var ErrorCreationBuiltins = map[string]*env.Builtin{ Argsn: 1, Doc: "Creates an error object without setting any flags (unlike fail and ^fail).", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { - return MakeRyeError(ps, arg0, nil) + return evaldo.MakeRyeError(ps, arg0, nil) }, }, @@ -92,7 +93,7 @@ var ErrorCreationBuiltins = map[string]*env.Builtin{ Argsn: 0, Doc: "Creates an 404 error object without setting any flags.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { - return MakeRyeError(ps, *env.NewInteger(404), nil) + return evaldo.MakeRyeError(ps, *env.NewInteger(404), nil) }, }, @@ -110,9 +111,9 @@ var ErrorCreationBuiltins = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch er := arg1.(type) { case *env.Error: - return MakeRyeError(ps, arg0, er) + return evaldo.MakeRyeError(ps, arg0, er) default: - return MakeArgError(ps, 2, []env.Type{env.ErrorType}, "wrap\\failure") + return evaldo.MakeArgError(ps, 2, []env.Type{env.ErrorType}, "wrap\\failure") } }, }, @@ -188,7 +189,7 @@ var ErrorInspectionBuiltins = map[string]*env.Builtin{ kindIndex = kind.Index default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.WordType, env.TagwordType}, "is-error-of-kind") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.TagwordType}, "is-error-of-kind") } // Check if the error is of the specified kind @@ -232,7 +233,7 @@ var ErrorInspectionBuiltins = map[string]*env.Builtin{ return *current default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.ErrorType}, "cause?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.ErrorType}, "cause?") } }, }, @@ -257,7 +258,7 @@ var ErrorInspectionBuiltins = map[string]*env.Builtin{ return *env.NewInteger(int64(er.Status)) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.ErrorType}, "status?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.ErrorType}, "status?") } }, }, @@ -282,7 +283,7 @@ var ErrorInspectionBuiltins = map[string]*env.Builtin{ return *env.NewString(er.Message) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.ErrorType}, "message?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.ErrorType}, "message?") } }, }, @@ -308,7 +309,7 @@ var ErrorInspectionBuiltins = map[string]*env.Builtin{ originalMap = er.Values default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.ErrorType}, "details?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.ErrorType}, "details?") } convertedMap := make(map[string]any) @@ -428,12 +429,12 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ if er.Status == 0 && er.Message == "" { er = nil } - return MakeRyeError(ps, arg1, er) + return evaldo.MakeRyeError(ps, arg1, er) case env.Error: // todo .. make Error type .. make error construction micro dialect, return the error wrapping error that caused it // if er.Status == 0 && er.Message == "" { // er = nil // } - return MakeRyeError(ps, arg1, &er) + return evaldo.MakeRyeError(ps, arg1, &er) } return env.NewError("Failure flag but value not Failure") } @@ -461,12 +462,12 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ if er.Status == 0 && er.Message == "" { er = nil } - return MakeRyeError(ps, arg1, er) + return evaldo.MakeRyeError(ps, arg1, er) case env.Error: // todo .. make Error type .. make error construction micro dialect, return the error wrapping error that caused it // if er.Status == 0 && er.Message == "" { // er = nil // } - return MakeRyeError(ps, arg1, &er) + return evaldo.MakeRyeError(ps, arg1, &er) } return env.NewError("Failure flag but value not Failure") } @@ -492,7 +493,7 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ if !util.IsTruthy(cond) { ps.FailureFlag = true ps.ReturnFlag = true - return MakeRyeError(ps, arg1, nil) + return evaldo.MakeRyeError(ps, arg1, nil) } else { return arg0 } @@ -518,7 +519,7 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ case env.Object: if !util.IsTruthy(cond) { ps.FailureFlag = true - return MakeRyeError(ps, arg1, nil) + return evaldo.MakeRyeError(ps, arg1, nil) } else { return arg0 } @@ -576,10 +577,10 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ errorMsg = fmt.Sprintf("Value %s does not match any valid option", valueStr) } - return MakeRyeError(ps, *env.NewString(errorMsg), nil) + return evaldo.MakeRyeError(ps, *env.NewString(errorMsg), nil) default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "requires-one-of") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "requires-one-of") } }, }, @@ -633,10 +634,10 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ errorMsg = fmt.Sprintf("Value %s does not match any valid option", valueStr) } ps.ReturnFlag = true - return MakeRyeError(ps, *env.NewString(errorMsg), nil) + return evaldo.MakeRyeError(ps, *env.NewString(errorMsg), nil) default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "requires-one-of") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "requires-one-of") } }, }, @@ -660,7 +661,7 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ case env.Block: ser := ps.Ser ps.Ser = bloc.Series - EvalBlockInj(ps, arg0, true) + evaldo.EvalBlockInj(ps, arg0, true) if ps.ErrorFlag { ps.Ser = ser return ps.Res @@ -670,11 +671,11 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ return arg0 } else { ps.FailureFlag = true - return MakeRyeError(ps, arg2, nil) + return evaldo.MakeRyeError(ps, arg2, nil) } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "ensure\\with") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "ensure\\with") } }, }, @@ -697,7 +698,7 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ case env.Block: ser := ps.Ser ps.Ser = bloc.Series - EvalBlockInj(ps, arg0, true) + evaldo.EvalBlockInj(ps, arg0, true) if ps.ErrorFlag { ps.Ser = ser ps.ReturnFlag = true @@ -709,12 +710,12 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ } else { ps.FailureFlag = true ps.ReturnFlag = true - return MakeRyeError(ps, arg2, nil) + return evaldo.MakeRyeError(ps, arg2, nil) } default: ps.FailureFlag = true ps.ReturnFlag = true - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "^ensure\\with") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "^ensure\\with") } }, }, @@ -740,8 +741,8 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ case env.Block: ser := ps.Ser ps.Ser = bloc.Series - EvalBlockInj(ps, arg0, true) - MaybeDisplayFailureOrError(ps, ps.Idx, "fix") + evaldo.EvalBlockInj(ps, arg0, true) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "fix") if ps.ErrorFlag { ps.Ser = ser return ps.Res @@ -750,7 +751,7 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ return ps.Res default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "fix") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "fix") } } else { return arg0 @@ -778,14 +779,14 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ case env.Block: ser := ps.Ser ps.Ser = bloc.Series - EvalBlockInj(ps, arg0, true) - MaybeDisplayFailureOrError(ps, ps.Idx, "^fix") + evaldo.EvalBlockInj(ps, arg0, true) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "^fix") ps.Ser = ser ps.ReturnFlag = true return ps.Res default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "^fix") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "^fix") } } else { return arg0 @@ -814,26 +815,26 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ case env.Block: ser := ps.Ser ps.Ser = bloc.Series - EvalBlockInj(ps, arg0, true) - MaybeDisplayFailureOrError(ps, ps.Idx, "fix\\either") + evaldo.EvalBlockInj(ps, arg0, true) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "fix\\either") ps.Ser = ser return ps.Res default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "fix\\either") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "fix\\either") } } else { switch bloc := arg2.(type) { case env.Block: ser := ps.Ser ps.Ser = bloc.Series - EvalBlockInj(ps, arg0, true) - MaybeDisplayFailureOrError(ps, ps.Idx, "fix\\either") + evaldo.EvalBlockInj(ps, arg0, true) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "fix\\either") ps.Ser = ser return ps.Res default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.BlockType}, "fix\\either") + return evaldo.MakeArgError(ps, 3, []env.Type{env.BlockType}, "fix\\either") } } }, @@ -859,13 +860,13 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ case env.Block: ser := ps.Ser ps.Ser = bloc.Series - EvalBlockInj(ps, arg0, true) - MaybeDisplayFailureOrError(ps, ps.Idx, "fix\\else") + evaldo.EvalBlockInj(ps, arg0, true) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "fix\\else") ps.Ser = ser return ps.Res default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "fix\\else") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "fix\\else") } } else { return arg0 @@ -894,24 +895,24 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ case env.Block: ser := ps.Ser ps.Ser = bloc.Series - EvalBlockInj(ps, arg0, true) + evaldo.EvalBlockInj(ps, arg0, true) ps.Ser = ser return ps.Res default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "fix\\continue") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "fix\\continue") } } else { switch bloc := arg2.(type) { case env.Block: ser := ps.Ser ps.Ser = bloc.Series - EvalBlockInj(ps, arg0, true) + evaldo.EvalBlockInj(ps, arg0, true) ps.Ser = ser return ps.Res default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.BlockType}, "fix\\continue") + return evaldo.MakeArgError(ps, 3, []env.Type{env.BlockType}, "fix\\continue") } } }, @@ -937,13 +938,13 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ case env.Block: ser := ps.Ser ps.Ser = bloc.Series - EvalBlockInj(ps, arg0, true) - MaybeDisplayFailureOrError(ps, ps.Idx, "continue") + evaldo.EvalBlockInj(ps, arg0, true) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "continue") ps.Ser = ser return ps.Res default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "continue") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "continue") } } else { ps.FailureFlag = false @@ -977,7 +978,7 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ for i := 0; i < bloc.Series.Len(); i += 2 { if i > bloc.Series.Len()-2 { - return MakeBuiltinError(ps, "Switch block malformed.", "^fix\\match") + return evaldo.MakeBuiltinError(ps, "Switch block malformed.", "^fix\\match") } switch ev := bloc.Series.Get(i).(type) { @@ -999,7 +1000,7 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ any_found = true } default: - return MakeBuiltinError(ps, "Invalid type in block series.", "^fix\\match") + return evaldo.MakeBuiltinError(ps, "Invalid type in block series.", "^fix\\match") } } @@ -1010,9 +1011,9 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ // we set ProgramStates series to series ob the block ps.Ser = cc.Series // we eval the block (current context / scope stays the same as it was in parent block) - EvalBlockInj(ps, arg0, true) + evaldo.EvalBlockInj(ps, arg0, true) // we set temporary series back to current program state - MaybeDisplayFailureOrError(ps, ps.Idx, "fix\\match") + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "fix\\match") ps.Ser = ser // we return the last return value (the return value of executing the block) @@ -1021,12 +1022,12 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ default: // if it's not a block we return error for now ps.FailureFlag = true - return MakeBuiltinError(ps, "Malformed switch block.", "^fix\\match") + return evaldo.MakeBuiltinError(ps, "Malformed switch block.", "^fix\\match") } default: // if it's not a block we return error for now ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "^fix\\match") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "^fix\\match") } default: return arg0 @@ -1049,9 +1050,9 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ ser := ps.Ser ps.Ser = bloc.Series ps.InErrHandler = true - Eval(ps) + evaldo.Eval(ps) // We don't display it in try function, that is the point - // MaybeDisplayFailureOrError(ps, ps.Idx, "try") + // evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "try") ps.InErrHandler = false ps.ReturnFlag = false ps.ErrorFlag = false @@ -1060,7 +1061,7 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ ps.Ser = ser return ps.Res default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "try") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "try") } }, }, @@ -1086,8 +1087,8 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ ps.InErrHandler = true // Execute the block ps.Ser = bloc.Series - Eval(ps) - MaybeDisplayFailureOrError(ps, ps.Idx, "try-all") + evaldo.Eval(ps) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "try-all") // Create result tuple result := ps.Res @@ -1105,7 +1106,7 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ })) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "try-all") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "try-all") } }, }, @@ -1127,8 +1128,8 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ ser := ps.Ser ps.Ser = bloc.Series ps.InErrHandler = true - EvalBlockInCtxInj(ps, ctx, nil, false) - MaybeDisplayFailureOrError(ps, ps.Idx, "try\\in") + evaldo.EvalBlockInCtxInj(ps, ctx, nil, false) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "try\\in") ps.InErrHandler = false ps.ReturnFlag = false ps.ErrorFlag = false @@ -1138,11 +1139,11 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ return ps.Res default: ps.ErrorFlag = true - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "try\\in") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "try\\in") } default: ps.ErrorFlag = true - return MakeArgError(ps, 1, []env.Type{env.ContextType}, "try\\in") + return evaldo.MakeArgError(ps, 1, []env.Type{env.ContextType}, "try\\in") } }, }, @@ -1168,8 +1169,8 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ ps.InErrHandler = true // Execute the main block ps.Ser = mainBlock.Series - Eval(ps) - MaybeDisplayFailureOrError(ps, ps.Idx, "finally") + evaldo.Eval(ps) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "finally") // Save result and flags result := ps.Res @@ -1181,8 +1182,8 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ ps.FailureFlag = false ps.ErrorFlag = false ps.InErrHandler = false - Eval(ps) - MaybeDisplayFailureOrError(ps, ps.Idx, "finally") + evaldo.Eval(ps) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "finally") // Restore original result and flags ps.Res = result @@ -1195,11 +1196,11 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ return ps.Res default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "finally") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "finally") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "finally") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "finally") } }, }, @@ -1227,8 +1228,8 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ // Try the block initially ps.Ser = bloc.Series - Eval(ps) - MaybeDisplayFailureOrError(ps, ps.Idx, "retry") + evaldo.Eval(ps) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "retry") // If it succeeded (no failure flag), return the result immediately if !ps.FailureFlag { @@ -1247,8 +1248,8 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ ps.ErrorFlag = false // Execute the block again - Eval(ps) - MaybeDisplayFailureOrError(ps, ps.Idx, "retry") + evaldo.Eval(ps) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "retry") // If it succeeded, return the result if !ps.FailureFlag { @@ -1265,10 +1266,10 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ ps.FailureFlag = true return result default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "retry") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "retry") } default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "retry") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "retry") } }, }, @@ -1300,8 +1301,8 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ ps.ErrorFlag = false // Execute the block - Eval(ps) - MaybeDisplayFailureOrError(ps, ps.Idx, "persist") + evaldo.Eval(ps) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "persist") // If it succeeded (no failure flag), return the result if !ps.FailureFlag { @@ -1315,9 +1316,9 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ // If we reach here, we've exceeded 1000 attempts ps.Ser = ser ps.FailureFlag = true - return MakeRyeError(ps, *env.NewString("Persist failed: Block did not succeed after 1000 attempts"), nil) + return evaldo.MakeRyeError(ps, *env.NewString("Persist failed: Block did not succeed after 1000 attempts"), nil) default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "persist") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "persist") } }, }, @@ -1354,8 +1355,8 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ // Execute the block in a goroutine go func() { - Eval(psCopy) - MaybeDisplayFailureOrError(ps, ps.Idx, "timeout") + evaldo.Eval(psCopy) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "timeout") resultChan <- psCopy.Res doneChan <- psCopy.FailureFlag @@ -1374,13 +1375,13 @@ var ErrorHandlingBuiltins = map[string]*env.Builtin{ case <-time.After(timeoutDuration): ps.FailureFlag = true ps.Ser = ser - return MakeRyeError(ps, *env.NewString(fmt.Sprintf("Execution timed out after %d ms", ms.Value)), nil) + return evaldo.MakeRyeError(ps, *env.NewString(fmt.Sprintf("Execution timed out after %d ms", ms.Value)), nil) } default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "timeout") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "timeout") } default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "timeout") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "timeout") } }, }, diff --git a/evaldo/builtins_eyr.go b/batteries/builtins_eyr.go old mode 100755 new mode 100644 similarity index 91% rename from evaldo/builtins_eyr.go rename to batteries/builtins_eyr.go index 342a81d6..21eaaae9 --- a/evaldo/builtins_eyr.go +++ b/batteries/builtins_eyr.go @@ -1,5 +1,5 @@ // builtins.go -package evaldo +package batteries import ( // "fmt" @@ -7,6 +7,7 @@ import ( "slices" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" ) // definiraj frame @@ -19,7 +20,7 @@ func Eyr_CallBuiltinPipe(bi env.Builtin, ps *env.ProgramState, arg0_ env.Object) // for now works just with functions that accept block as a first and only argument ... will have to conceptualize other options first if bi.Argsn > 0 { - if checkForFailureWithBuiltin(bi, ps, 0) { + if evaldo.CheckForFailureWithBuiltin(bi, ps, 0) { return ps } if ps.ErrorFlag || ps.ReturnFlag { @@ -47,7 +48,7 @@ func Eyr_CallBuiltin(bi env.Builtin, ps *env.ProgramState, arg0_ env.Object, toL if bi.Argsn == 0 { // fmt.Println("*** ARGSN = 0") - if checkForFailureWithBuiltin(bi, ps, 0) { + if evaldo.CheckForFailureWithBuiltin(bi, ps, 0) { return ps } if ps.ErrorFlag || ps.ReturnFlag { @@ -58,7 +59,7 @@ func Eyr_CallBuiltin(bi env.Builtin, ps *env.ProgramState, arg0_ env.Object, toL } else if bi.Argsn > 0 { // fmt.Println("*** ARGSN > 0") - if checkForFailureWithBuiltin(bi, ps, 0) { + if evaldo.CheckForFailureWithBuiltin(bi, ps, 0) { return ps } if ps.ErrorFlag || ps.ReturnFlag { @@ -74,7 +75,7 @@ func Eyr_CallBuiltin(bi env.Builtin, ps *env.ProgramState, arg0_ env.Object, toL // stack.Push(ps.Res) } else if bi.Argsn > 1 { // fmt.Println("*** ARGSN > 1") - if checkForFailureWithBuiltin(bi, ps, 1) { + if evaldo.CheckForFailureWithBuiltin(bi, ps, 1) { return ps } if ps.ErrorFlag || ps.ReturnFlag { @@ -93,7 +94,7 @@ func Eyr_CallBuiltin(bi env.Builtin, ps *env.ProgramState, arg0_ env.Object, toL // fmt.Println(ps.Res) // stack.Push(ps.Res) } else if bi.Argsn > 2 { - if checkForFailureWithBuiltin(bi, ps, 0) { + if evaldo.CheckForFailureWithBuiltin(bi, ps, 0) { return ps } if ps.ErrorFlag || ps.ReturnFlag { @@ -116,8 +117,8 @@ func Eyr_CallBuiltin(bi env.Builtin, ps *env.ProgramState, arg0_ env.Object, toL // This is separate from CallFuncitonArgsN so it can manage pulling args directly off of the eyr stack func Eyr_CallFunction(fn env.Function, es *env.ProgramState, leftVal env.Object, toLeft bool, session *env.RyeCtx) *env.ProgramState { - fnCtx, fromPool := DetermineContext(fn, es, session) - if tryHandleFailure(es) { + fnCtx, fromPool := evaldo.DetermineContext(fn, es, session) + if evaldo.TryHandleFailure(es) { return es } @@ -153,12 +154,12 @@ func Eyr_CallFunction(fn env.Function, es *env.ProgramState, leftVal env.Object, // es.Ser.SetPos(0) // fmt.Println("***") if fn.Argsn > 0 { - Eval(es) - // EvalBlockInj(es, arg0, arg0 != nil) + evaldo.Eval(es) + // evaldo.EvalBlockInj(es, arg0, arg0 != nil) } else { - Eval(es) + evaldo.Eval(es) } - // MaybeDisplayFailureOrError(result, result.Idx) + // evaldo.MaybeDisplayFailureOrError(result, result.Idx) /* if result.ForcedResult != nil { es.Res = result.ForcedResult @@ -170,7 +171,7 @@ func Eyr_CallFunction(fn env.Function, es *env.ProgramState, leftVal env.Object, es.Ser = tempSer es.Ctx = tempCtx es.ReturnFlag = false - returnContextToPool(fnCtx, fromPool) + evaldo.ReturnContextToPool(fnCtx, fromPool) return es } @@ -182,7 +183,7 @@ func Eyr_EvalObject(es *env.ProgramState, object env.Object, leftVal env.Object, if bakein { es.Ser.Put(bu) } //es.Ser.SetPos(es.Ser.Pos() - 1) - if checkForFailureWithBuiltin(bu, es, 333) { + if evaldo.CheckForFailureWithBuiltin(bu, es, 333) { // fmt.Println("CHECK FOR FAILURE WITH BUI") return es } @@ -228,7 +229,7 @@ func findLastStart(stack *env.EyrStack) (env.Object, bool) { func Eyr_EvalWord(ps *env.ProgramState, word env.Object, leftVal env.Object, pipeWord bool) *env.ProgramState { // LOCAL FIRST - found, object, ctx := findWordValue(ps, word) + found, object, ctx := evaldo.FindWordValue(ps, word) if !found { // look at Generic words, but first check type first, ok := findLastStart(ps.Stack) // get the value on stack before the comma (expression guard) // fmt.Println(first) @@ -276,7 +277,7 @@ func Eyr_EvalLSetword(ps *env.ProgramState, word env.LSetword, leftVal env.Objec func Eyr_EvalExpression(ps *env.ProgramState) *env.ProgramState { object := ps.Ser.Pop() - trace("Before entering expression") + evaldo.Trace("Before entering expression") if object != nil { switch object.Type() { case env.CommaType: @@ -339,7 +340,7 @@ func Eyr_EvalBlockInside(ps *env.ProgramState, inj env.Object, injnow bool) *env for ps.Ser.Pos() < ps.Ser.Len() { // fmt.Println(ps.Ser.Pos()) ps = Eyr_EvalExpression(ps) - if tryHandleFailure(ps) { + if evaldo.TryHandleFailure(ps) { // fmt.Println("yy") return ps } @@ -361,7 +362,7 @@ func Eyr_EvalBlock(ps *env.ProgramState, full bool) *env.ProgramState { for ps.Ser.Pos() < ps.Ser.Len() { // fmt.Println(ps.Ser.Pos()) ps = Eyr_EvalExpression(ps) - if tryHandleFailure(ps) { + if evaldo.TryHandleFailure(ps) { // fmt.Println("yy") return ps } @@ -438,7 +439,7 @@ var Builtins_eyr = map[string]*env.Builtin{ ps.Ser = ser return ps.Res default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "eyr") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "eyr") } }, }, @@ -461,12 +462,12 @@ var Builtins_eyr = map[string]*env.Builtin{ ps.Ser = bloc.Series dialect := ps.Dialect ps.Dialect = env.Rye0Dialect - Rye0_EvalBlockInj(ps, nil, false) + evaldo.Rye0_EvalBlockInj(ps, nil, false) ps.Dialect = dialect ps.Ser = ser return ps.Res default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "rye0") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "rye0") } }, }, @@ -489,12 +490,12 @@ var Builtins_eyr = map[string]*env.Builtin{ ps.Ser = bloc.Series dialect := ps.Dialect ps.Dialect = env.Rye00Dialect - Rye00_EvalBlockInj(ps, nil, false) + evaldo.Rye00_EvalBlockInj(ps, nil, false) ps.Dialect = dialect ps.Ser = ser return ps.Res default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "rye00") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "rye00") } }, }, @@ -538,7 +539,7 @@ var Builtins_eyr = map[string]*env.Builtin{ ps.Ser = ser return ps.Res default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "eyr\\full") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "eyr\\full") } }, }, @@ -570,10 +571,10 @@ var Builtins_eyr = map[string]*env.Builtin{ ps.Ser = ser return ps.Res default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "eyr\\loop") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "eyr\\loop") } default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "eyr\\loop") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "eyr\\loop") } }, }, @@ -591,10 +592,10 @@ var Builtins_eyr = map[string]*env.Builtin{ switch bloc := arg0.(type) { case env.Block: eBlock := env.NewBlock(*env.NewTSeries(make([]env.Object, 0))) - CompileRyeToEyr(&bloc, ps, eBlock) + evaldo.CompileRyeToEyr(&bloc, ps, eBlock) return *eBlock default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "eyr") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "eyr") } }, }, diff --git a/evaldo/builtins_flui.go b/batteries/builtins_flui.go similarity index 89% rename from evaldo/builtins_flui.go rename to batteries/builtins_flui.go index 7f630ba3..1a7afda2 100644 --- a/evaldo/builtins_flui.go +++ b/batteries/builtins_flui.go @@ -1,9 +1,10 @@ -package evaldo +package batteries import ( "encoding/json" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/refaktor/rye/term" ) @@ -47,7 +48,7 @@ var Builtins_flui = map[string]*env.Builtin{ case *env.TableRow: obj, esc = term.DisplayTableRow(*val, ps.Idx) default: - return MakeArgError(ps, 1, []env.Type{env.BlockType, env.DictType, env.ListType, env.TableType}, "select") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType, env.DictType, env.ListType, env.TableType}, "select") } if esc { ps.FailureFlag = true @@ -72,7 +73,7 @@ var Builtins_flui = map[string]*env.Builtin{ } return obj default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "input") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "input") } }, }, @@ -90,7 +91,7 @@ var Builtins_flui = map[string]*env.Builtin{ } return obj default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "input\\integer") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "input\\integer") } }, }, @@ -108,7 +109,7 @@ var Builtins_flui = map[string]*env.Builtin{ } return obj default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "datepicker") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "datepicker") } }, }, @@ -126,7 +127,7 @@ var Builtins_flui = map[string]*env.Builtin{ } return obj default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "datepicker") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "datepicker") } }, }, @@ -146,10 +147,10 @@ var Builtins_flui = map[string]*env.Builtin{ } return obj default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "textarea") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "textarea") } default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "textarea") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "textarea") } }, }, @@ -171,13 +172,13 @@ var Builtins_flui = map[string]*env.Builtin{ } return obj default: - return MakeArgError(ps, 3, []env.Type{env.StringType}, "textarea\\") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "textarea\\") } default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "textarea\\") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "textarea\\") } default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "textarea\\") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "textarea\\") } }, }, @@ -205,7 +206,7 @@ var Builtins_flui = map[string]*env.Builtin{ } return blockToDisplayJSON(*bloc, ps.Idx) default: - return MakeArgError(ps, 1, []env.Type{env.BlockType, env.ListType}, "displayx") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType, env.ListType}, "displayx") } }, }, diff --git a/batteries/builtins_flui_v2.go b/batteries/builtins_flui_v2.go new file mode 100644 index 00000000..b7a959fe --- /dev/null +++ b/batteries/builtins_flui_v2.go @@ -0,0 +1,277 @@ +package batteries + +// builtins_flui_v2.go - Refactored TUI builtins using widget abstraction +// This file can replace builtins_flui.go once validated + +import ( + "encoding/json" + "os" + + goterm "golang.org/x/term" + + "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" + "github.com/refaktor/rye/term" +) + +var Builtins_flui_v2 = map[string]*env.Builtin{ + + // ========================================================================= + // select - Interactive selection from Block, Dict, Table, List, TableRow + // ========================================================================= + "select": { + Argsn: 1, + Doc: "Interactively displays a selection interface. Returns the selected item. Ctrl+C cancels.", + Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { + items, ok := extractItems(arg0, ps.Idx) + if !ok { + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType, env.DictType, env.ListType, env.TableType}, "select") + } + + // Determine if we need pagination + _, height, termErr := goterm.GetSize(int(os.Stdout.Fd())) + if termErr != nil { + height = 20 + } + pageSize := height - 4 + + term.SaveCurPos() + + var widget term.Widget + if len(items) <= pageSize { + widget = term.NewSelectWidget(items, ps.Idx) + } else { + widget = term.NewPaginatedSelectWidget(items, pageSize, ps.Idx) + } + + result, canceled := term.RunWidget(widget) + if canceled { + ps.FailureFlag = true + return env.NewError("canceled by user") + } + return result + }, + }, + + // ========================================================================= + // input - Single line text input + // ========================================================================= + "input": { + Argsn: 1, + Doc: "Interactively displays an input field. Takes max width, returns entered string. Ctrl+C cancels.", + Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { + switch width := arg0.(type) { + case env.Integer: + term.SaveCurPos() + widget := term.NewInputWidget(int(width.Value), ps.Idx) + result, canceled := term.RunWidget(widget) + if canceled { + ps.FailureFlag = true + return env.NewError("canceled by user") + } + return result + default: + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "input") + } + }, + }, + + // ========================================================================= + // datepicker - Interactive date input (YYYY-MM-DD) + // ========================================================================= + "datepicker": { + Argsn: 1, + Doc: "Interactive date input. Use arrow keys to navigate/change values, or type digits. Ctrl+C cancels.", + Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { + switch initialDate := arg0.(type) { + case env.String: + term.SaveCurPos() + widget := term.NewDateWidget(initialDate.Value, ps.Idx) + result, canceled := term.RunWidget(widget) + if canceled { + ps.FailureFlag = true + return env.NewError("canceled by user") + } + return result + default: + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "datepicker") + } + }, + }, + + // ========================================================================= + // textarea - Multiline text input + // ========================================================================= + "textarea": { + Argsn: 2, + Doc: "Interactive multiline text input. Takes width and height. Ctrl+D to submit, Ctrl+C cancels.", + Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { + switch width := arg0.(type) { + case env.Integer: + switch height := arg1.(type) { + case env.Integer: + term.SaveCurPos() + widget := term.NewTextAreaWidget(int(width.Value), int(height.Value), "", ps.Idx) + result, canceled := term.RunWidget(widget) + if canceled { + ps.FailureFlag = true + return env.NewError("canceled by user") + } + return result + default: + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "textarea") + } + default: + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "textarea") + } + }, + }, + + // ========================================================================= + // textarea\ - Multiline text input with initial text (pipe-friendly) + // ========================================================================= + "textarea\\": { + Argsn: 3, + Doc: "Interactive multiline text input with initial text. Ctrl+D to submit, Ctrl+C cancels.", + Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { + switch text := arg0.(type) { + case env.String: + switch width := arg1.(type) { + case env.Integer: + switch height := arg2.(type) { + case env.Integer: + term.SaveCurPos() + widget := term.NewTextAreaWidget(int(width.Value), int(height.Value), text.Value, ps.Idx) + result, canceled := term.RunWidget(widget) + if canceled { + ps.FailureFlag = true + return env.NewError("canceled by user") + } + return result + default: + return evaldo.MakeArgError(ps, 3, []env.Type{env.IntegerType}, "textarea\\") + } + default: + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "textarea\\") + } + default: + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "textarea\\") + } + }, + }, + + // ========================================================================= + // displayx - JSON representation for Flutter UI + // ========================================================================= + "displayx": { + Argsn: 1, + Doc: "Returns a !!! prefixed JSON representation for Flutter UI rendering.", + Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { + switch val := arg0.(type) { + case env.Block: + return blockToDisplayJSON(val, ps.Idx) + case *env.Block: + return blockToDisplayJSON(*val, ps.Idx) + case env.List: + return blockToDisplayJSON(*listToBlock(val), ps.Idx) + case *env.List: + return blockToDisplayJSON(*listToBlock(*val), ps.Idx) + default: + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType, env.ListType}, "displayx") + } + }, + }, +} + +// extractItems converts various Rye types to a slice of Objects for selection +func extractItems(arg env.Object, idx *env.Idxs) ([]env.Object, bool) { + switch val := arg.(type) { + case env.Block: + return val.Series.S, true + case *env.Block: + return val.Series.S, true + case env.List: + return listToObjects(val), true + case *env.List: + return listToObjects(*val), true + case env.Dict: + return dictToObjects(val), true + case *env.Dict: + return dictToObjects(*val), true + // Note: Table and TableRow would need special handling + // to preserve their row structure + } + return nil, false +} + +func listToObjects(list env.List) []env.Object { + result := make([]env.Object, len(list.Data)) + for i, item := range list.Data { + result[i] = env.ToRyeValue(item) + } + return result +} + +func dictToObjects(dict env.Dict) []env.Object { + result := make([]env.Object, 0, len(dict.Data)) + for k, v := range dict.Data { + // Create a representation that shows key: value + if obj, ok := v.(env.Object); ok { + result = append(result, env.NewString(k+": "+obj.Print(env.Idxs{}))) + } + } + return result +} + +func listToBlock(list env.List) *env.Block { + bloc := env.NewBlock(*env.NewTSeries(make([]env.Object, len(list.Data)))) + for i, item := range list.Data { + bloc.Series.S[i] = env.ToRyeValue(item) + } + return bloc +} + +// blockToDisplayJSON converts a Block to a JSON string prefixed with !!! for Flutter UI +func blockToDisplayJSON_v2(block env.Block, idx *env.Idxs) env.Object { + items := make([][]string, 0, block.Series.Len()) + for i := 0; i < block.Series.Len(); i++ { + item := block.Series.Get(i) + typeName := getTypeName_v2(item) + value := item.Print(*idx) + items = append(items, []string{typeName, value}) + } + result := []interface{}{"block", items} + jsonBytes, err := json.Marshal(result) + if err != nil { + return env.NewError("failed to marshal to JSON: " + err.Error()) + } + return *env.NewString("!!!" + string(jsonBytes)) +} + +// getTypeName returns the type name of a Rye object as a string +func getTypeName_v2(obj env.Object) string { + switch obj.(type) { + case env.String: + return "string" + case env.Integer: + return "integer" + case env.Decimal: + return "decimal" + case env.Word: + return "word" + case env.Setword: + return "setword" + case env.Getword: + return "getword" + case env.Block: + return "block" + case env.Dict: + return "dict" + case env.List: + return "list" + case env.Error: + return "error" + default: + return "unknown" + } +} diff --git a/evaldo/builtins_git_not.go b/batteries/builtins_git_not.go similarity index 87% rename from evaldo/builtins_git_not.go rename to batteries/builtins_git_not.go index 87586679..28fcab46 100644 --- a/evaldo/builtins_git_not.go +++ b/batteries/builtins_git_not.go @@ -1,7 +1,7 @@ //go:build no_git // +build no_git -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_goroutines.go b/batteries/builtins_goroutines.go old mode 100755 new mode 100644 similarity index 82% rename from evaldo/builtins_goroutines.go rename to batteries/builtins_goroutines.go index a7f26edc..fa8bcf01 --- a/evaldo/builtins_goroutines.go +++ b/batteries/builtins_goroutines.go @@ -1,7 +1,7 @@ //go:build !b_tiny // +build !b_tiny -package evaldo +package batteries import ( "fmt" @@ -10,6 +10,7 @@ import ( "sync/atomic" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/jinzhu/copier" ) @@ -80,7 +81,7 @@ var Builtins_goroutines = map[string]*env.Builtin{ psTemp := env.ProgramState{} err := copier.Copy(&psTemp, &ps) if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("failed to copy program state: %s", err), "go-with") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("failed to copy program state: %s", err), "go-with") } // Reset flags for the goroutine state @@ -96,17 +97,17 @@ var Builtins_goroutines = map[string]*env.Builtin{ fmt.Printf("Goroutine panic in go-with: %v\n", r) } }() - CallFunction_CollectArgs(handler, &psTemp, arg, false, nil) + evaldo.CallFunction_CollectArgs(handler, &psTemp, arg, false, nil) }() return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.FunctionType}, "go-with") + return evaldo.MakeArgError(ps, 2, []env.Type{env.FunctionType}, "go-with") } default: ps.FailureFlag = true - return MakeBuiltinError(ps, "First argument should be object type.", "go-with") + return evaldo.MakeBuiltinError(ps, "First argument should be object type.", "go-with") } }, }, @@ -128,7 +129,7 @@ var Builtins_goroutines = map[string]*env.Builtin{ psTemp := env.ProgramState{} err := copier.Copy(&psTemp, &ps) if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("failed to copy program state: %s", err), "go") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("failed to copy program state: %s", err), "go") } // Reset flags for the goroutine state @@ -144,13 +145,13 @@ var Builtins_goroutines = map[string]*env.Builtin{ fmt.Printf("Goroutine panic in go: %v\n", r) } }() - CallFunction_CollectArgs(handler, &psTemp, nil, false, nil) + evaldo.CallFunction_CollectArgs(handler, &psTemp, nil, false, nil) }() return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.FunctionType}, "go") + return evaldo.MakeArgError(ps, 1, []env.Type{env.FunctionType}, "go") } }, }, @@ -174,7 +175,7 @@ var Builtins_goroutines = map[string]*env.Builtin{ return *env.NewNative(ps.Idx, ch, "Rye-channel") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "channel") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "channel") } }, }, @@ -196,7 +197,7 @@ var Builtins_goroutines = map[string]*env.Builtin{ ch, ok := chn.Value.(chan *env.Object) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "Invalid channel type", "Rye-channel//Read") + return evaldo.MakeBuiltinError(ps, "Invalid channel type", "Rye-channel//Read") } msg, ok := <-ch @@ -207,7 +208,7 @@ var Builtins_goroutines = map[string]*env.Builtin{ } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-channel//Read") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-channel//Read") } }, }, @@ -237,7 +238,7 @@ var Builtins_goroutines = map[string]*env.Builtin{ return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-channel//Send") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-channel//Send") } }, }, @@ -260,7 +261,7 @@ var Builtins_goroutines = map[string]*env.Builtin{ return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-channel//Close") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-channel//Close") } }, }, @@ -314,7 +315,7 @@ var Builtins_goroutines = map[string]*env.Builtin{ return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mutex//Lock") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mutex//Lock") } }, }, @@ -340,7 +341,7 @@ var Builtins_goroutines = map[string]*env.Builtin{ return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mutex//Unlock") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mutex//Unlock") } }, }, @@ -365,11 +366,11 @@ var Builtins_goroutines = map[string]*env.Builtin{ return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "Rye-waitgroup//Add") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "Rye-waitgroup//Add") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-waitgroup//Add") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-waitgroup//Add") } }, }, @@ -391,7 +392,7 @@ var Builtins_goroutines = map[string]*env.Builtin{ return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-waitgroup//Done") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-waitgroup//Done") } }, }, @@ -413,7 +414,7 @@ var Builtins_goroutines = map[string]*env.Builtin{ return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-waitgroup//Wait") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-waitgroup//Wait") } }, }, @@ -438,17 +439,17 @@ var Builtins_goroutines = map[string]*env.Builtin{ var cases []reflect.SelectCase var funcs []env.Function for ps.Ser.Pos() < ps.Ser.Len() { - EvalExpression_CollectArg(ps, false, false) + evaldo.EvalExpression_CollectArg(ps, false, false) defaultFn, ok := ps.Res.(env.Function) // handle default case if ok { if hasDeafult { ps.FailureFlag = true - return MakeBuiltinError(ps, "select can only have one default case", "select\\fn") + return evaldo.MakeBuiltinError(ps, "select can only have one default case", "select\\fn") } if defaultFn.Argsn != 0 { ps.FailureFlag = true - return MakeBuiltinError(ps, "function with 0 args required", "select\\fn") + return evaldo.MakeBuiltinError(ps, "function with 0 args required", "select\\fn") } defaultCase := make(chan struct{}) close(defaultCase) // close it immediately so it's always ready to receive @@ -464,24 +465,24 @@ var Builtins_goroutines = map[string]*env.Builtin{ native, ok := ps.Res.(env.Native) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "first argument of a case must be a channel", "select\\fn") + return evaldo.MakeBuiltinError(ps, "first argument of a case must be a channel", "select\\fn") } ch, ok := native.Value.(chan *env.Object) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "first argument of a case must be a channel", "select\\fn") + return evaldo.MakeBuiltinError(ps, "first argument of a case must be a channel", "select\\fn") } cases = append(cases, reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ch)}) - EvalExpression_CollectArg(ps, false, false) + evaldo.EvalExpression_CollectArg(ps, false, false) fn, ok := ps.Res.(env.Function) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "second argument of a case must be a function", "select\\fn") + return evaldo.MakeBuiltinError(ps, "second argument of a case must be a function", "select\\fn") } if fn.Argsn > 1 { ps.FailureFlag = true - return MakeBuiltinError(ps, "function with 0 or 1 arg required", "select\\fn") + return evaldo.MakeBuiltinError(ps, "function with 0 or 1 arg required", "select\\fn") } funcs = append(funcs, fn) } @@ -494,26 +495,26 @@ var Builtins_goroutines = map[string]*env.Builtin{ err := copier.Copy(&psTemp, &ps) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, fmt.Sprintf("failed to copy ps: %s", err), "select\\fn") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("failed to copy ps: %s", err), "select\\fn") } var arg env.Object = nil if recvOK { val, ok := value.Interface().(*env.Object) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "value from channel is not an object", "select\\fn") + return evaldo.MakeBuiltinError(ps, "value from channel is not an object", "select\\fn") } arg = *val } if fn.Argsn == 0 { arg = nil } - CallFunction_CollectArgs(fn, &psTemp, arg, false, nil) + evaldo.CallFunction_CollectArgs(fn, &psTemp, arg, false, nil) return psTemp.Res default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "select\\fn") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "select\\fn") } return arg0 // unreachable, but needed for compilation }, @@ -539,37 +540,37 @@ var Builtins_goroutines = map[string]*env.Builtin{ var cases []reflect.SelectCase var funcs []env.Block for ps.Ser.Pos() < ps.Ser.Len() { - EvalExpression_CollectArg(ps, false, false) + evaldo.EvalExpression_CollectArg(ps, false, false) // handle default case switch maybeChan := ps.Res.(type) { case env.Native: ch, ok := maybeChan.Value.(chan *env.Object) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "first argument of a case must be a channel", "select") + return evaldo.MakeBuiltinError(ps, "first argument of a case must be a channel", "select") } cases = append(cases, reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ch)}) - EvalExpression_CollectArg(ps, false, false) + evaldo.EvalExpression_CollectArg(ps, false, false) fn, ok := ps.Res.(env.Block) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "second argument of a case must be a block", "select") + return evaldo.MakeBuiltinError(ps, "second argument of a case must be a block", "select") } /* if fn.Argsn > 1 { ps.FailureFlag = true - return MakeBuiltinError(ps, "function with 0 or 1 arg required", "select") + return evaldo.MakeBuiltinError(ps, "function with 0 or 1 arg required", "select") }*/ funcs = append(funcs, fn) case env.Void: if hasDeafult { ps.FailureFlag = true - return MakeBuiltinError(ps, "select can only have one default case", "select") + return evaldo.MakeBuiltinError(ps, "select can only have one default case", "select") } /* if defaultFn.Argsn != 0 { ps.FailureFlag = true - return MakeBuiltinError(ps, "function with 0 args required", "select") + return evaldo.MakeBuiltinError(ps, "function with 0 args required", "select") } */ defaultCase := make(chan struct{}) close(defaultCase) // close it immediately so it's always ready to receive @@ -577,11 +578,11 @@ var Builtins_goroutines = map[string]*env.Builtin{ Dir: reflect.SelectRecv, Chan: reflect.ValueOf(defaultCase), }) - EvalExpression_CollectArg(ps, false, false) + evaldo.EvalExpression_CollectArg(ps, false, false) fn, ok := ps.Res.(env.Block) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "second argument of a case must be a block", "select") + return evaldo.MakeBuiltinError(ps, "second argument of a case must be a block", "select") } funcs = append(funcs, fn) hasDeafult = true @@ -596,14 +597,14 @@ var Builtins_goroutines = map[string]*env.Builtin{ err := copier.Copy(&psTemp, &ps) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, fmt.Sprintf("failed to copy ps: %s", err), "select") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("failed to copy ps: %s", err), "select") } var arg env.Object = nil if recvOK { val, ok := value.Interface().(*env.Object) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "value from channel is not an object", "select") + return evaldo.MakeBuiltinError(ps, "value from channel is not an object", "select") } arg = *val } @@ -611,8 +612,8 @@ var Builtins_goroutines = map[string]*env.Builtin{ arg = nil }*/ psTemp.Ser = fn.Series - EvalBlockInj(&psTemp, arg, true) - MaybeDisplayFailureOrError(ps, ps.Idx, "select") + evaldo.EvalBlockInj(&psTemp, arg, true) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "select") // TODO -- do we need to do something with ps.Ser if psTemp.ErrorFlag { @@ -622,7 +623,7 @@ var Builtins_goroutines = map[string]*env.Builtin{ default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "select") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "select") } return arg0 }, diff --git a/evaldo/builtins_goroutines_not.go b/batteries/builtins_goroutines_not.go old mode 100755 new mode 100644 similarity index 88% rename from evaldo/builtins_goroutines_not.go rename to batteries/builtins_goroutines_not.go index 401614cc..2c7079c8 --- a/evaldo/builtins_goroutines_not.go +++ b/batteries/builtins_goroutines_not.go @@ -1,7 +1,7 @@ //go:build b_tiny // +build b_tiny -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_html.go b/batteries/builtins_html.go similarity index 86% rename from evaldo/builtins_html.go rename to batteries/builtins_html.go index ca289fbb..4c1f14b8 100644 --- a/evaldo/builtins_html.go +++ b/batteries/builtins_html.go @@ -1,12 +1,13 @@ //go:build !no_html // +build !no_html -package evaldo +package batteries import ( "fmt" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "golang.org/x/net/html" @@ -169,8 +170,8 @@ func do_html(es *env.ProgramState, reader io.Reader, dmap env.Dict) env.Object { case env.Block: // if values of start key is of type block, evaluate it ser := es.Ser // TODO -- make helper function that "does" a block es.Ser = obj.Series - EvalBlockInj(es, *env.NewNative(es.Idx, "", "rye-html-start"), true) - MaybeDisplayFailureOrError(es, es.Idx, "do_html") + evaldo.EvalBlockInj(es, *env.NewNative(es.Idx, "", "rye-html-start"), true) + evaldo.MaybeDisplayFailureOrError(es, es.Idx, "do_html") if es.ErrorFlag { return es.Res @@ -222,8 +223,8 @@ myloop: // stack = append(stack, rmap) // append rmap to stack and evaluate block ser := es.Ser // TODO -- make helper function that "does" a block es.Ser = node.Code.Series - EvalBlockInj(es, *env.NewNative(es.Idx, token, "rye-html-start"), true) - MaybeDisplayFailureOrError(es, es.Idx, "do_html\\code") + evaldo.EvalBlockInj(es, *env.NewNative(es.Idx, token, "rye-html-start"), true) + evaldo.MaybeDisplayFailureOrError(es, es.Idx, "do_html\\code") if es.ErrorFlag { return es.Res @@ -244,8 +245,8 @@ myloop: case env.Block: // if values of start key is of type block, evaluate it ser := es.Ser // TODO -- make helper function that "does" a block es.Ser = code.Series - EvalBlockInj(es, *env.NewNative(es.Idx, token, "rye-html-start"), true) - MaybeDisplayFailureOrError(es, es.Idx, "do_html\\subnode") + evaldo.EvalBlockInj(es, *env.NewNative(es.Idx, token, "rye-html-start"), true) + evaldo.MaybeDisplayFailureOrError(es, es.Idx, "do_html\\subnode") if es.ErrorFlag { return es.Res } @@ -287,7 +288,7 @@ myloop: case env.Block: // if values of start key is of type block, evaluate it ser := es.Ser // TODO -- make helper function that "does" a block es.Ser = obj.Series - EvalBlockInj(es, *env.NewNative(es.Idx, tok, "rye-html-start"), true) + evaldo.EvalBlockInj(es, *env.NewNative(es.Idx, tok, "rye-html-start"), true) es.Ser = ser default: // TODO Err @@ -296,7 +297,7 @@ myloop: case env.Block: ser := es.Ser // TODO -- make helper function that "does" a block es.Ser = blk2.Series - EvalBlockInj(es, *env.NewNative(es.Idx, tok, "rye-html-start"), true) + evaldo.EvalBlockInj(es, *env.NewNative(es.Idx, tok, "rye-html-start"), true) es.Ser = ser } } */ @@ -318,8 +319,8 @@ myloop: // fmt.Println("IN BLOCK") ser := es.Ser // TODO -- make helper function that "does" a block es.Ser = node.Code.Series - EvalBlockInj(es, *env.NewString(tok.Data), true) - MaybeDisplayFailureOrError(es, es.Idx, "do_html\\text-token") + evaldo.EvalBlockInj(es, *env.NewString(tok.Data), true) + evaldo.MaybeDisplayFailureOrError(es, es.Idx, "do_html\\text-token") if es.ErrorFlag { return es.Res } @@ -342,8 +343,8 @@ myloop: case env.Block: ser := es.Ser // TODO -- make helper function that "does" a block es.Ser = obj.Series - EvalBlockInj(es, *env.NewNative(es.Idx, tok, "rye-html-start"), true) - MaybeDisplayFailureOrError(es, es.Idx, "do_html\\end-tag-token") + evaldo.EvalBlockInj(es, *env.NewNative(es.Idx, tok, "rye-html-start"), true) + evaldo.MaybeDisplayFailureOrError(es, es.Idx, "do_html\\end-tag-token") if es.ErrorFlag { return es.Res @@ -380,8 +381,8 @@ myloop: case HtmlDialectNode: // if values of start key is of type block, evaluate it ser := es.Ser // TODO -- make helper function that "does" a block es.Ser = obj.Code.Series - EvalBlockInj(es, *env.NewNative(es.Idx, "", "rye-html-start"), true) - MaybeDisplayFailureOrError(es, es.Idx, "do_html\\return") + evaldo.EvalBlockInj(es, *env.NewNative(es.Idx, "", "rye-html-start"), true) + evaldo.MaybeDisplayFailureOrError(es, es.Idx, "do_html\\return") if es.ErrorFlag { return es.Res @@ -421,7 +422,7 @@ var Builtins_html = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { text, ok := arg0.(env.String) if !ok { - return MakeArgError(ps, 1, []env.Type{env.StringType}, "unescape\\html") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "unescape\\html") } mkd := html.UnescapeString(text.Value) return *env.NewString(mkd) @@ -440,7 +441,7 @@ var Builtins_html = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { text, ok := arg0.(env.String) if !ok { - return MakeArgError(ps, 1, []env.Type{env.StringType}, "unescape\\html") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "unescape\\html") } mkd := html.EscapeString(text.Value) return *env.NewString(mkd) @@ -459,11 +460,11 @@ var Builtins_html = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { text, ok := arg0.(env.String) if !ok { - return MakeArgError(ps, 1, []env.Type{env.StringType}, "html->markdown") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "html->markdown") } mkd, err := htmltomarkdown.ConvertString(text.Value) if err != nil { - return MakeBuiltinError(ps, err.Error(), "html->markdown") + return evaldo.MakeBuiltinError(ps, err.Error(), "html->markdown") } return *env.NewString(mkd) }, @@ -488,7 +489,7 @@ var Builtins_html = map[string]*env.Builtin{ // fmt.Println(rm) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error to load html dict.", "reader//parse-html") + return evaldo.MakeBuiltinError(ps, "Error to load html dict.", "reader//parse-html") } return do_html(ps, arg0.(env.Native).Value.(io.Reader), rm) }, @@ -516,7 +517,7 @@ var Builtins_html = map[string]*env.Builtin{ if int(n.Value) < len(tok.Attr) { return *env.NewString(tok.Attr[int(n.Value)].Val) } else { - return MakeBuiltinError(ps, "Attribute index out of bounds.", "rye-html-start//Attr?") + return evaldo.MakeBuiltinError(ps, "Attribute index out of bounds.", "rye-html-start//Attr?") } case env.Word: attrName := ps.Idx.GetWord(n.Index) @@ -525,7 +526,7 @@ var Builtins_html = map[string]*env.Builtin{ return *env.NewString(a.Val) } } - return MakeBuiltinError(ps, "Attribute '"+attrName+"' not found.", "rye-html-start//Attr?") + return evaldo.MakeBuiltinError(ps, "Attribute '"+attrName+"' not found.", "rye-html-start//Attr?") case env.String: attrName := n.Value for _, a := range tok.Attr { @@ -533,15 +534,15 @@ var Builtins_html = map[string]*env.Builtin{ return *env.NewString(a.Val) } } - return MakeBuiltinError(ps, "Attribute '"+attrName+"' not found.", "rye-html-start//Attr?") + return evaldo.MakeBuiltinError(ps, "Attribute '"+attrName+"' not found.", "rye-html-start//Attr?") default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.WordType, env.StringType}, "rye-html-start//Attr?") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.WordType, env.StringType}, "rye-html-start//Attr?") } default: - return MakeBuiltinError(ps, "Token value is not matching.", "rye-html-start//Attr?") + return evaldo.MakeBuiltinError(ps, "Token value is not matching.", "rye-html-start//Attr?") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-html-start//Attr?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-html-start//Attr?") } }, }, @@ -564,10 +565,10 @@ var Builtins_html = map[string]*env.Builtin{ } return *env.NewDict(data) default: - return MakeBuiltinError(ps, "Token value is not matching.", "rye-html-start//Attrs?") + return evaldo.MakeBuiltinError(ps, "Token value is not matching.", "rye-html-start//Attrs?") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-html-start//Attrs?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-html-start//Attrs?") } }, }, @@ -589,10 +590,10 @@ var Builtins_html = map[string]*env.Builtin{ case html.Token: return *env.NewString(tok.Data) default: - return MakeBuiltinError(ps, "Not xml-start element.", "rye-html-start//Name?") + return evaldo.MakeBuiltinError(ps, "Not xml-start element.", "rye-html-start//Name?") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-html-start//Name?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-html-start//Name?") } }, }, diff --git a/evaldo/builtins_html_not.go b/batteries/builtins_html_not.go similarity index 87% rename from evaldo/builtins_html_not.go rename to batteries/builtins_html_not.go index cada60f8..57d380b3 100644 --- a/evaldo/builtins_html_not.go +++ b/batteries/builtins_html_not.go @@ -1,7 +1,7 @@ //go:build no_html // +build no_html -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_http.go b/batteries/builtins_http.go old mode 100755 new mode 100644 similarity index 82% rename from evaldo/builtins_http.go rename to batteries/builtins_http.go index 41aa9f21..036e0fd7 --- a/evaldo/builtins_http.go +++ b/batteries/builtins_http.go @@ -1,7 +1,7 @@ //go:build !no_http // +build !no_http -package evaldo +package batteries // import "C" @@ -14,6 +14,7 @@ import ( "time" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/gobwas/ws" "github.com/gobwas/ws/wsutil" @@ -61,7 +62,7 @@ var Builtins_http = map[string]*env.Builtin{ return *env.NewNative(ps.Idx, server, "Go-server") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "http-server") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "http-server") } }, }, @@ -82,12 +83,12 @@ var Builtins_http = map[string]*env.Builtin{ // ListenAndServe blocks until the server stops or encounters an error err := server.Value.(*http.Server).ListenAndServe() if err != nil { - return makeError(ps, err.Error()) + return evaldo.MakeError(ps, err.Error()) } return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server//Serve") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server//Serve") } }, }, @@ -100,12 +101,12 @@ var Builtins_http = map[string]*env.Builtin{ case env.String: err := server.Value.(*http.Server).ListenAndServe(host.Value, nil) if err != nil { - return makeError(ps, err.Error()) + return evaldo.MakeError(ps, err.Error()) } return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "Go-server//serve\\port") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "Go-server//serve\\port") } }, @@ -146,10 +147,10 @@ var Builtins_http = map[string]*env.Builtin{ err := copier.Copy(&psTemp, &ps) if err != nil { fmt.Println(err.Error()) - // TODO return makeError(ps, err.Error()) + // TODO return evaldo.MakeError(ps, err.Error()) } // Call Rye function with response writer and request objects - CallFunctionArgs2(handler, ps, *env.NewNative(ps.Idx, w, "Go-server-response-writer"), *env.NewNative(ps.Idx, r, "Go-server-request"), nil) + evaldo.CallFunctionArgs2(handler, ps, *env.NewNative(ps.Idx, w, "Go-server-response-writer"), *env.NewNative(ps.Idx, r, "Go-server-request"), nil) // Check for errors after calling handler and print to server console if ps.FailureFlag || ps.ErrorFlag { fmt.Println("Error in HTTP handler: " + ps.Res.Inspect(*ps.Idx)) @@ -170,7 +171,7 @@ var Builtins_http = map[string]*env.Builtin{ fmt.Println(err.Error()) } // Call curried caller with response writer and request objects - CallCurriedCallerArgsN(handler, ps, *env.NewNative(ps.Idx, w, "Go-server-response-writer"), *env.NewNative(ps.Idx, r, "Go-server-request")) + evaldo.CallCurriedCallerArgsN(handler, ps, *env.NewNative(ps.Idx, w, "Go-server-response-writer"), *env.NewNative(ps.Idx, r, "Go-server-request")) // Check for errors after calling handler and print to server console if ps.FailureFlag || ps.ErrorFlag { fmt.Println("Error in HTTP handler: " + ps.Res.Inspect(*ps.Idx)) @@ -183,11 +184,11 @@ var Builtins_http = map[string]*env.Builtin{ return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.StringType, env.FunctionType, env.NativeType}, "Go-server//Handle") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType, env.FunctionType, env.NativeType}, "Go-server//Handle") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server//Handle") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server//Handle") } }, }, @@ -218,11 +219,11 @@ var Builtins_http = map[string]*env.Builtin{ return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-response-writer//Write") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-response-writer//Write") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-response-writer//Write") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-response-writer//Write") } }, }, @@ -248,11 +249,11 @@ var Builtins_http = map[string]*env.Builtin{ return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-response-writer//Set-content-type") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-response-writer//Set-content-type") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-response-writer//Set-content-type") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-response-writer//Set-content-type") } }, }, @@ -283,15 +284,15 @@ var Builtins_http = map[string]*env.Builtin{ return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.StringType}, "Go-server-response-writer//Set-header") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "Go-server-response-writer//Set-header") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.WordType}, "Go-server-response-writer//Set-header") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType}, "Go-server-response-writer//Set-header") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-response-writer//Set-header") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-response-writer//Set-header") } }, }, @@ -320,15 +321,15 @@ var Builtins_http = map[string]*env.Builtin{ return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.StringType}, "Go-server-response-writer//Add-header") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "Go-server-response-writer//Add-header") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.WordType}, "Go-server-response-writer//Add-header") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType}, "Go-server-response-writer//Add-header") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-response-writer//Add-header") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-response-writer//Add-header") } }, }, @@ -355,11 +356,11 @@ var Builtins_http = map[string]*env.Builtin{ return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "Go-server-response-writer//Write-header") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "Go-server-response-writer//Write-header") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-response-writer//Write-header") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-response-writer//Write-header") } }, }, @@ -397,17 +398,17 @@ var Builtins_http = map[string]*env.Builtin{ if err != nil { return } - CallFunctionArgs2(handler, &psTemp, *env.NewNative(psTemp.Idx, conn, "Go-server-websocket"), *env.NewNative(psTemp.Idx, "asd", "Go-server-context"), nil) + evaldo.CallFunctionArgs2(handler, &psTemp, *env.NewNative(psTemp.Idx, conn, "Go-server-websocket"), *env.NewNative(psTemp.Idx, "asd", "Go-server-context"), nil) }() }) return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.FunctionType}, "Go-server//Handle-ws") + return evaldo.MakeArgError(ps, 3, []env.Type{env.FunctionType}, "Go-server//Handle-ws") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server//Handle-ws") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server//Handle-ws") } }, }, @@ -429,12 +430,12 @@ var Builtins_http = map[string]*env.Builtin{ ps.ReturnFlag = true ps.FailureFlag = true ps.ErrorFlag = true - return MakeBuiltinError(ps, "Error in reading client data.", "Go-server-websocket//Read") + return evaldo.MakeBuiltinError(ps, "Error in reading client data.", "Go-server-websocket//Read") } return env.NewString(string(msg)) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-websocket//Read") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-websocket//Read") } }, }, @@ -457,16 +458,16 @@ var Builtins_http = map[string]*env.Builtin{ err := wsutil.WriteServerMessage(sock.Value.(io.Writer), ws.OpText, []byte(message.Value)) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Failed to write server message.", "Go-server-websocket//Write") + return evaldo.MakeBuiltinError(ps, "Failed to write server message.", "Go-server-websocket//Write") } return arg1 default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-websocket//Write") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-websocket//Write") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-websocket//Write") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-websocket//Write") } }, }, @@ -515,17 +516,17 @@ var Builtins_http = map[string]*env.Builtin{ // Check if the parameter exists and has a value if !ok || len(vals[0]) < 1 { ps.FailureFlag = true - return MakeBuiltinError(ps, "Key is missing.", "Go-server-request//query?") + return evaldo.MakeBuiltinError(ps, "Key is missing.", "Go-server-request//query?") } // Return the first value for this parameter return *env.NewString(vals[0]) default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-request//query?") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-request//query?") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//query?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//query?") } }, }, @@ -550,11 +551,11 @@ var Builtins_http = map[string]*env.Builtin{ return *env.NewString(val) default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-request//header?") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-request//header?") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//header?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//header?") } }, }, @@ -577,7 +578,7 @@ var Builtins_http = map[string]*env.Builtin{ username, password, ok := req.Value.(*http.Request).BasicAuth() if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "Basic auth credentials are missing.", "Go-server-request//basic-auth?") + return evaldo.MakeBuiltinError(ps, "Basic auth credentials are missing.", "Go-server-request//basic-auth?") } pair := make([]env.Object, 2) pair[0] = *env.NewString(username) @@ -585,7 +586,7 @@ var Builtins_http = map[string]*env.Builtin{ return *env.NewBlock(*env.NewTSeries(pair)) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//basic-auth?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//basic-auth?") } }, }, @@ -606,7 +607,7 @@ var Builtins_http = map[string]*env.Builtin{ return *env.NewString(req.Value.(*http.Request).Method) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//method?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//method?") } }, }, @@ -627,12 +628,12 @@ var Builtins_http = map[string]*env.Builtin{ data, err := io.ReadAll(req.Value.(*http.Request).Body) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "Go-server-request//read-body") + return evaldo.MakeBuiltinError(ps, err.Error(), "Go-server-request//read-body") } return *env.NewString(string(data)) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//read-body") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//read-body") } }, }, @@ -667,7 +668,7 @@ var Builtins_http = map[string]*env.Builtin{ return *env.NewDict(headers) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//headers?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//headers?") } }, }, @@ -691,7 +692,7 @@ var Builtins_http = map[string]*env.Builtin{ return *env.NewNative(ps.Idx, vals, "Go-server-url") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//url?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//url?") } }, }, @@ -716,7 +717,7 @@ var Builtins_http = map[string]*env.Builtin{ return *env.NewString(val) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-url//path?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-url//path?") } }, }, @@ -732,16 +733,16 @@ var Builtins_http = map[string]*env.Builtin{ cookie, err := req.Value.(*http.Request).Cookie(key.Value) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Cookie key is missing.", "Go-server-request//cookie-val?") + return evaldo.MakeBuiltinError(ps, "Cookie key is missing.", "Go-server-request//cookie-val?") } return *env.NewString(cookie.Value) default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-request//cookie-val?") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-request//cookie-val?") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//cookie-val?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//cookie-val?") } }, }, @@ -757,21 +758,21 @@ var Builtins_http = map[string]*env.Builtin{ r := req.Value.(*http.Request) err := r.ParseForm() if err != nil { - return makeError(ps, err.Error()) + return evaldo.MakeError(ps, err.Error()) } val := r.FormValue(key.Value) if len(val) < 1 { ps.FailureFlag = true - return MakeBuiltinError(ps, "Value is missing.", "Go-server-request//form?") + return evaldo.MakeBuiltinError(ps, "Value is missing.", "Go-server-request//form?") } return *env.NewString(val) default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-request//form?") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-request//form?") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//form?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//form?") } }, }, @@ -785,7 +786,7 @@ var Builtins_http = map[string]*env.Builtin{ r := req.Value.(*http.Request) err := r.ParseForm() if err != nil { - return makeError(ps, err.Error()) + return evaldo.MakeError(ps, err.Error()) } dict := make(map[string]any) for key, val := range r.Form { @@ -794,7 +795,7 @@ var Builtins_http = map[string]*env.Builtin{ return *env.NewDict(dict) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//full-form?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//full-form?") } }, }, @@ -809,12 +810,12 @@ var Builtins_http = map[string]*env.Builtin{ // 10 MB files max err := r.ParseMultipartForm(10 << 20) if err != nil { - return makeError(ps, err.Error()) + return evaldo.MakeError(ps, err.Error()) } return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//parse-multipart-form!") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//parse-multipart-form!") } }, }, @@ -834,7 +835,7 @@ var Builtins_http = map[string]*env.Builtin{ file, handler, err := r.FormFile(key.Value) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, fmt.Sprintf("Failed to read from file: '%v'", err.Error()), "Go-server-request//form-file?") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to read from file: '%v'", err.Error()), "Go-server-request//form-file?") } pair := make([]env.Object, 2) pair[0] = *env.NewNative(ps.Idx, file, "reader") @@ -842,11 +843,11 @@ var Builtins_http = map[string]*env.Builtin{ return *env.NewBlock(*env.NewTSeries(pair)) default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-request//form-file?") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-request//form-file?") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//form-file?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//form-file?") } }, }, @@ -861,7 +862,7 @@ var Builtins_http = map[string]*env.Builtin{ return *env.NewString(r.Filename) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-multipart-header//filename?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-multipart-header//filename?") } }, }, @@ -875,7 +876,7 @@ var Builtins_http = map[string]*env.Builtin{ return *env.NewNative(ps.Idx, sessions.NewCookieStore([]byte(addr.Value)), "Http-cookie-store") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "new-cookie-store") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "new-cookie-store") } }, }, @@ -896,24 +897,24 @@ var Builtins_http = map[string]*env.Builtin{ if err != nil { ps.FailureFlag = true errMsg := fmt.Sprintf("Can't get session: %v", err.Error()) - return MakeBuiltinError(ps, errMsg, "Http-cookie-store//get") + return evaldo.MakeBuiltinError(ps, errMsg, "Http-cookie-store//get") } //fmt.Println("asdsad 1")s return *env.NewNative(ps.Idx, session, "Http-session") default: //fmt.Println("asdsad 2") ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.StringType}, "Http-cookie-store//get") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "Http-cookie-store//get") } default: //fmt.Println("asdsad 3") ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "Http-cookie-store//get") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "Http-cookie-store//get") } default: //fmt.Println("asdsad 4") ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Http-cookie-store//get") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Http-cookie-store//get") } }, }, @@ -937,15 +938,15 @@ var Builtins_http = map[string]*env.Builtin{ session.Value.(*sessions.Session).Values[key.Value] = int(val.Value) return arg0 default: - return MakeArgError(ps, 3, []env.Type{env.StringType, env.IntegerType}, "Http-session//set") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType, env.IntegerType}, "Http-session//set") } //return env.NewError("XOSADOSADOA SDAS DO" + key.Value) // return arg2 // env.String{ctx.Value.(echo.Context).QueryParam(key.Value)} default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Http-session//set") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Http-session//set") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Http-session//set") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Http-session//set") } }, }, @@ -970,17 +971,17 @@ var Builtins_http = map[string]*env.Builtin{ return val2 default: ps.FailureFlag = true - return MakeBuiltinError(ps, "Unknown type.", "Http-session//get") + return evaldo.MakeBuiltinError(ps, "Unknown type.", "Http-session//get") } } else { ps.FailureFlag = true - return MakeBuiltinError(ps, "Value is empty.", "Http-session//get") + return evaldo.MakeBuiltinError(ps, "Value is empty.", "Http-session//get") } default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Http-session//get") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Http-session//get") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Http-session//get") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Http-session//get") } }, }, @@ -999,17 +1000,17 @@ var Builtins_http = map[string]*env.Builtin{ if err != nil { ps.FailureFlag = true errMsg := fmt.Sprintf("Can't save: %v", err.Error()) - return MakeBuiltinError(ps, errMsg, "Http-session//save") + return evaldo.MakeBuiltinError(ps, errMsg, "Http-session//save") } return *env.NewInteger(1) default: - return MakeArgError(ps, 3, []env.Type{env.NativeType}, "Http-session//save") + return evaldo.MakeArgError(ps, 3, []env.Type{env.NativeType}, "Http-session//save") } default: - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "Http-session//save") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "Http-session//save") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Http-session//save") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Http-session//save") } }, }, @@ -1043,7 +1044,7 @@ var Builtins_http = map[string]*env.Builtin{ fmt.Println(c) // fmt.Println(ctx) fmt.Println("<< // Call Function Args 2 >>") - CallFunctionArgs2(handler, env1, *env.NewNative(env1.Idx, c, "Go-server-websocket"), *env.NewNative(env1.Idx, r.Context(), "Go-server-context"), nil) + evaldo.CallFunctionArgs2(handler, env1, *env.NewNative(env1.Idx, c, "Go-server-websocket"), *env.NewNative(env1.Idx, r.Context(), "Go-server-context"), nil) }) return arg0 default: @@ -1131,7 +1132,7 @@ var Builtins_http = map[string]*env.Builtin{ case env.Uri: return *env.NewNative(ps.Idx, http.Dir(addr.Path), "Go-http-dir") default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "http-dir") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "http-dir") } }, }, @@ -1143,7 +1144,7 @@ var Builtins_http = map[string]*env.Builtin{ case env.Uri: return *env.NewNative(ps.Idx, http.FileServer(http.Dir(addr.Path)), "Http-handler") default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "new-static-handler") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "new-static-handler") } }, @@ -1166,10 +1167,10 @@ var Builtins_http = map[string]*env.Builtin{ case env.Native: return *env.NewNative(ps.Idx, http.StripPrefix(prefix.Value, servr.Value.(http.Handler)), "Http-handler") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Http-handler//Strip-prefix") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Http-handler//Strip-prefix") } default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Http-handler//Strip-prefix") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Http-handler//Strip-prefix") } }, }, @@ -1187,11 +1188,11 @@ var Builtins_http = map[string]*env.Builtin{ return *env.NewString(headerValue) default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "https-response//Header?") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "https-response//Header?") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-response//Header?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-response//Header?") } }, }, @@ -1210,7 +1211,7 @@ var Builtins_http = map[string]*env.Builtin{ return *env.NewInteger(int64(response.StatusCode)) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-response//Status?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-response//Status?") } }, }, @@ -1229,7 +1230,7 @@ var Builtins_http = map[string]*env.Builtin{ return *env.NewString(response.Status) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-response//Status-text?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-response//Status-text?") } }, }, diff --git a/evaldo/builtins_http_not.go b/batteries/builtins_http_not.go old mode 100755 new mode 100644 similarity index 87% rename from evaldo/builtins_http_not.go rename to batteries/builtins_http_not.go index 2f3eb725..02958e6b --- a/evaldo/builtins_http_not.go +++ b/batteries/builtins_http_not.go @@ -1,7 +1,7 @@ //go:build no_http // +build no_http -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_imap.go b/batteries/builtins_imap.go similarity index 84% rename from evaldo/builtins_imap.go rename to batteries/builtins_imap.go index 3f208a1c..6fc6b858 100644 --- a/evaldo/builtins_imap.go +++ b/batteries/builtins_imap.go @@ -1,7 +1,7 @@ //go:build !no_imap // +build !no_imap -package evaldo +package batteries import ( "fmt" @@ -9,6 +9,7 @@ import ( "time" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" imap "github.com/BrianLeishman/go-imap" ) @@ -74,16 +75,16 @@ var Builtins_imap = map[string]*env.Builtin{ } return *env.NewNative(ps.Idx, client, "imap-client") default: - return MakeArgError(ps, 4, []env.Type{env.IntegerType}, "new-imap-client") + return evaldo.MakeArgError(ps, 4, []env.Type{env.IntegerType}, "new-imap-client") } default: - return MakeArgError(ps, 3, []env.Type{env.StringType}, "new-imap-client") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "new-imap-client") } default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "new-imap-client") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "new-imap-client") } default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "new-imap-client") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "new-imap-client") } }, }, @@ -119,16 +120,16 @@ var Builtins_imap = map[string]*env.Builtin{ } return *env.NewNative(ps.Idx, client, "imap-client") default: - return MakeArgError(ps, 4, []env.Type{env.IntegerType}, "new-imap-client-oauth2") + return evaldo.MakeArgError(ps, 4, []env.Type{env.IntegerType}, "new-imap-client-oauth2") } default: - return MakeArgError(ps, 3, []env.Type{env.StringType}, "new-imap-client-oauth2") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "new-imap-client-oauth2") } default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "new-imap-client-oauth2") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "new-imap-client-oauth2") } default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "new-imap-client-oauth2") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "new-imap-client-oauth2") } }, }, @@ -159,13 +160,13 @@ var Builtins_imap = map[string]*env.Builtin{ } return arg0 default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "imap-client//select-folder") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "imap-client//select-folder") } } else { - return MakeBuiltinError(ps, "Expected imap-client", "imap-client//select-folder") + return evaldo.MakeBuiltinError(ps, "Expected imap-client", "imap-client//select-folder") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "imap-client//select-folder") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "imap-client//select-folder") } }, }, @@ -198,10 +199,10 @@ var Builtins_imap = map[string]*env.Builtin{ } return *env.NewBlock(*env.NewTSeries(result)) } else { - return MakeBuiltinError(ps, "Expected imap-client", "imap-client//get-folders") + return evaldo.MakeBuiltinError(ps, "Expected imap-client", "imap-client//get-folders") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "imap-client//get-folders") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "imap-client//get-folders") } }, }, @@ -238,13 +239,13 @@ var Builtins_imap = map[string]*env.Builtin{ } return *env.NewBlock(*env.NewTSeries(result)) default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "imap-client//search-emails") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "imap-client//search-emails") } } else { - return MakeBuiltinError(ps, "Expected imap-client", "imap-client//search-emails") + return evaldo.MakeBuiltinError(ps, "Expected imap-client", "imap-client//search-emails") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "imap-client//search-emails") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "imap-client//search-emails") } }, }, @@ -275,7 +276,7 @@ var Builtins_imap = map[string]*env.Builtin{ case env.Integer: uids = append(uids, int(uid.Value)) default: - return MakeBuiltinError(ps, "All UIDs must be integers", "imap-client//get-overviews") + return evaldo.MakeBuiltinError(ps, "All UIDs must be integers", "imap-client//get-overviews") } } @@ -339,13 +340,13 @@ var Builtins_imap = map[string]*env.Builtin{ return *env.NewBlock(*env.NewTSeries(result)) default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "imap-client//get-overviews") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "imap-client//get-overviews") } } else { - return MakeBuiltinError(ps, "Expected imap-client", "imap-client//get-overviews") + return evaldo.MakeBuiltinError(ps, "Expected imap-client", "imap-client//get-overviews") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "imap-client//get-overviews") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "imap-client//get-overviews") } }, }, @@ -376,7 +377,7 @@ var Builtins_imap = map[string]*env.Builtin{ case env.Integer: uids = append(uids, int(uid.Value)) default: - return MakeBuiltinError(ps, "All UIDs must be integers", "imap-client//get-emails") + return evaldo.MakeBuiltinError(ps, "All UIDs must be integers", "imap-client//get-emails") } } @@ -489,13 +490,13 @@ var Builtins_imap = map[string]*env.Builtin{ return *env.NewBlock(*env.NewTSeries(result)) default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "imap-client//get-emails") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "imap-client//get-emails") } } else { - return MakeBuiltinError(ps, "Expected imap-client", "imap-client//get-emails") + return evaldo.MakeBuiltinError(ps, "Expected imap-client", "imap-client//get-emails") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "imap-client//get-emails") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "imap-client//get-emails") } }, }, @@ -516,13 +517,13 @@ var Builtins_imap = map[string]*env.Builtin{ } return arg0 default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "imap-client//mark-seen") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "imap-client//mark-seen") } } else { - return MakeBuiltinError(ps, "Expected imap-client", "imap-client//mark-seen") + return evaldo.MakeBuiltinError(ps, "Expected imap-client", "imap-client//mark-seen") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "imap-client//mark-seen") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "imap-client//mark-seen") } }, }, @@ -545,16 +546,16 @@ var Builtins_imap = map[string]*env.Builtin{ } return arg0 default: - return MakeArgError(ps, 3, []env.Type{env.StringType}, "imap-client//move-email") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "imap-client//move-email") } default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "imap-client//move-email") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "imap-client//move-email") } } else { - return MakeBuiltinError(ps, "Expected imap-client", "imap-client//move-email") + return evaldo.MakeBuiltinError(ps, "Expected imap-client", "imap-client//move-email") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "imap-client//move-email") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "imap-client//move-email") } }, }, @@ -575,13 +576,13 @@ var Builtins_imap = map[string]*env.Builtin{ } return arg0 default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "imap-client//delete-email") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "imap-client//delete-email") } } else { - return MakeBuiltinError(ps, "Expected imap-client", "imap-client//delete-email") + return evaldo.MakeBuiltinError(ps, "Expected imap-client", "imap-client//delete-email") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "imap-client//delete-email") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "imap-client//delete-email") } }, }, @@ -600,10 +601,10 @@ var Builtins_imap = map[string]*env.Builtin{ } return arg0 } else { - return MakeBuiltinError(ps, "Expected imap-client", "imap-client//expunge") + return evaldo.MakeBuiltinError(ps, "Expected imap-client", "imap-client//expunge") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "imap-client//expunge") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "imap-client//expunge") } }, }, @@ -622,10 +623,10 @@ var Builtins_imap = map[string]*env.Builtin{ } return env.Void{} } else { - return MakeBuiltinError(ps, "Expected imap-client", "imap-client//close") + return evaldo.MakeBuiltinError(ps, "Expected imap-client", "imap-client//close") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "imap-client//close") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "imap-client//close") } }, }, diff --git a/evaldo/builtins_io.go b/batteries/builtins_io.go old mode 100755 new mode 100644 similarity index 80% rename from evaldo/builtins_io.go rename to batteries/builtins_io.go index 93e44cd6..18296956 --- a/evaldo/builtins_io.go +++ b/batteries/builtins_io.go @@ -1,7 +1,7 @@ //go:build !no_io // +build !no_io -package evaldo +package batteries import ( "bufio" @@ -14,6 +14,7 @@ import ( "github.com/hpcloud/tail" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "net/http" // "net/http/cgi" @@ -64,7 +65,7 @@ var Builtins_io = map[string]*env.Builtin{ return *env.NewString(input) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "input") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "input") } }, }, @@ -87,11 +88,11 @@ var Builtins_io = map[string]*env.Builtin{ case env.Uri: file, err := os.Open(s.Path) if err != nil { - return makeError(ps, err.Error()) + return evaldo.MakeError(ps, err.Error()) } return *env.NewNative(ps.Idx, file, "file") default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Open") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Open") } }, }, @@ -111,18 +112,18 @@ var Builtins_io = map[string]*env.Builtin{ profile, exists := os.LookupEnv("RYE_SECCOMP_PROFILE") if exists && profile == "readonly" { ps.FailureFlag = true - return MakeBuiltinError(ps, "file append operation blocked by readonly seccomp profile", "file-uri//Open\\append") + return evaldo.MakeBuiltinError(ps, "file append operation blocked by readonly seccomp profile", "file-uri//Open\\append") } switch s := arg0.(type) { case env.Uri: file, err := os.OpenFile(s.Path, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) if err != nil { - return MakeBuiltinError(ps, err.Error(), "__openFile") + return evaldo.MakeBuiltinError(ps, err.Error(), "__openFile") } return *env.NewNative(ps.Idx, file, "file") default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "__openFile") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "__openFile") } }, }, @@ -142,7 +143,7 @@ var Builtins_io = map[string]*env.Builtin{ profile, exists := os.LookupEnv("RYE_SECCOMP_PROFILE") if exists && profile == "readonly" { ps.FailureFlag = true - return MakeBuiltinError(ps, "file creation blocked by readonly seccomp profile", "file-uri//Create") + return evaldo.MakeBuiltinError(ps, "file creation blocked by readonly seccomp profile", "file-uri//Create") } switch s := arg0.(type) { @@ -152,13 +153,13 @@ var Builtins_io = map[string]*env.Builtin{ if err != nil { ps.ReturnFlag = true ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "__create") + return evaldo.MakeBuiltinError(ps, err.Error(), "__create") } return *env.NewNative(ps.Idx, file, "file") default: ps.ReturnFlag = true ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.UriType}, "__create") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "__create") } }, }, @@ -183,7 +184,7 @@ var Builtins_io = map[string]*env.Builtin{ ext := filepath.Ext(s.Value) return *env.NewString(ext) */ default: - return MakeArgError(ps, 1, []env.Type{env.UriType, env.StringType}, "Ext?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType, env.StringType}, "Ext?") } }, }, @@ -203,7 +204,7 @@ var Builtins_io = map[string]*env.Builtin{ filename := filepath.Base(s.Path) return *env.NewString(filename) default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "Name?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "Name?") } }, }, @@ -224,7 +225,7 @@ var Builtins_io = map[string]*env.Builtin{ stem := strings.TrimSuffix(base, filepath.Ext(base)) return *env.NewString(stem) default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Stem?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Stem?") } }, }, @@ -244,7 +245,7 @@ var Builtins_io = map[string]*env.Builtin{ dir := filepath.Dir(s.Path) return *env.NewString(dir) default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Dir?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Dir?") } }, }, @@ -277,7 +278,7 @@ var Builtins_io = map[string]*env.Builtin{ return *env.NewBlock(*env.NewTSeries(components)) default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Split") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Split") } }, }, @@ -295,7 +296,7 @@ var Builtins_io = map[string]*env.Builtin{ isAbs := filepath.IsAbs(s.Path) return *env.NewBoolean(isAbs) default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Is-absolute") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Is-absolute") } }, }, @@ -323,7 +324,7 @@ var Builtins_io = map[string]*env.Builtin{ // For other errors (e.g., permission denied), return false return *env.NewBoolean(false) default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Does-exist") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Does-exist") } }, }, @@ -340,7 +341,7 @@ var Builtins_io = map[string]*env.Builtin{ profile, exists := os.LookupEnv("RYE_SECCOMP_PROFILE") if exists && profile == "readonly" { ps.FailureFlag = true - return MakeBuiltinError(ps, "delete operation blocked by readonly seccomp profile", "file-uri//Delete") + return evaldo.MakeBuiltinError(ps, "delete operation blocked by readonly seccomp profile", "file-uri//Delete") } switch s := arg0.(type) { @@ -348,11 +349,11 @@ var Builtins_io = map[string]*env.Builtin{ err := os.Remove(s.Path) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "file-uri//Delete") + return evaldo.MakeBuiltinError(ps, err.Error(), "file-uri//Delete") } return *env.NewBoolean(true) default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Delete") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Delete") } }, }, @@ -372,12 +373,12 @@ var Builtins_io = map[string]*env.Builtin{ file, ok := s.Value.(*os.File) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error opening file.", "file//Reader") + return evaldo.MakeBuiltinError(ps, "Error opening file.", "file//Reader") } return *env.NewNative(ps.Idx, bufio.NewReader(file), "reader") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "file//Reader") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "file//Reader") } }, }, @@ -397,12 +398,12 @@ var Builtins_io = map[string]*env.Builtin{ file, ok := s.Value.(*os.File) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error opening file.", "file//Reader") + return evaldo.MakeBuiltinError(ps, "Error opening file.", "file//Reader") } return *env.NewNative(ps.Idx, bufio.NewWriter(file), "writer") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "file//Reader") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "file//Reader") } }, }, @@ -422,12 +423,12 @@ var Builtins_io = map[string]*env.Builtin{ //trace3(path) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error opening file.", "file-uri//Reader") + return evaldo.MakeBuiltinError(ps, "Error opening file.", "file-uri//Reader") } return *env.NewNative(ps.Idx, bufio.NewReader(file), "reader") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Read") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Read") } }, }, @@ -446,7 +447,7 @@ var Builtins_io = map[string]*env.Builtin{ return *env.NewNative(ps.Idx, bufio.NewReader(strings.NewReader(s.Value)), "reader") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "reader") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "reader") } }, }, @@ -504,18 +505,18 @@ var Builtins_io = map[string]*env.Builtin{ reader, ok := r.Value.(io.Reader) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "Not Reader", "__read\\string") + return evaldo.MakeBuiltinError(ps, "Not Reader", "__read\\string") } buf := new(strings.Builder) _, err := io.Copy(buf, reader) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "__read\\string") + return evaldo.MakeBuiltinError(ps, err.Error(), "__read\\string") } return *env.NewString(buf.String()) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "__read\\string") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "__read\\string") } }, @@ -536,7 +537,7 @@ var Builtins_io = map[string]*env.Builtin{ err := closer.Close() if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "reader//Close") + return evaldo.MakeBuiltinError(ps, err.Error(), "reader//Close") } return *env.NewString("") } @@ -545,7 +546,7 @@ var Builtins_io = map[string]*env.Builtin{ return *env.NewString("") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "reader//Close") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "reader//Close") } }, }, @@ -567,16 +568,16 @@ var Builtins_io = map[string]*env.Builtin{ _, err := io.Copy(w.Value.(io.Writer), r.Value.(io.Reader)) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "__copy") + return evaldo.MakeBuiltinError(ps, err.Error(), "__copy") } return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "__copy") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "__copy") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "__copy") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "__copy") } }, @@ -601,16 +602,16 @@ var Builtins_io = map[string]*env.Builtin{ _, err := io.Copy(w.Value.(io.Writer), r.Value.(io.Reader)) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "__copy") + return evaldo.MakeBuiltinError(ps, err.Error(), "__copy") } return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "__copy") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "__copy") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "__copy") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "__copy") } }, @@ -631,12 +632,12 @@ var Builtins_io = map[string]*env.Builtin{ info, err := r.Value.(*os.File).Stat() if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "file//Stat") + return evaldo.MakeBuiltinError(ps, err.Error(), "file//Stat") } return *env.NewNative(ps.Idx, info, "file-info") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "file//Stat") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "file//Stat") } }, }, @@ -656,7 +657,7 @@ var Builtins_io = map[string]*env.Builtin{ size := s.Value.(os.FileInfo).Size() return *env.NewInteger(size) default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "file-info//Size?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "file-info//Size?") } }, }, @@ -676,12 +677,12 @@ var Builtins_io = map[string]*env.Builtin{ data, err := io.ReadAll(s.Value.(io.Reader)) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error reading file.", "Read") + return evaldo.MakeBuiltinError(ps, "Error reading file.", "Read") } return *env.NewString(string(data)) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Read") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Read") } }, }, @@ -698,13 +699,13 @@ var Builtins_io = map[string]*env.Builtin{ case env.Native: reader, ok := s.Value.(*os.File) if !ok { - return MakeBuiltinError(ps, "Native not io.Reader", "file//Seek\\end") + return evaldo.MakeBuiltinError(ps, "Native not io.Reader", "file//Seek\\end") } reader.Seek(0, os.SEEK_END) return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "file//Seek\\end") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "file//Seek\\end") } }, }, @@ -722,7 +723,7 @@ var Builtins_io = map[string]*env.Builtin{ profile, exists := os.LookupEnv("RYE_SECCOMP_PROFILE") if exists && profile == "readonly" { ps.FailureFlag = true - return MakeBuiltinError(ps, "write operation blocked by readonly seccomp profile", "file//Write") + return evaldo.MakeBuiltinError(ps, "write operation blocked by readonly seccomp profile", "file//Write") } switch s := arg0.(type) { @@ -730,23 +731,23 @@ var Builtins_io = map[string]*env.Builtin{ file, ok := s.Value.(*os.File) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "Native not os.File", "file//Write") + return evaldo.MakeBuiltinError(ps, "Native not os.File", "file//Write") } switch content := arg1.(type) { case env.String: _, err := file.WriteString(content.Value) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "file//Write") + return evaldo.MakeBuiltinError(ps, err.Error(), "file//Write") } return arg0 // Return the file object for chaining default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "file//Write") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "file//Write") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "file//Write") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "file//Write") } }, }, @@ -766,12 +767,12 @@ var Builtins_io = map[string]*env.Builtin{ err := s.Value.(*os.File).Close() if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "__close") + return evaldo.MakeBuiltinError(ps, err.Error(), "__close") } return *env.NewString("") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "__close") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "__close") } }, @@ -791,11 +792,11 @@ var Builtins_io = map[string]*env.Builtin{ case env.Uri: data, err := os.ReadFile(f.GetPath()) if err != nil { - return MakeBuiltinError(ps, err.Error(), "file-uri//Read") + return evaldo.MakeBuiltinError(ps, err.Error(), "file-uri//Read") } return *env.NewString(string(data)) default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Read") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Read") } }, }, @@ -814,11 +815,11 @@ var Builtins_io = map[string]*env.Builtin{ case env.Uri: data, err := os.ReadFile(f.GetPath()) if err != nil { - return MakeBuiltinError(ps, err.Error(), "__fs_read_bytes") + return evaldo.MakeBuiltinError(ps, err.Error(), "__fs_read_bytes") } return *env.NewBytes(data) default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "__fs_read_bytes") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "__fs_read_bytes") } // return __fs_read_bytes(ps, arg0, arg1, arg2, arg3, arg4) }, }, @@ -837,7 +838,7 @@ var Builtins_io = map[string]*env.Builtin{ case env.Uri: file, err := os.OpenFile(f.GetPath(), os.O_RDONLY, os.ModePerm) if err != nil { - return MakeBuiltinError(ps, err.Error(), "file-uri//Read\\lines") + return evaldo.MakeBuiltinError(ps, err.Error(), "file-uri//Read\\lines") } defer file.Close() @@ -847,11 +848,11 @@ var Builtins_io = map[string]*env.Builtin{ lines = append(lines, *env.NewString(sc.Text())) } if err := sc.Err(); err != nil { - return MakeBuiltinError(ps, err.Error(), "file-uri//Read\\lines") + return evaldo.MakeBuiltinError(ps, err.Error(), "file-uri//Read\\lines") } return *env.NewBlock(*env.NewTSeries(lines)) default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Read\\lines") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Read\\lines") } }, }, @@ -871,7 +872,7 @@ var Builtins_io = map[string]*env.Builtin{ profile, exists := os.LookupEnv("RYE_SECCOMP_PROFILE") if exists && profile == "readonly" { ps.FailureFlag = true - return MakeBuiltinError(ps, "write operation blocked by readonly seccomp profile", "file-uri//Write") + return evaldo.MakeBuiltinError(ps, "write operation blocked by readonly seccomp profile", "file-uri//Write") } // If not in readonly mode, proceed with the original function @@ -882,22 +883,22 @@ var Builtins_io = map[string]*env.Builtin{ err := os.WriteFile(f.GetPath(), []byte(s.Value), 0600) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "__fs_write") + return evaldo.MakeBuiltinError(ps, err.Error(), "__fs_write") } return arg1 case env.Native: err := os.WriteFile(f.GetPath(), s.Value.([]byte), 0600) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "__fs_write") + return evaldo.MakeBuiltinError(ps, err.Error(), "__fs_write") } return arg1 default: - return MakeArgError(ps, 2, []env.Type{env.StringType, env.NativeType}, "__fs_write") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType, env.NativeType}, "__fs_write") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.UriType}, "__fs_write") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "__fs_write") } }, }, @@ -916,23 +917,23 @@ var Builtins_io = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(bytesObj.GetKind()) != "Go-bytes" { ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "write-file") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "write-file") } switch path := arg1.(type) { case env.String: err := os.WriteFile(path.Value, bytesObj.Value.([]byte), 0644) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, fmt.Sprintf("Failed to write file: %v", err), "write-file") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to write file: %v", err), "write-file") } return env.Integer{1} // Success indicator default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "write-file") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "write-file") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "write-file") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "write-file") } }, }, @@ -954,11 +955,11 @@ var Builtins_io = map[string]*env.Builtin{ return *env.NewBytes(combined) default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.BytesType}, "append-bytes") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BytesType}, "append-bytes") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.BytesType}, "append-bytes") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BytesType}, "append-bytes") } }, }, @@ -980,7 +981,7 @@ var Builtins_io = map[string]*env.Builtin{ case env.Native: _, ok := ww.Value.(io.Writer) if !ok { - return MakeBuiltinError(ps, "Native not io.Writer", "writer//Write") + return evaldo.MakeBuiltinError(ps, "Native not io.Writer", "writer//Write") } } } @@ -993,7 +994,7 @@ var Builtins_io = map[string]*env.Builtin{ if bw, ok := ww.Value.(*bufio.Writer); ok { _, err := bw.WriteString(s.Value) if err != nil { - return MakeBuiltinError(ps, "Error at write: "+err.Error(), "writer//Write") + return evaldo.MakeBuiltinError(ps, "Error at write: "+err.Error(), "writer//Write") } return arg0 } @@ -1001,18 +1002,18 @@ var Builtins_io = map[string]*env.Builtin{ if w, ok := ww.Value.(io.Writer); ok { _, err := io.WriteString(w, s.Value) if err != nil { - return MakeBuiltinError(ps, "Error at write: "+err.Error(), "writer//Write") + return evaldo.MakeBuiltinError(ps, "Error at write: "+err.Error(), "writer//Write") } return arg0 } - return MakeBuiltinError(ps, "Native not io.Writer", "writer//Write") + return evaldo.MakeBuiltinError(ps, "Native not io.Writer", "writer//Write") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "writer//Write") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "writer//Write") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "writer//Write") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "writer//Write") } }, }, @@ -1028,12 +1029,12 @@ var Builtins_io = map[string]*env.Builtin{ //trace3(path) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error opening file.", "file-uri//open") + return evaldo.MakeBuiltinError(ps, "Error opening file.", "file-uri//open") } return *env.NewNative(ps.Idx, bufio.NewReader(file), "file-uri//open") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "file-uri//open") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "file-uri//open") } }, }, */ @@ -1077,11 +1078,11 @@ var Builtins_io = map[string]*env.Builtin{ } else { ps.FailureFlag = true errMsg := fmt.Sprintf("Status Code: %v", resp.StatusCode) - return MakeBuiltinError(ps, errMsg, "https-uri://Open") + return evaldo.MakeBuiltinError(ps, errMsg, "https-uri://Open") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-uri://Open") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-uri://Open") } }, }, @@ -1115,11 +1116,11 @@ var Builtins_io = map[string]*env.Builtin{ } else { ps.FailureFlag = true errMsg := fmt.Sprintf("Status Code: %v", resp.StatusCode) - return MakeBuiltinError(ps, errMsg, "https-uri//Get") + return evaldo.MakeBuiltinError(ps, errMsg, "https-uri//Get") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.UriType}, "https-uri//Get") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "https-uri//Get") } }, }, @@ -1158,14 +1159,14 @@ var Builtins_io = map[string]*env.Builtin{ tt = "multipart/form-data" } else { ps.FailureFlag = true - return MakeBuiltinError(ps, "Wrong content type.", "https-uri//Post") + return evaldo.MakeBuiltinError(ps, "Wrong content type.", "https-uri//Post") } case env.String: // New behavior: use string directly as content-type tt = t.Value default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.WordType, env.StringType}, "https-uri//Post") + return evaldo.MakeArgError(ps, 3, []env.Type{env.WordType, env.StringType}, "https-uri//Post") } proto := ps.Idx.GetWord(f.GetProtocol().Index) @@ -1184,7 +1185,7 @@ var Builtins_io = map[string]*env.Builtin{ body, err := io.ReadAll(resp.Body) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "https-uri//Post") + return evaldo.MakeBuiltinError(ps, err.Error(), "https-uri//Post") } if resp.StatusCode >= 200 && resp.StatusCode <= 299 { @@ -1195,11 +1196,11 @@ var Builtins_io = map[string]*env.Builtin{ } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "https-uri//Post") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "https-uri//Post") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.UriType}, "https-uri//Post") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "https-uri//Post") } }, }, @@ -1233,11 +1234,11 @@ var Builtins_io = map[string]*env.Builtin{ } else { ps.FailureFlag = true errMsg := fmt.Sprintf("Status Code: %v", resp.StatusCode) - return MakeBuiltinError(ps, errMsg, "http-uri//Get") + return evaldo.MakeBuiltinError(ps, errMsg, "http-uri//Get") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.UriType}, "http-uri//Get") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "http-uri//Get") } }, }, @@ -1267,7 +1268,7 @@ var Builtins_io = map[string]*env.Builtin{ tt = "text/plain" } else { ps.FailureFlag = true - return MakeBuiltinError(ps, "Wrong content type.", "http-uri//Post") + return evaldo.MakeBuiltinError(ps, "Wrong content type.", "http-uri//Post") } proto := ps.Idx.GetWord(f.GetProtocol().Index) @@ -1286,7 +1287,7 @@ var Builtins_io = map[string]*env.Builtin{ body, err := io.ReadAll(resp.Body) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "http-uri//Post") + return evaldo.MakeBuiltinError(ps, err.Error(), "http-uri//Post") } if resp.StatusCode >= 200 && resp.StatusCode <= 299 { @@ -1297,15 +1298,15 @@ var Builtins_io = map[string]*env.Builtin{ } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "http-uri//Post") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "http-uri//Post") } default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.WordType}, "http-uri//Post") + return evaldo.MakeArgError(ps, 3, []env.Type{env.WordType}, "http-uri//Post") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.UriType}, "http-uri//Post") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "http-uri//Post") } }, }, @@ -1327,7 +1328,7 @@ var Builtins_io = map[string]*env.Builtin{ method1 := ps.Idx.GetWord(method.Index) if !(method1 == "GET" || method1 == "POST" || method1 == "PUT" || method1 == "DELETE") { ps.FailureFlag = true - return MakeBuiltinError(ps, "Wrong method.", "https-uri//Request") + return evaldo.MakeBuiltinError(ps, "Wrong method.", "https-uri//Request") } switch data := arg2.(type) { case env.String: @@ -1336,20 +1337,20 @@ var Builtins_io = map[string]*env.Builtin{ req, err := http.NewRequest(method1, proto+"://"+uri.GetPath(), data1) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "https-uri//Request") + return evaldo.MakeBuiltinError(ps, err.Error(), "https-uri//Request") } return *env.NewNative(ps.Idx, req, "https-request") default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.StringType}, "https-uri//Request") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "https-uri//Request") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.WordType}, "https-uri//Request") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType}, "https-uri//Request") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.UriType}, "https-uri//Request") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "https-uri//Request") } }, }, @@ -1374,13 +1375,13 @@ var Builtins_io = map[string]*env.Builtin{ req.Value.(*http.Request).Header.Set(name, data.Value) return arg0 default: - return MakeArgError(ps, 3, []env.Type{env.StringType}, "https-request//Header!") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "https-request//Header!") } default: - return MakeArgError(ps, 2, []env.Type{env.WordType}, "https-request//Header!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType}, "https-request//Header!") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-request//Header!") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-request//Header!") } }, }, @@ -1404,13 +1405,13 @@ var Builtins_io = map[string]*env.Builtin{ req.Value.(*http.Request).SetBasicAuth(username.Value, password.Value) return arg0 default: - return MakeArgError(ps, 3, []env.Type{env.StringType}, "https-request//Basic-auth!") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "https-request//Basic-auth!") } default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "https-request//Basic-auth!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "https-request//Basic-auth!") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-request//Basic-auth!") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-request//Basic-auth!") } }, }, @@ -1429,13 +1430,13 @@ var Builtins_io = map[string]*env.Builtin{ resp, err := client.Do(req.Value.(*http.Request)) // defer resp.Body.Close() // TODO -- comment this and figure out goling bodyclose if err != nil { - return MakeBuiltinError(ps, err.Error(), "https-request//Call") + return evaldo.MakeBuiltinError(ps, err.Error(), "https-request//Call") } // Always return the response object regardless of status code // Users can check the status code using https-response//Status? return *env.NewNative(ps.Idx, resp, "https-response") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-request//Call") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-request//Call") } }, }, @@ -1454,7 +1455,7 @@ var Builtins_io = map[string]*env.Builtin{ return *env.NewNative(ps.Idx, resp.Value.(*http.Response).Body, "reader") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-response//Reader") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-response//Reader") } }, }, @@ -1471,12 +1472,12 @@ var Builtins_io = map[string]*env.Builtin{ case env.Native: data, err := io.ReadAll(resp.Value.(*http.Response).Body) if err != nil { - return MakeBuiltinError(ps, err.Error(), "https-response//Read-body") + return evaldo.MakeBuiltinError(ps, err.Error(), "https-response//Read-body") } return *env.NewString(string(data)) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-response//Read-body") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-response//Read-body") } }, }, @@ -1494,12 +1495,12 @@ var Builtins_io = map[string]*env.Builtin{ err := resp.Value.(*http.Response).Body.Close() if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "https-response//Close-body!") + return evaldo.MakeBuiltinError(ps, err.Error(), "https-response//Close-body!") } return *env.NewString("") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-response//Close-body!") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-response//Close-body!") } }, }, @@ -1568,11 +1569,11 @@ var Builtins_io = map[string]*env.Builtin{ return *env.NewInteger(1) default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "email//Send") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "email//Send") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.EmailType}, "email//Send") + return evaldo.MakeArgError(ps, 1, []env.Type{env.EmailType}, "email//Send") } }, }, @@ -1594,17 +1595,17 @@ var Builtins_io = map[string]*env.Builtin{ conn, err := ftp.Dial(s.Path) if err != nil { fmt.Println("Error connecting to FTP server:", err) - return MakeBuiltinError(ps, "Error connecting to FTP server: "+err.Error(), "ftp-uri//Open") + return evaldo.MakeBuiltinError(ps, "Error connecting to FTP server: "+err.Error(), "ftp-uri//Open") } //trace3(path) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error opening file.", "ftp-uri//Open") + return evaldo.MakeBuiltinError(ps, "Error opening file.", "ftp-uri//Open") } return *env.NewNative(ps.Idx, conn, "ftp-connection") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.UriType, env.StringType}, "ftp-uri//Open") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType, env.StringType}, "ftp-uri//Open") } }, }, @@ -1641,7 +1642,7 @@ var Builtins_io = map[string]*env.Builtin{ return s default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.UriType, env.StringType}, "ftp-connection//Login") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType, env.StringType}, "ftp-connection//Login") } }, }, @@ -1670,7 +1671,7 @@ var Builtins_io = map[string]*env.Builtin{ return *env.NewNative(ps.Idx, resp, "reader") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.UriType, env.StringType}, "ftp-connection//Retrieve") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType, env.StringType}, "ftp-connection//Retrieve") } }, }, @@ -1689,20 +1690,20 @@ var Builtins_io = map[string]*env.Builtin{ switch s := arg0.(type) { case env.Native: if ps.Idx.GetWord(s.Kind.Index) != "ftp-connection" { - return MakeBuiltinError(ps, "Expected FTP connection.", "ftp-connection//Close") + return evaldo.MakeBuiltinError(ps, "Expected FTP connection.", "ftp-connection//Close") } conn, ok := s.Value.(*ftp.ServerConn) if !ok { - return MakeBuiltinError(ps, "Invalid FTP connection.", "ftp-connection//Close") + return evaldo.MakeBuiltinError(ps, "Invalid FTP connection.", "ftp-connection//Close") } err := conn.Quit() if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Error closing FTP connection: %v", err.Error()), "ftp-connection//Close") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Error closing FTP connection: %v", err.Error()), "ftp-connection//Close") } return *env.NewInteger(1) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "ftp-connection//Close") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "ftp-connection//Close") } }, }, @@ -1730,7 +1731,7 @@ var Builtins_io = map[string]*env.Builtin{ filePath = path.Value default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.UriType, env.StringType}, "tail-file") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType, env.StringType}, "tail-file") } // Get follow option @@ -1741,7 +1742,7 @@ var Builtins_io = map[string]*env.Builtin{ follow = f.Value default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.BooleanType}, "tail-file") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BooleanType}, "tail-file") } } @@ -1753,7 +1754,7 @@ var Builtins_io = map[string]*env.Builtin{ reopen = r.Value default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.BooleanType}, "tail-file") + return evaldo.MakeArgError(ps, 3, []env.Type{env.BooleanType}, "tail-file") } } @@ -1767,7 +1768,7 @@ var Builtins_io = map[string]*env.Builtin{ t, err := tail.TailFile(filePath, config) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "tail-file") + return evaldo.MakeBuiltinError(ps, err.Error(), "tail-file") } return *env.NewNative(ps.Idx, t, "tail-file") @@ -1786,7 +1787,7 @@ var Builtins_io = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(t.GetKind()) != "tail-file" { ps.FailureFlag = true - return MakeBuiltinError(ps, "Expected tail-file object", "tail-file//Read-line") + return evaldo.MakeBuiltinError(ps, "Expected tail-file object", "tail-file//Read-line") } // Get the next line from the tail @@ -1799,7 +1800,7 @@ var Builtins_io = map[string]*env.Builtin{ return *env.NewString(line.Text) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tail-file//Read-line") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tail-file//Read-line") } }, }, @@ -1816,19 +1817,19 @@ var Builtins_io = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(t.GetKind()) != "tail-file" { ps.FailureFlag = true - return MakeBuiltinError(ps, "Expected tail-file object", "tail-file//Close") + return evaldo.MakeBuiltinError(ps, "Expected tail-file object", "tail-file//Close") } err := t.Value.(*tail.Tail).Stop() if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "tail-file//Close") + return evaldo.MakeBuiltinError(ps, err.Error(), "tail-file//Close") } return *env.NewString("") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tail-file//Close") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tail-file//Close") } }, }, @@ -1849,12 +1850,12 @@ var Builtins_io = map[string]*env.Builtin{ conn, err := net.Dial("unix", s.Path) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error connecting to Unix socket: "+err.Error(), "unix-uri//Open") + return evaldo.MakeBuiltinError(ps, "Error connecting to Unix socket: "+err.Error(), "unix-uri//Open") } return *env.NewNative(ps.Idx, conn, "unix-connection") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.UriType}, "unix-uri//Open") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "unix-uri//Open") } }, }, @@ -1872,23 +1873,23 @@ var Builtins_io = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(conn.GetKind()) != "unix-connection" { ps.FailureFlag = true - return MakeBuiltinError(ps, "Expected unix-connection object", "unix-connection//Write") + return evaldo.MakeBuiltinError(ps, "Expected unix-connection object", "unix-connection//Write") } switch data := arg1.(type) { case env.String: _, err := conn.Value.(net.Conn).Write([]byte(data.Value)) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error writing to Unix socket: "+err.Error(), "unix-connection//Write") + return evaldo.MakeBuiltinError(ps, "Error writing to Unix socket: "+err.Error(), "unix-connection//Write") } return arg0 // Return the connection for chaining default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "unix-connection//Write") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "unix-connection//Write") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "unix-connection//Write") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "unix-connection//Write") } }, }, @@ -1905,18 +1906,18 @@ var Builtins_io = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(conn.GetKind()) != "unix-connection" { ps.FailureFlag = true - return MakeBuiltinError(ps, "Expected unix-connection object", "unix-connection//Read") + return evaldo.MakeBuiltinError(ps, "Expected unix-connection object", "unix-connection//Read") } buf := make([]byte, 1024) n, err := conn.Value.(net.Conn).Read(buf) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error reading from Unix socket: "+err.Error(), "unix-connection//Read") + return evaldo.MakeBuiltinError(ps, "Error reading from Unix socket: "+err.Error(), "unix-connection//Read") } return *env.NewString(string(buf[:n])) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "unix-connection//Read") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "unix-connection//Read") } }, }, @@ -1933,17 +1934,17 @@ var Builtins_io = map[string]*env.Builtin{ case env.Native: if ps.Idx.GetWord(conn.GetKind()) != "unix-connection" { ps.FailureFlag = true - return MakeBuiltinError(ps, "Expected unix-connection object", "unix-connection//Close") + return evaldo.MakeBuiltinError(ps, "Expected unix-connection object", "unix-connection//Close") } err := conn.Value.(net.Conn).Close() if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "unix-connection//Close") + return evaldo.MakeBuiltinError(ps, err.Error(), "unix-connection//Close") } return *env.NewString("") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "unix-connection//Close") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "unix-connection//Close") } }, }, diff --git a/evaldo/builtins_io_not.go b/batteries/builtins_io_not.go similarity index 87% rename from evaldo/builtins_io_not.go rename to batteries/builtins_io_not.go index f87b14a6..31f276e7 100644 --- a/evaldo/builtins_io_not.go +++ b/batteries/builtins_io_not.go @@ -1,7 +1,7 @@ //go:build no_io // +build no_io -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_js_interop.go b/batteries/builtins_js_interop.go similarity index 89% rename from evaldo/builtins_js_interop.go rename to batteries/builtins_js_interop.go index efd131b1..f6a9f8e9 100644 --- a/evaldo/builtins_js_interop.go +++ b/batteries/builtins_js_interop.go @@ -1,7 +1,7 @@ //go:build wasm // +build wasm -package evaldo +package batteries import ( "regexp" @@ -11,6 +11,7 @@ import ( // "encoding/json" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" ) // ANSI escape code regex for stripping in browser console output @@ -40,7 +41,7 @@ var Builtins_js_interop = map[string]*env.Builtin{ case env.String: jsFunc := js.Global().Get(funcName.Value) if jsFunc.IsUndefined() { - return MakeBuiltinError(ps, "JavaScript function not found: "+funcName.Value, "js-call") + return evaldo.MakeBuiltinError(ps, "JavaScript function not found: "+funcName.Value, "js-call") } // Convert arguments block to JavaScript values @@ -63,7 +64,7 @@ var Builtins_js_interop = map[string]*env.Builtin{ // Convert result back to Rye return jsToRye(result, ps) default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "js-call") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "js-call") } }, }, @@ -82,7 +83,7 @@ var Builtins_js_interop = map[string]*env.Builtin{ case env.String: jsFunc := js.Global().Get("jsGet") if jsFunc.IsUndefined() { - return MakeBuiltinError(ps, "JavaScript function 'jsGet' not available", "js-get") + return evaldo.MakeBuiltinError(ps, "JavaScript function 'jsGet' not available", "js-get") } // Use the fixed async approach @@ -144,7 +145,7 @@ var Builtins_js_interop = map[string]*env.Builtin{ if result.Get("success").Bool() { return jsToRye(result.Get("data"), ps) } else { - return MakeBuiltinError(ps, "HTTP request failed: "+result.Get("error").String(), "js-get") + return evaldo.MakeBuiltinError(ps, "HTTP request failed: "+result.Get("error").String(), "js-get") } } @@ -155,9 +156,9 @@ var Builtins_js_interop = map[string]*env.Builtin{ } js.Global().Get("__ryeAsyncResults").Delete(resultId) - return MakeBuiltinError(ps, "HTTP request timed out", "js-get") + return evaldo.MakeBuiltinError(ps, "HTTP request timed out", "js-get") default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "js-get") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "js-get") } }, }, @@ -177,7 +178,7 @@ var Builtins_js_interop = map[string]*env.Builtin{ case env.String: jsFunc := js.Global().Get("jsPost") if jsFunc.IsUndefined() { - return MakeBuiltinError(ps, "JavaScript function 'jsPost' not available", "js-post") + return evaldo.MakeBuiltinError(ps, "JavaScript function 'jsPost' not available", "js-post") } // Convert data to JS value @@ -208,10 +209,10 @@ var Builtins_js_interop = map[string]*env.Builtin{ case result := <-done: return jsToRye(result, ps) case err := <-errChan: - return MakeBuiltinError(ps, "HTTP POST failed: "+err.String(), "js-post") + return evaldo.MakeBuiltinError(ps, "HTTP POST failed: "+err.String(), "js-post") } default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "js-post") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "js-post") } }, }, @@ -234,7 +235,7 @@ var Builtins_js_interop = map[string]*env.Builtin{ case env.String: jsFunc := js.Global().Get("jsAuthenticatedRequest") if jsFunc.IsUndefined() { - return MakeBuiltinError(ps, "JavaScript function 'jsAuthenticatedRequest' not available", "js-authenticated-request") + return evaldo.MakeBuiltinError(ps, "JavaScript function 'jsAuthenticatedRequest' not available", "js-authenticated-request") } // Convert data to JS value @@ -265,13 +266,13 @@ var Builtins_js_interop = map[string]*env.Builtin{ case result := <-done: return jsToRye(result, ps) case err := <-errChan: - return MakeBuiltinError(ps, "Authenticated request failed: "+err.String(), "js-authenticated-request") + return evaldo.MakeBuiltinError(ps, "Authenticated request failed: "+err.String(), "js-authenticated-request") } default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "js-authenticated-request") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "js-authenticated-request") } default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "js-authenticated-request") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "js-authenticated-request") } }, }, @@ -288,7 +289,7 @@ var Builtins_js_interop = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { jsFunc := js.Global().Get("jsToCsv") if jsFunc.IsUndefined() { - return MakeBuiltinError(ps, "JavaScript function 'jsToCsv' not available", "js-to-csv") + return evaldo.MakeBuiltinError(ps, "JavaScript function 'jsToCsv' not available", "js-to-csv") } // Convert data to JS value @@ -314,7 +315,7 @@ var Builtins_js_interop = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { jsFunc := js.Global().Get("jsToXml") if jsFunc.IsUndefined() { - return MakeBuiltinError(ps, "JavaScript function 'jsToXml' not available", "js-to-xml") + return evaldo.MakeBuiltinError(ps, "JavaScript function 'jsToXml' not available", "js-to-xml") } // Convert data to JS value @@ -345,7 +346,7 @@ var Builtins_js_interop = map[string]*env.Builtin{ case env.String: jsFunc := js.Global().Get("jsDownload") if jsFunc.IsUndefined() { - return MakeBuiltinError(ps, "JavaScript function 'jsDownload' not available", "js-download") + return evaldo.MakeBuiltinError(ps, "JavaScript function 'jsDownload' not available", "js-download") } // Call jsDownload function @@ -354,10 +355,10 @@ var Builtins_js_interop = map[string]*env.Builtin{ // Return confirmation message return *env.NewString(result.String()) default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "js-download") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "js-download") } default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "js-download") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "js-download") } }, }, @@ -449,7 +450,7 @@ var Builtins_js_interop = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { // Check if arg0 is nil (no arguments) if arg0 == nil { - return MakeBuiltinError(ps, "js-prompt expects 1 or 2 arguments", "js-prompt") + return evaldo.MakeBuiltinError(ps, "js-prompt expects 1 or 2 arguments", "js-prompt") } switch message := arg0.(type) { @@ -506,11 +507,11 @@ var Builtins_js_interop = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { funcName, ok := arg0.(env.String) if !ok { - return MakeArgError(ps, 1, []env.Type{env.StringType}, "js-call-callback") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "js-call-callback") } callback, ok := arg2.(env.Function) if !ok { - return MakeArgError(ps, 3, []env.Type{env.FunctionType}, "js-call-callback") + return evaldo.MakeArgError(ps, 3, []env.Type{env.FunctionType}, "js-call-callback") } // Build JS args @@ -575,7 +576,7 @@ var Builtins_js_interop = map[string]*env.Builtin{ if jsFunc.IsUndefined() { successCb.Release() errorCb.Release() - return MakeBuiltinError(ps, "JS function not found: "+funcName.Value, "js-call-callback") + return evaldo.MakeBuiltinError(ps, "JS function not found: "+funcName.Value, "js-call-callback") } handler.Invoke(jsFunc, jsArgs, successCb, errorCb) @@ -596,7 +597,7 @@ var Builtins_js_interop = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { jsFunc := js.Global().Get("ryeDisplayTable") if jsFunc.IsUndefined() { - return MakeBuiltinError(ps, "JavaScript function 'ryeDisplayTable' not available", "js-display-table") + return evaldo.MakeBuiltinError(ps, "JavaScript function 'ryeDisplayTable' not available", "js-display-table") } // Convert data to JS value @@ -637,7 +638,7 @@ var Builtins_js_interop = map[string]*env.Builtin{ runtime.Gosched() return ms default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "js-sleep") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "js-sleep") } }, }, diff --git a/batteries/builtins_js_interop_fixed.go b/batteries/builtins_js_interop_fixed.go new file mode 100644 index 00000000..30098aba --- /dev/null +++ b/batteries/builtins_js_interop_fixed.go @@ -0,0 +1,221 @@ +//go:build wasm +// +build wasm + +package batteries + +import ( + "syscall/js" + "time" + + "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" +) + +// FIXED: Non-blocking async call that uses timeout instead of channels +var FixedAsyncBuiltins = map[string]*env.Builtin{ + + // The CORRECT way to handle async in WASM + // This version doesn't block the browser thread + "js-call-async\\fixed": { + Argsn: 2, + Doc: "Calls a JavaScript function that returns a Promise (non-blocking).", + Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { + switch funcName := arg0.(type) { + case env.String: + jsFunc := js.Global().Get(funcName.Value) + if jsFunc.IsUndefined() { + return evaldo.MakeBuiltinError(ps, "JavaScript function not found: "+funcName.Value, "js-call-async\\fixed") + } + + // Convert arguments + var jsArgs []interface{} + switch args := arg1.(type) { + case env.Block: + series := args.Series.S + jsArgs = make([]interface{}, len(series)) + for i, arg := range series { + jsArgs[i] = ryeToJS(arg, ps) + } + default: + jsArgs = []interface{}{ryeToJS(arg1, ps)} + } + + // Use a global storage approach instead of channels + resultId := js.Global().Get("Date").New().Call("getTime").String() + + // Set up global result storage if it doesn't exist + if js.Global().Get("__ryeAsyncResults").IsUndefined() { + js.Global().Set("__ryeAsyncResults", js.Global().Get("Object").New()) + } + + // Create a wrapper that stores results globally + wrapperCode := ` + (function(funcName, args, resultId) { + const fn = window[funcName]; + if (!fn) { + window.__ryeAsyncResults[resultId] = { + ready: true, + success: false, + error: 'Function not found: ' + funcName + }; + return; + } + + try { + const result = fn.apply(null, args); + if (result && typeof result.then === 'function') { + // It's a Promise + result.then(data => { + window.__ryeAsyncResults[resultId] = { + ready: true, + success: true, + data: data + }; + }).catch(error => { + window.__ryeAsyncResults[resultId] = { + ready: true, + success: false, + error: error.toString() + }; + }); + } else { + // Synchronous result + window.__ryeAsyncResults[resultId] = { + ready: true, + success: true, + data: result + }; + } + } catch (error) { + window.__ryeAsyncResults[resultId] = { + ready: true, + success: false, + error: error.toString() + }; + } + }) + ` + + wrapper := js.Global().Get("eval").Invoke(wrapperCode) + wrapper.Invoke(funcName.Value, jsArgs, resultId) + + // Now, instead of using channels, we use a timeout-based polling approach + // This is not ideal, but it works in WASM without deadlocking + maxWait := 100 // Maximum polling iterations (adjust as needed) + + for i := 0; i < maxWait; i++ { + // Check if result is ready + result := js.Global().Get("__ryeAsyncResults").Get(resultId) + + if !result.IsUndefined() && result.Get("ready").Bool() { + // Clean up + js.Global().Get("__ryeAsyncResults").Delete(resultId) + + if result.Get("success").Bool() { + return jsToRye(result.Get("data"), ps) + } else { + return evaldo.MakeBuiltinError(ps, "JavaScript Promise rejected: "+result.Get("error").String(), "js-call-async\\fixed") + } + } + + // Small delay to prevent busy-waiting and allow JS to execute + // This is the key: we yield control back to the browser + time.Sleep(10 * time.Millisecond) + } + + // If we reach here, the operation timed out + js.Global().Get("__ryeAsyncResults").Delete(resultId) + return evaldo.MakeBuiltinError(ps, "Async operation timed out", "js-call-async\\fixed") + + default: + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "js-call-async\\fixed") + } + }, + }, + + // Alternative: Callback-based approach that doesn't block at all + "js-call-async\\callback": { + Argsn: 3, + Doc: "Calls a JavaScript function asynchronously and executes Rye callback with result.", + Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { + switch funcName := arg0.(type) { + case env.String: + // arg1 = arguments, arg2 = callback block + + // Convert arguments + var jsArgs []interface{} + switch args := arg1.(type) { + case env.Block: + series := args.Series.S + jsArgs = make([]interface{}, len(series)) + for i, arg := range series { + jsArgs[i] = ryeToJS(arg, ps) + } + default: + jsArgs = []interface{}{ryeToJS(arg1, ps)} + } + + // Get the callback block + // var callbackBlock env.Block + switch cb := arg2.(type) { + case env.Block: + // callbackBlock = cb + _ = cb // Store for future implementation + default: + return evaldo.MakeArgError(ps, 3, []env.Type{env.BlockType}, "js-call-async\\callback") + } + + // Create unique ID for this callback + callbackId := js.Global().Get("Date").New().Call("getTime").String() + + // Store callback in global registry + if js.Global().Get("__ryeCallbacks").IsUndefined() { + js.Global().Set("__ryeCallbacks", js.Global().Get("Object").New()) + } + + // The tricky part: we need to store the Rye callback somehow + // For now, we'll use a simpler approach and just return immediately + + // Create the JS wrapper + wrapperCode := ` + (function(funcName, args, callbackId) { + const fn = window[funcName]; + if (!fn) { + console.error('Function not found:', funcName); + return; + } + + try { + const result = fn.apply(null, args); + if (result && typeof result.then === 'function') { + result.then(data => { + console.log('Async result for', callbackId, ':', data); + // In a full implementation, this would trigger the Rye callback + window.postMessage({type: 'rye-async-result', callbackId: callbackId, success: true, data: data}, '*'); + }).catch(error => { + console.error('Async error for', callbackId, ':', error); + window.postMessage({type: 'rye-async-result', callbackId: callbackId, success: false, error: error.toString()}, '*'); + }); + } else { + console.log('Sync result for', callbackId, ':', result); + window.postMessage({type: 'rye-async-result', callbackId: callbackId, success: true, data: result}, '*'); + } + } catch (error) { + console.error('Call error for', callbackId, ':', error); + window.postMessage({type: 'rye-async-result', callbackId: callbackId, success: false, error: error.toString()}, '*'); + } + }) + ` + + wrapper := js.Global().Get("eval").Invoke(wrapperCode) + wrapper.Invoke(funcName.Value, jsArgs, callbackId) + + // Return the callback ID so the caller knows the operation is in progress + return *env.NewString("ASYNC_STARTED_" + callbackId) + + default: + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "js-call-async\\callback") + } + }, + }, +} \ No newline at end of file diff --git a/evaldo/builtins_js_interop_not.go b/batteries/builtins_js_interop_not.go similarity index 90% rename from evaldo/builtins_js_interop_not.go rename to batteries/builtins_js_interop_not.go index a50cf87b..b434d322 100644 --- a/evaldo/builtins_js_interop_not.go +++ b/batteries/builtins_js_interop_not.go @@ -1,7 +1,7 @@ //go:build !wasm // +build !sm -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_json.go b/batteries/builtins_json.go similarity index 96% rename from evaldo/builtins_json.go rename to batteries/builtins_json.go index 4aa7b35f..aa158615 100644 --- a/evaldo/builtins_json.go +++ b/batteries/builtins_json.go @@ -1,7 +1,7 @@ //go:build !no_json // +build !no_json -package evaldo +package batteries import ( "encoding/json" @@ -10,6 +10,7 @@ import ( "strings" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" ) func _emptyJSONDict() env.Dict { @@ -333,12 +334,12 @@ var Builtins_json = map[string]*env.Builtin{ var m any err := json.Unmarshal([]byte(input.Value), &m) if err != nil { - return MakeBuiltinError(ps, "Failed to Unmarshal.", "_parse_json") + return evaldo.MakeBuiltinError(ps, "Failed to Unmarshal.", "_parse_json") //panic(err) } return env.ToRyeValue(m) default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "_parse_json") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "_parse_json") } }, }, @@ -361,13 +362,13 @@ var Builtins_json = map[string]*env.Builtin{ var m any err := decoder.Decode(&m) if err != nil { - return MakeBuiltinError(ps, "Failed to Unmarshal.", "_parse_json\\lines") + return evaldo.MakeBuiltinError(ps, "Failed to Unmarshal.", "_parse_json\\lines") } vals = append(vals, env.ToRyeValue(m)) } return *env.NewList(vals) default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "_parse_json\\lines") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "_parse_json\\lines") } }, }, diff --git a/evaldo/builtins_json_not.go b/batteries/builtins_json_not.go similarity index 98% rename from evaldo/builtins_json_not.go rename to batteries/builtins_json_not.go index 73906c5a..54574ebe 100644 --- a/evaldo/builtins_json_not.go +++ b/batteries/builtins_json_not.go @@ -1,7 +1,7 @@ //go:build no_json // +build no_json -package evaldo +package batteries import ( "fmt" diff --git a/evaldo/builtins_mail.go b/batteries/builtins_mail.go similarity index 88% rename from evaldo/builtins_mail.go rename to batteries/builtins_mail.go index 220ec429..aba2d62b 100644 --- a/evaldo/builtins_mail.go +++ b/batteries/builtins_mail.go @@ -1,12 +1,13 @@ //go:build !no_mail // +build !no_mail -package evaldo +package batteries import ( "io" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/thomasberger/parsemail" ) @@ -30,11 +31,11 @@ var Builtins_mail = map[string]*env.Builtin{ case env.Native: email, err := parsemail.Parse(reader.Value.(io.Reader)) if err != nil { - return MakeBuiltinError(ps, err.Error(), "reader//parse-email") + return evaldo.MakeBuiltinError(ps, err.Error(), "reader//parse-email") } return *env.NewNative(ps.Idx, email, "parsed-email") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "reader//parse-email") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "reader//parse-email") } }, }, @@ -53,7 +54,7 @@ var Builtins_mail = map[string]*env.Builtin{ case env.Native: return *env.NewString(email.Value.(parsemail.Email).Subject) default: - return *MakeArgError(ps, 1, []env.Type{env.NativeType}, "parsed-email//Subject?") + return *evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "parsed-email//Subject?") } }, }, @@ -67,7 +68,7 @@ var Builtins_mail = map[string]*env.Builtin{ case env.Native: return env.String{email.Value.(parsemail.Email).From} default: - return makeError(ps, "Arg 1 not Native") + return evaldo.MakeError(ps, "Arg 1 not Native") } }, }, @@ -109,7 +110,7 @@ var Builtins_mail = map[string]*env.Builtin{ case env.Native: return *env.NewString(email.Value.(parsemail.Email).MessageID) default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "parsed-email//message-id?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "parsed-email//message-id?") } }, }, @@ -128,7 +129,7 @@ var Builtins_mail = map[string]*env.Builtin{ case env.Native: return *env.NewString(email.Value.(parsemail.Email).HTMLBody) default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "parsed-email//html-body?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "parsed-email//html-body?") } }, }, @@ -147,7 +148,7 @@ var Builtins_mail = map[string]*env.Builtin{ case env.Native: return *env.NewString(email.Value.(parsemail.Email).TextBody) default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "parsed-email//text-body?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "parsed-email//text-body?") } }, }, diff --git a/evaldo/builtins_mail_not.go b/batteries/builtins_mail_not.go similarity index 87% rename from evaldo/builtins_mail_not.go rename to batteries/builtins_mail_not.go index 96ff75e2..0c6c2c77 100644 --- a/evaldo/builtins_mail_not.go +++ b/batteries/builtins_mail_not.go @@ -1,7 +1,7 @@ //go:build no_mail // +build no_mail -package evaldo +package batteries import "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_markdown.go b/batteries/builtins_markdown.go similarity index 91% rename from evaldo/builtins_markdown.go rename to batteries/builtins_markdown.go index a6fbe876..d11fa353 100644 --- a/evaldo/builtins_markdown.go +++ b/batteries/builtins_markdown.go @@ -1,7 +1,7 @@ //go:build !no_markdown // +build !no_markdown -package evaldo +package batteries import ( "bytes" @@ -12,6 +12,7 @@ import ( "strings" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/refaktor/rye/term" "github.com/yuin/goldmark" "github.com/yuin/goldmark/ast" @@ -37,10 +38,10 @@ func load_markdown_Dict(ps *env.ProgramState, block env.Block) (env.Dict, *env.E block.Series.Next() rmap.Data[key] = nextObj } else { - return EmptyRM(), MakeBuiltinError(ps, "Expected block after markdown section specifier.", "reader//do-markdown") + return EmptyRM(), evaldo.MakeBuiltinError(ps, "Expected block after markdown section specifier.", "reader//do-markdown") } default: - return EmptyRM(), MakeBuiltinError(ps, "Expected word specifying markdown section.", "reader//do-markdown") + return EmptyRM(), evaldo.MakeBuiltinError(ps, "Expected word specifying markdown section.", "reader//do-markdown") } } return rmap, nil @@ -50,18 +51,18 @@ func load_markdown_Dict(ps *env.ProgramState, block env.Block) (env.Dict, *env.E func do_markdown(ps *env.ProgramState, reader env.Object, rmap env.Dict) env.Object { file, ok := reader.(env.Native) if !ok { - return MakeBuiltinError(ps, "Reader must be a file object.", "reader//do-markdown") + return evaldo.MakeBuiltinError(ps, "Reader must be a file object.", "reader//do-markdown") } fileObj, ok := file.Value.(io.Reader) if !ok { - return MakeBuiltinError(ps, "Reader must be a reader object.", "reader//do-markdown") + return evaldo.MakeBuiltinError(ps, "Reader must be a reader object.", "reader//do-markdown") } // Read all content from the reader content, err := ioutil.ReadAll(fileObj) if err != nil { - return MakeBuiltinError(ps, err.Error(), "reader//do-markdown") + return evaldo.MakeBuiltinError(ps, err.Error(), "reader//do-markdown") } // Create a markdown parser with extensions @@ -97,7 +98,7 @@ func processNode(ps *env.ProgramState, n ast.Node, source []byte, rmap env.Dict) // If there's a document handler, call it at the start if block, ok := rmap.Data["document"].(env.Block); ok { ps.Ser = block.Series - EvalBlockInj(ps, *env.NewString("start"), true) + evaldo.EvalBlockInj(ps, *env.NewString("start"), true) } case *ast.Heading: @@ -108,7 +109,7 @@ func processNode(ps *env.ProgramState, n ast.Node, source []byte, rmap env.Dict) if block, ok := rmap.Data[headingKey].(env.Block); ok { text := string(node.Text(source)) ps.Ser = block.Series - EvalBlockInj(ps, *env.NewString(text), true) + evaldo.EvalBlockInj(ps, *env.NewString(text), true) } case *ast.Paragraph: @@ -125,7 +126,7 @@ func processNode(ps *env.ProgramState, n ast.Node, source []byte, rmap env.Dict) } } ps.Ser = block.Series - EvalBlockInj(ps, *env.NewString(buf.String()), true) + evaldo.EvalBlockInj(ps, *env.NewString(buf.String()), true) } case *ast.List: @@ -154,8 +155,8 @@ func processNode(ps *env.ProgramState, n ast.Node, source []byte, rmap env.Dict) } ps.Ser = block.Series - EvalBlockInj(ps, *env.NewString(strings.Join(items, "\n")), true) - EvalBlockInj(ps, *env.NewString(listType), true) + evaldo.EvalBlockInj(ps, *env.NewString(strings.Join(items, "\n")), true) + evaldo.EvalBlockInj(ps, *env.NewString(listType), true) } case *ast.ListItem: @@ -173,7 +174,7 @@ func processNode(ps *env.ProgramState, n ast.Node, source []byte, rmap env.Dict) } ps.Ser = block.Series - EvalBlockInj(ps, *env.NewString(itemText.String()), true) + evaldo.EvalBlockInj(ps, *env.NewString(itemText.String()), true) } case *ast.CodeBlock, *ast.FencedCodeBlock: @@ -200,9 +201,9 @@ func processNode(ps *env.ProgramState, n ast.Node, source []byte, rmap env.Dict) if block, ok := rmap.Data["code"].(env.Block); ok { ps.Ser = block.Series - EvalBlockInj(ps, *env.NewString(content), true) + evaldo.EvalBlockInj(ps, *env.NewString(content), true) if lang != "" { - EvalBlockInj(ps, *env.NewString(lang), true) + evaldo.EvalBlockInj(ps, *env.NewString(lang), true) } } @@ -222,7 +223,7 @@ func processNode(ps *env.ProgramState, n ast.Node, source []byte, rmap env.Dict) } ps.Ser = block.Series - EvalBlockInj(ps, *env.NewString(strings.TrimSpace(buf.String())), true) + evaldo.EvalBlockInj(ps, *env.NewString(strings.TrimSpace(buf.String())), true) } case *ast.Link: @@ -238,8 +239,8 @@ func processNode(ps *env.ProgramState, n ast.Node, source []byte, rmap env.Dict) } ps.Ser = block.Series - EvalBlockInj(ps, *env.NewString(text), true) - EvalBlockInj(ps, *env.NewString(destination), true) + evaldo.EvalBlockInj(ps, *env.NewString(text), true) + evaldo.EvalBlockInj(ps, *env.NewString(destination), true) } case *ast.Image: @@ -255,8 +256,8 @@ func processNode(ps *env.ProgramState, n ast.Node, source []byte, rmap env.Dict) } ps.Ser = block.Series - EvalBlockInj(ps, *env.NewString(alt), true) - EvalBlockInj(ps, *env.NewString(destination), true) + evaldo.EvalBlockInj(ps, *env.NewString(alt), true) + evaldo.EvalBlockInj(ps, *env.NewString(destination), true) } // Tables are handled by the extension package, not directly in ast @@ -270,10 +271,10 @@ func processNode(ps *env.ProgramState, n ast.Node, source []byte, rmap env.Dict) if tableText.Len() > 0 { ps.Ser = block.Series - EvalBlockInj(ps, *env.NewString(tableText.String()), true) + evaldo.EvalBlockInj(ps, *env.NewString(tableText.String()), true) // Since we can't get the row count directly, we'll estimate based on newlines rowCount := strings.Count(tableText.String(), "\n") + 1 - EvalBlockInj(ps, *env.NewInteger(int64(rowCount)), true) + evaldo.EvalBlockInj(ps, *env.NewInteger(int64(rowCount)), true) } } @@ -281,7 +282,7 @@ func processNode(ps *env.ProgramState, n ast.Node, source []byte, rmap env.Dict) // Process horizontal rules if block, ok := rmap.Data["hr"].(env.Block); ok { ps.Ser = block.Series - EvalBlockInj(ps, env.Void{}, true) + evaldo.EvalBlockInj(ps, env.Void{}, true) } case *ast.Text: @@ -289,7 +290,7 @@ func processNode(ps *env.ProgramState, n ast.Node, source []byte, rmap env.Dict) // This is mainly for inline text that's not part of a larger structure if block, ok := rmap.Data["text"].(env.Block); ok { ps.Ser = block.Series - EvalBlockInj(ps, *env.NewString(string(node.Text(source))), true) + evaldo.EvalBlockInj(ps, *env.NewString(string(node.Text(source))), true) } case *ast.Emphasis: @@ -304,7 +305,7 @@ func processNode(ps *env.ProgramState, n ast.Node, source []byte, rmap env.Dict) } ps.Ser = block.Series - EvalBlockInj(ps, *env.NewString(text), true) + evaldo.EvalBlockInj(ps, *env.NewString(text), true) } // Handle emphasis nodes (bold, italic, etc.) @@ -321,7 +322,7 @@ func processNode(ps *env.ProgramState, n ast.Node, source []byte, rmap env.Dict) extractText(n, source, &textBuf) ps.Ser = block.Series - EvalBlockInj(ps, *env.NewString(textBuf.String()), true) + evaldo.EvalBlockInj(ps, *env.NewString(textBuf.String()), true) } } @@ -349,7 +350,7 @@ func processNode(ps *env.ProgramState, n ast.Node, source []byte, rmap env.Dict) if isTask { ps.Ser = block.Series - EvalBlockInj(ps, *env.NewBoolean(isChecked), true) + evaldo.EvalBlockInj(ps, *env.NewBoolean(isChecked), true) } } } @@ -363,7 +364,7 @@ func processNode(ps *env.ProgramState, n ast.Node, source []byte, rmap env.Dict) if _, ok := n.(*ast.Document); ok { if block, ok := rmap.Data["document"].(env.Block); ok { ps.Ser = block.Series - EvalBlockInj(ps, *env.NewString("end"), true) + evaldo.EvalBlockInj(ps, *env.NewString("end"), true) } } } @@ -961,12 +962,12 @@ var Builtins_markdown = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { text, ok := arg0.(env.String) if !ok { - return MakeArgError(ps, 1, []env.Type{env.StringType}, "markdown->html") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "markdown->html") } html, err := markdown_to_html(ps, text.Value) if err != nil { - return MakeBuiltinError(ps, err.Error(), "markdown->html") + return evaldo.MakeBuiltinError(ps, err.Error(), "markdown->html") } return *env.NewString(html) @@ -984,7 +985,7 @@ var Builtins_markdown = map[string]*env.Builtin{ case env.Markdown: return text default: - return MakeArgError(ps, 1, []env.Type{env.StringType, env.MarkdownType}, "markdown") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType, env.MarkdownType}, "markdown") } }, }, @@ -996,7 +997,7 @@ var Builtins_markdown = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { md, ok := arg0.(env.Markdown) if !ok { - return MakeArgError(ps, 1, []env.Type{env.MarkdownType}, "markdown//text") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MarkdownType}, "markdown//text") } return *env.NewString(md.Value) }, @@ -1009,7 +1010,7 @@ var Builtins_markdown = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { md, ok := arg0.(env.Markdown) if !ok { - return MakeArgError(ps, 1, []env.Type{env.MarkdownType}, "markdown//length") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MarkdownType}, "markdown//length") } return *env.NewInteger(int64(len(md.Value))) }, @@ -1022,12 +1023,12 @@ var Builtins_markdown = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { md, ok := arg0.(env.Markdown) if !ok { - return MakeArgError(ps, 1, []env.Type{env.MarkdownType}, "markdown//to-html") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MarkdownType}, "markdown//to-html") } html, err := markdown_to_html(ps, md.Value) if err != nil { - return MakeBuiltinError(ps, err.Error(), "markdown//to-html") + return evaldo.MakeBuiltinError(ps, err.Error(), "markdown//to-html") } return *env.NewString(html) @@ -1041,7 +1042,7 @@ var Builtins_markdown = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { md, ok := arg0.(env.Markdown) if !ok { - return MakeArgError(ps, 1, []env.Type{env.MarkdownType}, "markdown//headings") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MarkdownType}, "markdown//headings") } headings := extractHeadings(md.Value) @@ -1060,7 +1061,7 @@ var Builtins_markdown = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { md, ok := arg0.(env.Markdown) if !ok { - return MakeArgError(ps, 1, []env.Type{env.MarkdownType}, "markdown//paragraphs") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MarkdownType}, "markdown//paragraphs") } paragraphs := extractParagraphs(md.Value) @@ -1079,7 +1080,7 @@ var Builtins_markdown = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { md, ok := arg0.(env.Markdown) if !ok { - return MakeArgError(ps, 1, []env.Type{env.MarkdownType}, "markdown//links") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MarkdownType}, "markdown//links") } links := extractLinks(md.Value) diff --git a/evaldo/builtins_match.go b/batteries/builtins_match.go similarity index 90% rename from evaldo/builtins_match.go rename to batteries/builtins_match.go index 82e1c796..96f44bb3 100644 --- a/evaldo/builtins_match.go +++ b/batteries/builtins_match.go @@ -1,7 +1,8 @@ -package evaldo +package batteries import ( "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" ) type matchMode struct { @@ -20,13 +21,13 @@ func matchValue(ps *env.ProgramState, value env.Object, pattern env.Object, mmod if patternIsBlock { if !valueIsBlock { ps.FailureFlag = true - return MakeBuiltinError(ps, "Pattern is a block but value is not", "match"), mmode + return evaldo.MakeBuiltinError(ps, "Pattern is a block but value is not", "match"), mmode } // Both are blocks - check if they have the same length // if valueBlock.Series.Len() != patternBlock.Series.Len() { // ps.FailureFlag = true - // return MakeBuiltinError(ps, "Block and pattern have different lengths", "match"), mmode + // return evaldo.MakeBuiltinError(ps, "Block and pattern have different lengths", "match"), mmode // } j := 0 @@ -54,7 +55,7 @@ func matchValue(ps *env.ProgramState, value env.Object, pattern env.Object, mmod if j == valueBlock.Series.Len() || mmode.tailMode == 1 { return *env.NewBoolean(true), mmode } else { - return makeError(ps, "Pattern too short for data"), mmode + return evaldo.MakeError(ps, "Pattern too short for data"), mmode } } @@ -70,11 +71,11 @@ func matchValue(ps *env.ProgramState, value env.Object, pattern env.Object, mmod contextValue, found := ps.Ctx.Get(word.Index) if !found { ps.FailureFlag = true - return MakeBuiltinError(ps, "Word not found in context: "+ps.Idx.GetWord(word.Index), "match"), mmode + return evaldo.MakeBuiltinError(ps, "Word not found in context: "+ps.Idx.GetWord(word.Index), "match"), mmode } if !contextValue.Equal(value) { ps.FailureFlag = true - return MakeBuiltinError(ps, "Value doesn't match context value", "match"), mmode + return evaldo.MakeBuiltinError(ps, "Value doesn't match context value", "match"), mmode } case env.LModword: // Get the value from the context and check if it equals the value @@ -86,7 +87,7 @@ func matchValue(ps *env.ProgramState, value env.Object, pattern env.Object, mmod // Check if the value matches the expected type if int(value.Type()) != word.Index { ps.FailureFlag = true - return MakeBuiltinError(ps, "Expected type "+ps.Idx.GetWord(word.Index), "match"), mmode + return evaldo.MakeBuiltinError(ps, "Expected type "+ps.Idx.GetWord(word.Index), "match"), mmode } case env.Block: // If the pattern is a block with mode 1 (square brackets), evaluate it with the value injected @@ -96,7 +97,7 @@ func matchValue(ps *env.ProgramState, value env.Object, pattern env.Object, mmod // Set series to the block ps.Ser = word.Series // Evaluate the block with the value injected - EvalBlockInj(ps, value, true) + evaldo.EvalBlockInj(ps, value, true) if ps.ErrorFlag { ps.Ser = ser return ps.Res, mmode @@ -107,13 +108,13 @@ func matchValue(ps *env.ProgramState, value env.Object, pattern env.Object, mmod // Pattern is a normal block, but we're matching against a single value // This should fail ps.FailureFlag = true - return MakeBuiltinError(ps, "Pattern is a block but value is not", "match"), mmode + return evaldo.MakeBuiltinError(ps, "Pattern is a block but value is not", "match"), mmode } default: // If the pattern is not a word or block, check if it equals the value if !pattern.Equal(value) { ps.FailureFlag = true - return MakeBuiltinError(ps, "Pattern doesn't match value", "match"), mmode + return evaldo.MakeBuiltinError(ps, "Pattern doesn't match value", "match"), mmode } } @@ -205,7 +206,7 @@ var Builtins_match = map[string]*env.Builtin{ case env.Block: return matchBlock(ps, valueBlock, pattern) default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "match-block") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "match-block") } }, }, @@ -278,7 +279,7 @@ var Builtins_match = map[string]*env.Builtin{ case env.Block: // Iterate through pairs in the patterns block if patternsBlock.Series.Len()%2 != 0 { - return MakeBuiltinError(ps, "Patterns block must contain an even number of elements (pairs)", "match") + return evaldo.MakeBuiltinError(ps, "Patterns block must contain an even number of elements (pairs)", "match") } for i := 0; i < patternsBlock.Series.Len(); i += 2 { @@ -288,7 +289,7 @@ var Builtins_match = map[string]*env.Builtin{ // Action must be a block actionBlock, actionOk := action.(env.Block) if !actionOk { - return MakeBuiltinError(ps, "Action must be a block", "match") + return evaldo.MakeBuiltinError(ps, "Action must be a block", "match") } // Save the current failure flag state @@ -307,7 +308,7 @@ var Builtins_match = map[string]*env.Builtin{ // Evaluate the action block ser := ps.Ser ps.Ser = actionBlock.Series - EvalBlockInj(ps, value, true) + evaldo.EvalBlockInj(ps, value, true) ps.Ser = ser return ps.Res } @@ -319,9 +320,9 @@ var Builtins_match = map[string]*env.Builtin{ // No pattern matched, return failure ps.FailureFlag = true - return MakeBuiltinError(ps, "No pattern matched the value", "match") + return evaldo.MakeBuiltinError(ps, "No pattern matched the value", "match") default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "match") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "match") } }, }, diff --git a/evaldo/builtins_math.go b/batteries/builtins_math.go similarity index 84% rename from evaldo/builtins_math.go rename to batteries/builtins_math.go index 335476e9..e615ff62 100644 --- a/evaldo/builtins_math.go +++ b/batteries/builtins_math.go @@ -1,4 +1,7 @@ -package evaldo +//go:build !no_vector +// +build !no_vector + +package batteries import ( "fmt" @@ -8,6 +11,7 @@ import ( "github.com/drewlanenga/govector" "github.com/fxtlabs/primes" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/refaktor/rye/util" ) @@ -84,7 +88,7 @@ func DialectMath(env1 *env.ProgramState, arg0 env.Object) env.Object { env1.Ser = ser1 return *env.NewBlock(*env.NewTSeries(val)) default: - return MakeArgError(env1, 1, []env.Type{env.BlockType}, "DialectMath") + return evaldo.MakeArgError(env1, 1, []env.Type{env.BlockType}, "DialectMath") } } @@ -129,7 +133,7 @@ var Builtins_math = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { fa, fb, errPos := assureFloats(arg0, arg1) if errPos > 0 { - return MakeArgError(ps, errPos, []env.Type{env.IntegerType, env.BlockType}, "mod") + return evaldo.MakeArgError(ps, errPos, []env.Type{env.IntegerType, env.BlockType}, "mod") } return *env.NewDecimal(math.Mod(fa, fb)) }, @@ -158,7 +162,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewComplex(cmplx.Pow(base.Value, complex(exp.Value, 0))) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType}, "pow") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType}, "pow") } case env.Integer: switch exp := arg1.(type) { @@ -169,7 +173,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Pow(float64(base.Value), exp.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType}, "pow") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType}, "pow") } case env.Decimal: switch exp := arg1.(type) { @@ -180,10 +184,10 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Pow(base.Value, exp.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType}, "pow") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType}, "pow") } default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType}, "pow") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType}, "pow") } }, }, @@ -204,7 +208,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Log2(val.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.BlockType}, "log2") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.BlockType}, "log2") } }, }, @@ -224,7 +228,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Log10(val.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "log10") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "log10") } }, }, @@ -249,19 +253,19 @@ var Builtins_math = map[string]*env.Builtin{ case env.Integer: if val.Value <= 0 { ps.FailureFlag = true - return MakeBuiltinError(ps, "Can't compute logarithm of zero or negative number.", "log") + return evaldo.MakeBuiltinError(ps, "Can't compute logarithm of zero or negative number.", "log") } return *env.NewDecimal(math.Log(float64(val.Value))) case env.Decimal: if val.Value <= 0 { ps.FailureFlag = true - return MakeBuiltinError(ps, "Can't compute logarithm of zero or negative number.", "log") + return evaldo.MakeBuiltinError(ps, "Can't compute logarithm of zero or negative number.", "log") } return *env.NewDecimal(math.Log(val.Value)) case env.Complex: if val.Value == complex(0, 0) { ps.FailureFlag = true - return MakeBuiltinError(ps, "Can't compute logarithm of zero.", "log") + return evaldo.MakeBuiltinError(ps, "Can't compute logarithm of zero.", "log") } return *env.NewComplex(cmplx.Log(val.Value)) case env.Vector: @@ -277,7 +281,7 @@ var Builtins_math = map[string]*env.Builtin{ } return *env.NewMatrixWithData(val.Rows, val.Cols, data) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType, env.VectorType, env.MatrixType}, "log") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType, env.VectorType, env.MatrixType}, "log") } }, }, @@ -297,7 +301,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Log1p(val.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "log1p") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "log1p") } }, }, @@ -317,7 +321,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Logb(val.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "logb") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "logb") } }, }, @@ -338,7 +342,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Pow(val.Value, 2.0)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.BlockType}, "sq") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.BlockType}, "sq") } }, }, @@ -363,7 +367,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Complex: return *env.NewComplex(cmplx.Sin(val.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType}, "sin") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType}, "sin") } }, }, @@ -387,7 +391,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Complex: return *env.NewComplex(cmplx.Cos(val.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType}, "cos") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType}, "cos") } }, }, @@ -411,7 +415,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Complex: return *env.NewComplex(cmplx.Tan(val.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType}, "tan") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType}, "tan") } }, }, @@ -449,7 +453,7 @@ var Builtins_math = map[string]*env.Builtin{ } return *env.NewMatrixWithData(val.Rows, val.Cols, data) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType, env.VectorType, env.MatrixType}, "sqrt") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType, env.VectorType, env.MatrixType}, "sqrt") } }, }, @@ -487,7 +491,7 @@ var Builtins_math = map[string]*env.Builtin{ } return *env.NewMatrixWithData(val.Rows, val.Cols, data) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType, env.VectorType, env.MatrixType}, "abs") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType, env.VectorType, env.MatrixType}, "abs") } }, }, @@ -504,16 +508,16 @@ var Builtins_math = map[string]*env.Builtin{ switch val := arg0.(type) { case env.Integer: if val.Value < -1.0 || val.Value > 1.0 { - return MakeBuiltinError(ps, "Invalid input: Acos is only defined for -1 <= x <= 1.", "acos") + return evaldo.MakeBuiltinError(ps, "Invalid input: Acos is only defined for -1 <= x <= 1.", "acos") } return *env.NewDecimal(math.Acos(float64(val.Value))) case env.Decimal: if val.Value < -1.0 || val.Value > 1.0 { - return MakeBuiltinError(ps, "Invalid input: Acos is only defined for -1 <= x <= 1.", "acos") + return evaldo.MakeBuiltinError(ps, "Invalid input: Acos is only defined for -1 <= x <= 1.", "acos") } return *env.NewDecimal(math.Acos(val.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "acos") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "acos") } }, }, @@ -530,16 +534,16 @@ var Builtins_math = map[string]*env.Builtin{ switch val := arg0.(type) { case env.Integer: if val.Value < 1.0 { - return MakeBuiltinError(ps, " Acosh is only defined for x >= 1.", "acosh") + return evaldo.MakeBuiltinError(ps, " Acosh is only defined for x >= 1.", "acosh") } return *env.NewDecimal(math.Log(float64(val.Value) + math.Sqrt(float64(val.Value)*float64(val.Value)-1))) case env.Decimal: if val.Value < 1.0 { - return MakeBuiltinError(ps, " Acosh is only defined for x >= 1.", "acosh") + return evaldo.MakeBuiltinError(ps, " Acosh is only defined for x >= 1.", "acosh") } return *env.NewDecimal(math.Log(val.Value + math.Sqrt(val.Value*val.Value-1))) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "acosh") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "acosh") } }, }, @@ -556,16 +560,16 @@ var Builtins_math = map[string]*env.Builtin{ switch val := arg0.(type) { case env.Integer: if val.Value < -1.0 || val.Value > 1.0 { - return MakeBuiltinError(ps, "Invalid input: Asin is only defined for -1 <= x <= 1.", "asin") + return evaldo.MakeBuiltinError(ps, "Invalid input: Asin is only defined for -1 <= x <= 1.", "asin") } return *env.NewDecimal(math.Asin(float64(val.Value))) case env.Decimal: if val.Value < -1.0 || val.Value > 1.0 { - return MakeBuiltinError(ps, "Invalid input: Asin is only defined for -1 <= x <= 1.", "asin") + return evaldo.MakeBuiltinError(ps, "Invalid input: Asin is only defined for -1 <= x <= 1.", "asin") } return *env.NewDecimal(math.Asin(val.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "asin") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "asin") } }, }, @@ -585,7 +589,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Log(val.Value + math.Sqrt(val.Value*val.Value+1))) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "asinh") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "asinh") } }, }, @@ -605,7 +609,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Atan(val.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "atan") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "atan") } }, }, @@ -628,7 +632,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Atan2(float64(val.Value), val2.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "atan2") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "atan2") } case env.Decimal: switch val2 := arg1.(type) { @@ -637,10 +641,10 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Atan2(val.Value, val2.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "atan2") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "atan2") } default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "atan2") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "atan2") } }, }, @@ -660,7 +664,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Atanh(val.Value)) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "atanh") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "atanh") } }, }, @@ -680,7 +684,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Ceil(val.Value)) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "ceil") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "ceil") } }, }, @@ -700,7 +704,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Cbrt(val.Value)) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "cbrt") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "cbrt") } }, }, @@ -723,7 +727,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Copysign(float64(val.Value), val2.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "copysign") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "copysign") } case env.Decimal: switch val2 := arg1.(type) { @@ -732,10 +736,10 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Copysign(val.Value, val2.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "copysign") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "copysign") } default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "copysign") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "copysign") } }, }, @@ -759,7 +763,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(util.GetDimValue(float64(val.Value), val2.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "dim") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "dim") } case env.Decimal: switch val2 := arg1.(type) { @@ -768,10 +772,10 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(util.GetDimValue(val.Value, val2.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "dim") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "dim") } default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "dim") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "dim") } }, }, @@ -794,10 +798,10 @@ var Builtins_math = map[string]*env.Builtin{ ratio := math.Pow(10, float64(precision.Value)) return *env.NewDecimal(math.Round(val.Value*ratio) / ratio) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "round\\to") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "round\\to") } default: - return MakeArgError(ps, 1, []env.Type{env.DecimalType}, "round\\to") + return evaldo.MakeArgError(ps, 1, []env.Type{env.DecimalType}, "round\\to") } }, }, @@ -816,7 +820,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Round(val.Value)) default: - return MakeArgError(ps, 1, []env.Type{env.DecimalType}, "round\\to") + return evaldo.MakeArgError(ps, 1, []env.Type{env.DecimalType}, "round\\to") } }, }, @@ -837,7 +841,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Integer: return *env.NewDecimal(math.RoundToEven(float64(val.Value))) default: - return MakeArgError(ps, 1, []env.Type{env.DecimalType, env.IntegerType}, "roundtoeven") + return evaldo.MakeArgError(ps, 1, []env.Type{env.DecimalType, env.IntegerType}, "roundtoeven") } }, }, @@ -857,7 +861,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Erf(val.Value)) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "erf") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "erf") } }, }, @@ -877,7 +881,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Erfc(val.Value)) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "erfc") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "erfc") } }, }, @@ -897,7 +901,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Erfcinv(val.Value)) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "erfcinv") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "erfcinv") } }, }, @@ -917,7 +921,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Erfinv(val.Value)) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "erfinv") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "erfinv") } }, }, @@ -956,7 +960,7 @@ var Builtins_math = map[string]*env.Builtin{ } return *env.NewMatrixWithData(val.Rows, val.Cols, data) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType, env.VectorType, env.MatrixType}, "exp") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType, env.ComplexType, env.VectorType, env.MatrixType}, "exp") } }, }, @@ -976,7 +980,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Exp2(val.Value)) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "exp2") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "exp2") } }, }, @@ -996,7 +1000,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Expm1(val.Value)) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "expm1") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "expm1") } }, }, @@ -1022,7 +1026,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.FMA(float64(val1.Value), float64(val2.Value), val3.Value)) default: - return MakeArgError(ps, 3, []env.Type{env.IntegerType, env.DecimalType}, "fma") + return evaldo.MakeArgError(ps, 3, []env.Type{env.IntegerType, env.DecimalType}, "fma") } case env.Decimal: switch val3 := arg2.(type) { @@ -1031,10 +1035,10 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.FMA(float64(val1.Value), val2.Value, val3.Value)) default: - return MakeArgError(ps, 3, []env.Type{env.IntegerType, env.DecimalType}, "fma") + return evaldo.MakeArgError(ps, 3, []env.Type{env.IntegerType, env.DecimalType}, "fma") } default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "fma") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "fma") } case env.Decimal: switch val2 := arg1.(type) { @@ -1045,7 +1049,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.FMA(val1.Value, float64(val2.Value), val3.Value)) default: - return MakeArgError(ps, 3, []env.Type{env.IntegerType, env.DecimalType}, "fma") + return evaldo.MakeArgError(ps, 3, []env.Type{env.IntegerType, env.DecimalType}, "fma") } case env.Decimal: switch val3 := arg2.(type) { @@ -1054,13 +1058,13 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.FMA(val1.Value, val2.Value, val3.Value)) default: - return MakeArgError(ps, 3, []env.Type{env.IntegerType, env.DecimalType}, "fma") + return evaldo.MakeArgError(ps, 3, []env.Type{env.IntegerType, env.DecimalType}, "fma") } default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "fma") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "fma") } default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "fma") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "fma") } }, }, @@ -1080,7 +1084,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.J0(val.Value)) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "j0") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "j0") } }, }, @@ -1100,7 +1104,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.J1(val.Value)) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "j1") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "j1") } }, }, @@ -1120,7 +1124,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Y0(val.Value)) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "y0") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "y0") } }, }, @@ -1140,7 +1144,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Y1(val.Value)) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "y1") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "y1") } }, }, @@ -1163,7 +1167,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Yn(int(v1.Value), v2.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "yn") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "yn") } case env.Decimal: switch v2 := arg1.(type) { @@ -1172,10 +1176,10 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Yn(int(v1.Value), v2.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "yn") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "yn") } default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "yn") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "yn") } }, }, @@ -1198,7 +1202,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Jn(int(v1.Value), v2.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "jn") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "jn") } case env.Decimal: switch v2 := arg1.(type) { @@ -1207,10 +1211,10 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Jn(int(v1.Value), v2.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "jn") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "jn") } default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "jn") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "jn") } }, }, @@ -1230,7 +1234,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Decimal: return *env.NewDecimal(math.Trunc(val.Value)) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "trunc") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "trunc") } }, }, @@ -1264,7 +1268,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Integer: fa = float64(a.Value) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "deg->rad") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "deg->rad") } return *env.NewDecimal(fa * float64(math.Pi) / 180.0) }, @@ -1283,7 +1287,7 @@ var Builtins_math = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { fa, fb, errPos := assureFloats(arg0, arg1) if errPos > 0 { - return MakeArgError(ps, errPos, []env.Type{env.IntegerType, env.BlockType}, "is-near") + return evaldo.MakeArgError(ps, errPos, []env.Type{env.IntegerType, env.BlockType}, "is-near") } const epsilon = 0.0000000000001 // math.SmallestNonzeroFloat64 if math.Abs(fa-fb) <= (epsilon) { @@ -1311,7 +1315,7 @@ var Builtins_math = map[string]*env.Builtin{ case env.Integer: fa = float64(a.Value) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.BlockType}, "near-zero") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.BlockType}, "near-zero") } // const epsilon = math.SmallestNonzeroFloat64 const epsilon = 0.0000000000001 // math.SmallestNonzeroFloat64 @@ -1344,7 +1348,7 @@ var Builtins_math = map[string]*env.Builtin{ return *env.NewBoolean(false) } default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "is-prime") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "is-prime") } }, }, @@ -1435,10 +1439,10 @@ var Builtins_math = map[string]*env.Builtin{ return *env.NewInteger(a) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "gcd") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "gcd") } default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "gcd") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "gcd") } }, }, @@ -1477,7 +1481,7 @@ var Builtins_math = map[string]*env.Builtin{ f1 = v1.Value isDecimal1 = true default: - return MakeBuiltinError(ps, fmt.Sprintf("Element at position %d in first block must be integer or decimal", i), "outer-product") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Element at position %d in first block must be integer or decimal", i), "outer-product") } // Create row for this element @@ -1497,7 +1501,7 @@ var Builtins_math = map[string]*env.Builtin{ f2 = v2.Value isDecimal2 = true default: - return MakeBuiltinError(ps, fmt.Sprintf("Element at position %d in second block must be integer or decimal", j), "outer-product") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Element at position %d in second block must be integer or decimal", j), "outer-product") } // Compute product @@ -1516,10 +1520,10 @@ var Builtins_math = map[string]*env.Builtin{ return *env.NewBlock(*env.NewTSeries(result)) default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "outer-product") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "outer-product") } default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "outer-product") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "outer-product") } }, }, diff --git a/batteries/builtins_math_not.go b/batteries/builtins_math_not.go new file mode 100644 index 00000000..c8b9f8bd --- /dev/null +++ b/batteries/builtins_math_not.go @@ -0,0 +1,18 @@ +//go:build no_vector +// +build no_vector + +package batteries + +import ( + "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" +) + +// Builtins_math is empty when the no_vector build tag is active. +// This removes the govector and primes dependencies. +var Builtins_math = map[string]*env.Builtin{} + +// DialectMath is a no-op stub used by repl.go when no_vector is active. +func DialectMath(ps *env.ProgramState, arg0 env.Object) env.Object { + return evaldo.MakeBuiltinError(ps, "math dialect unavailable (built with no_vector)", "DialectMath") +} diff --git a/evaldo/builtins_matrix.go b/batteries/builtins_matrix.go similarity index 78% rename from evaldo/builtins_matrix.go rename to batteries/builtins_matrix.go index 81ba6668..ab2867ae 100644 --- a/evaldo/builtins_matrix.go +++ b/batteries/builtins_matrix.go @@ -1,4 +1,7 @@ -package evaldo +//go:build !no_vector +// +build !no_vector + +package batteries import ( "fmt" @@ -7,6 +10,7 @@ import ( "github.com/drewlanenga/govector" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" ) var Builtins_matrix = map[string]*env.Builtin{ @@ -32,14 +36,14 @@ var Builtins_matrix = map[string]*env.Builtin{ switch cols := arg1.(type) { case env.Integer: if rows.Value <= 0 || cols.Value <= 0 { - return MakeBuiltinError(ps, "Matrix dimensions must be positive", "matrix") + return evaldo.MakeBuiltinError(ps, "Matrix dimensions must be positive", "matrix") } return *env.NewMatrix(int(rows.Value), int(cols.Value)) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "matrix") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "matrix") } default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "matrix") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "matrix") } }, }, @@ -58,14 +62,14 @@ var Builtins_matrix = map[string]*env.Builtin{ switch shape := arg0.(type) { case env.Block: if shape.Series.Len() != 2 { - return MakeBuiltinError(ps, "Shape must be { rows cols }", "matrix") + return evaldo.MakeBuiltinError(ps, "Shape must be { rows cols }", "matrix") } rowsObj := shape.Series.Get(0) colsObj := shape.Series.Get(1) rowsInt, ok1 := rowsObj.(env.Integer) colsInt, ok2 := colsObj.(env.Integer) if !ok1 || !ok2 { - return MakeBuiltinError(ps, "Shape must contain integers", "matrix") + return evaldo.MakeBuiltinError(ps, "Shape must contain integers", "matrix") } rows := int(rowsInt.Value) cols := int(colsInt.Value) @@ -73,7 +77,7 @@ var Builtins_matrix = map[string]*env.Builtin{ switch data := arg1.(type) { case env.Block: if data.Series.Len() != rows*cols { - return MakeBuiltinError(ps, "Data length must match rows*cols", "matrix") + return evaldo.MakeBuiltinError(ps, "Data length must match rows*cols", "matrix") } floats := make([]float64, rows*cols) for i := 0; i < data.Series.Len(); i++ { @@ -83,15 +87,15 @@ var Builtins_matrix = map[string]*env.Builtin{ case env.Integer: floats[i] = float64(v.Value) default: - return MakeBuiltinError(ps, "Data must contain numbers", "matrix") + return evaldo.MakeBuiltinError(ps, "Data must contain numbers", "matrix") } } return *env.NewMatrixWithData(rows, cols, floats) default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "matrix") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "matrix") } default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "matrix") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "matrix") } }, }, @@ -113,7 +117,7 @@ var Builtins_matrix = map[string]*env.Builtin{ switch cols := arg1.(type) { case env.Integer: if rows.Value <= 0 || cols.Value <= 0 { - return MakeBuiltinError(ps, "Matrix dimensions must be positive", "matrix\\randn") + return evaldo.MakeBuiltinError(ps, "Matrix dimensions must be positive", "matrix\\randn") } r := int(rows.Value) c := int(cols.Value) @@ -123,10 +127,10 @@ var Builtins_matrix = map[string]*env.Builtin{ } return *env.NewMatrixWithData(r, c, data) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "matrix\\randn") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "matrix\\randn") } default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "matrix\\randn") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "matrix\\randn") } }, }, @@ -148,7 +152,7 @@ var Builtins_matrix = map[string]*env.Builtin{ switch cols := arg1.(type) { case env.Integer: if rows.Value <= 0 || cols.Value <= 0 { - return MakeBuiltinError(ps, "Matrix dimensions must be positive", "matrix\\ones") + return evaldo.MakeBuiltinError(ps, "Matrix dimensions must be positive", "matrix\\ones") } r := int(rows.Value) c := int(cols.Value) @@ -158,10 +162,10 @@ var Builtins_matrix = map[string]*env.Builtin{ } return *env.NewMatrixWithData(r, c, data) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "matrix\\ones") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "matrix\\ones") } default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "matrix\\ones") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "matrix\\ones") } }, }, @@ -181,7 +185,7 @@ var Builtins_matrix = map[string]*env.Builtin{ switch n := arg0.(type) { case env.Integer: if n.Value <= 0 { - return MakeBuiltinError(ps, "Matrix size must be positive", "matrix\\eye") + return evaldo.MakeBuiltinError(ps, "Matrix size must be positive", "matrix\\eye") } size := int(n.Value) data := make([]float64, size*size) @@ -190,7 +194,7 @@ var Builtins_matrix = map[string]*env.Builtin{ } return *env.NewMatrixWithData(size, size, data) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "matrix\\eye") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "matrix\\eye") } }, }, @@ -216,7 +220,7 @@ var Builtins_matrix = map[string]*env.Builtin{ *env.NewInteger(int64(m.Cols)), })) default: - return MakeArgError(ps, 1, []env.Type{env.MatrixType}, "shape?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MatrixType}, "shape?") } }, }, @@ -235,7 +239,7 @@ var Builtins_matrix = map[string]*env.Builtin{ case env.Matrix: return *env.NewInteger(int64(m.Rows)) default: - return MakeArgError(ps, 1, []env.Type{env.MatrixType}, "rows?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MatrixType}, "rows?") } }, }, @@ -254,7 +258,7 @@ var Builtins_matrix = map[string]*env.Builtin{ case env.Matrix: return *env.NewInteger(int64(m.Cols)) default: - return MakeArgError(ps, 1, []env.Type{env.MatrixType}, "cols?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MatrixType}, "cols?") } }, }, @@ -281,17 +285,17 @@ var Builtins_matrix = map[string]*env.Builtin{ r := int(row.Value) c := int(col.Value) if r < 0 || r >= m.Rows || c < 0 || c >= m.Cols { - return MakeBuiltinError(ps, fmt.Sprintf("Matrix indices out of bounds: row %d, col %d (matrix is %dx%d)", r, c, m.Rows, m.Cols), "mat-get") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Matrix indices out of bounds: row %d, col %d (matrix is %dx%d)", r, c, m.Rows, m.Cols), "mat-get") } return *env.NewDecimal(m.Get(r, c)) default: - return MakeArgError(ps, 3, []env.Type{env.IntegerType}, "mat-get") + return evaldo.MakeArgError(ps, 3, []env.Type{env.IntegerType}, "mat-get") } default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "mat-get") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "mat-get") } default: - return MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-get") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-get") } }, }, @@ -318,7 +322,7 @@ var Builtins_matrix = map[string]*env.Builtin{ r := int(row.Value) c := int(col.Value) if r < 0 || r >= m.Rows || c < 0 || c >= m.Cols { - return MakeBuiltinError(ps, fmt.Sprintf("Matrix indices out of bounds: row %d, col %d (matrix is %dx%d)", r, c, m.Rows, m.Cols), "mat-set!") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Matrix indices out of bounds: row %d, col %d (matrix is %dx%d)", r, c, m.Rows, m.Cols), "mat-set!") } var val float64 switch v := arg3.(type) { @@ -327,18 +331,18 @@ var Builtins_matrix = map[string]*env.Builtin{ case env.Integer: val = float64(v.Value) default: - return MakeArgError(ps, 4, []env.Type{env.DecimalType, env.IntegerType}, "mat-set!") + return evaldo.MakeArgError(ps, 4, []env.Type{env.DecimalType, env.IntegerType}, "mat-set!") } m.Set(r, c, val) return m default: - return MakeArgError(ps, 3, []env.Type{env.IntegerType}, "mat-set!") + return evaldo.MakeArgError(ps, 3, []env.Type{env.IntegerType}, "mat-set!") } default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "mat-set!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "mat-set!") } default: - return MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-set!") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-set!") } }, }, @@ -360,7 +364,7 @@ var Builtins_matrix = map[string]*env.Builtin{ case env.Integer: r := int(row.Value) if r < 0 || r >= m.Rows { - return MakeBuiltinError(ps, fmt.Sprintf("Row index %d out of bounds (matrix has %d rows)", r, m.Rows), "mat-row") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Row index %d out of bounds (matrix has %d rows)", r, m.Rows), "mat-row") } data := make(govector.Vector, m.Cols) for j := 0; j < m.Cols; j++ { @@ -368,10 +372,10 @@ var Builtins_matrix = map[string]*env.Builtin{ } return *env.NewVector(data) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "mat-row") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "mat-row") } default: - return MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-row") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-row") } }, }, @@ -393,7 +397,7 @@ var Builtins_matrix = map[string]*env.Builtin{ case env.Integer: c := int(col.Value) if c < 0 || c >= m.Cols { - return MakeBuiltinError(ps, fmt.Sprintf("Column index %d out of bounds (matrix has %d columns)", c, m.Cols), "mat-col") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Column index %d out of bounds (matrix has %d columns)", c, m.Cols), "mat-col") } data := make(govector.Vector, m.Rows) for i := 0; i < m.Rows; i++ { @@ -401,10 +405,10 @@ var Builtins_matrix = map[string]*env.Builtin{ } return *env.NewVector(data) default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "mat-col") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "mat-col") } default: - return MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-col") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-col") } }, }, @@ -435,7 +439,7 @@ var Builtins_matrix = map[string]*env.Builtin{ } return *env.NewMatrixWithData(m.Cols, m.Rows, data) default: - return MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-transpose") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-transpose") } }, }, @@ -457,7 +461,7 @@ var Builtins_matrix = map[string]*env.Builtin{ switch B := arg1.(type) { case env.Matrix: if A.Cols != B.Rows { - return MakeBuiltinError(ps, "Matrix dimensions incompatible for multiplication", "mat-mul") + return evaldo.MakeBuiltinError(ps, "Matrix dimensions incompatible for multiplication", "mat-mul") } m, n, p := A.Rows, A.Cols, B.Cols data := make([]float64, m*p) @@ -474,7 +478,7 @@ var Builtins_matrix = map[string]*env.Builtin{ case env.Vector: // Matrix × Vector = Vector if A.Cols != len(B.Value) { - return MakeBuiltinError(ps, "Matrix columns must match vector length", "mat-mul") + return evaldo.MakeBuiltinError(ps, "Matrix columns must match vector length", "mat-mul") } result := make(govector.Vector, A.Rows) for i := 0; i < A.Rows; i++ { @@ -486,10 +490,10 @@ var Builtins_matrix = map[string]*env.Builtin{ } return *env.NewVector(result) default: - return MakeArgError(ps, 2, []env.Type{env.MatrixType, env.VectorType}, "mat-mul") + return evaldo.MakeArgError(ps, 2, []env.Type{env.MatrixType, env.VectorType}, "mat-mul") } default: - return MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-mul") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-mul") } }, }, @@ -511,7 +515,7 @@ var Builtins_matrix = map[string]*env.Builtin{ switch B := arg1.(type) { case env.Matrix: if A.Rows != B.Rows || A.Cols != B.Cols { - return MakeBuiltinError(ps, "Matrix dimensions must match", "mat-hadamard") + return evaldo.MakeBuiltinError(ps, "Matrix dimensions must match", "mat-hadamard") } data := make([]float64, len(A.Data)) for i := range A.Data { @@ -519,10 +523,10 @@ var Builtins_matrix = map[string]*env.Builtin{ } return *env.NewMatrixWithData(A.Rows, A.Cols, data) default: - return MakeArgError(ps, 2, []env.Type{env.MatrixType}, "mat-hadamard") + return evaldo.MakeArgError(ps, 2, []env.Type{env.MatrixType}, "mat-hadamard") } default: - return MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-hadamard") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-hadamard") } }, }, @@ -544,7 +548,7 @@ var Builtins_matrix = map[string]*env.Builtin{ switch B := arg1.(type) { case env.Matrix: if A.Rows != B.Rows || A.Cols != B.Cols { - return MakeBuiltinError(ps, "Matrix dimensions must match", "mat-add") + return evaldo.MakeBuiltinError(ps, "Matrix dimensions must match", "mat-add") } data := make([]float64, len(A.Data)) for i := range A.Data { @@ -552,10 +556,10 @@ var Builtins_matrix = map[string]*env.Builtin{ } return *env.NewMatrixWithData(A.Rows, A.Cols, data) default: - return MakeArgError(ps, 2, []env.Type{env.MatrixType}, "mat-add") + return evaldo.MakeArgError(ps, 2, []env.Type{env.MatrixType}, "mat-add") } default: - return MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-add") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-add") } }, }, @@ -577,7 +581,7 @@ var Builtins_matrix = map[string]*env.Builtin{ switch B := arg1.(type) { case env.Matrix: if A.Rows != B.Rows || A.Cols != B.Cols { - return MakeBuiltinError(ps, "Matrix dimensions must match", "mat-sub") + return evaldo.MakeBuiltinError(ps, "Matrix dimensions must match", "mat-sub") } data := make([]float64, len(A.Data)) for i := range A.Data { @@ -585,10 +589,10 @@ var Builtins_matrix = map[string]*env.Builtin{ } return *env.NewMatrixWithData(A.Rows, A.Cols, data) default: - return MakeArgError(ps, 2, []env.Type{env.MatrixType}, "mat-sub") + return evaldo.MakeArgError(ps, 2, []env.Type{env.MatrixType}, "mat-sub") } default: - return MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-sub") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-sub") } }, }, @@ -613,7 +617,7 @@ var Builtins_matrix = map[string]*env.Builtin{ case env.Integer: scalar = float64(s.Value) default: - return MakeArgError(ps, 2, []env.Type{env.DecimalType, env.IntegerType}, "mat-scale") + return evaldo.MakeArgError(ps, 2, []env.Type{env.DecimalType, env.IntegerType}, "mat-scale") } data := make([]float64, len(m.Data)) for i := range m.Data { @@ -621,7 +625,7 @@ var Builtins_matrix = map[string]*env.Builtin{ } return *env.NewMatrixWithData(m.Rows, m.Cols, data) default: - return MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-scale") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-scale") } }, }, @@ -652,7 +656,7 @@ var Builtins_matrix = map[string]*env.Builtin{ } return *env.NewVector(result) default: - return MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-sum-rows") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-sum-rows") } }, }, @@ -679,7 +683,7 @@ var Builtins_matrix = map[string]*env.Builtin{ } return *env.NewVector(result) default: - return MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-sum-cols") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-sum-cols") } }, }, @@ -708,7 +712,7 @@ var Builtins_matrix = map[string]*env.Builtin{ } return *env.NewVector(result) default: - return MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-max-rows") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-max-rows") } }, }, @@ -737,7 +741,7 @@ var Builtins_matrix = map[string]*env.Builtin{ } return *env.NewVector(result) default: - return MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-max-cols") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-max-cols") } }, }, @@ -768,7 +772,7 @@ var Builtins_matrix = map[string]*env.Builtin{ } return *env.NewBlock(*env.NewTSeries(rows)) default: - return MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-to-block") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-to-block") } }, }, @@ -786,12 +790,12 @@ var Builtins_matrix = map[string]*env.Builtin{ switch blk := arg0.(type) { case env.Block: if blk.Series.Len() == 0 { - return MakeBuiltinError(ps, "Block is empty", "block-to-mat") + return evaldo.MakeBuiltinError(ps, "Block is empty", "block-to-mat") } // Get first row to determine columns firstRow, ok := blk.Series.Get(0).(env.Block) if !ok { - return MakeBuiltinError(ps, "Block must contain blocks (rows)", "block-to-mat") + return evaldo.MakeBuiltinError(ps, "Block must contain blocks (rows)", "block-to-mat") } rows := blk.Series.Len() cols := firstRow.Series.Len() @@ -800,10 +804,10 @@ var Builtins_matrix = map[string]*env.Builtin{ for i := 0; i < rows; i++ { row, ok := blk.Series.Get(i).(env.Block) if !ok { - return MakeBuiltinError(ps, "Block must contain blocks (rows)", "block-to-mat") + return evaldo.MakeBuiltinError(ps, "Block must contain blocks (rows)", "block-to-mat") } if row.Series.Len() != cols { - return MakeBuiltinError(ps, "All rows must have the same length", "block-to-mat") + return evaldo.MakeBuiltinError(ps, "All rows must have the same length", "block-to-mat") } for j := 0; j < cols; j++ { switch v := row.Series.Get(j).(type) { @@ -812,13 +816,13 @@ var Builtins_matrix = map[string]*env.Builtin{ case env.Integer: data[i*cols+j] = float64(v.Value) default: - return MakeBuiltinError(ps, "Rows must contain numbers", "block-to-mat") + return evaldo.MakeBuiltinError(ps, "Rows must contain numbers", "block-to-mat") } } } return *env.NewMatrixWithData(rows, cols, data) default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "block-to-mat") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "block-to-mat") } }, }, @@ -848,12 +852,12 @@ var Builtins_matrix = map[string]*env.Builtin{ } else if word == "col" { return *env.NewMatrixWithData(n, 1, data) } - return MakeBuiltinError(ps, "Orientation must be 'row or 'col", "vector-to-mat") + return evaldo.MakeBuiltinError(ps, "Orientation must be 'row or 'col", "vector-to-mat") default: - return MakeArgError(ps, 2, []env.Type{env.WordType}, "vector-to-mat") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType}, "vector-to-mat") } default: - return MakeArgError(ps, 1, []env.Type{env.VectorType}, "vector-to-mat") + return evaldo.MakeArgError(ps, 1, []env.Type{env.VectorType}, "vector-to-mat") } }, }, @@ -875,27 +879,27 @@ var Builtins_matrix = map[string]*env.Builtin{ switch rowRange := arg1.(type) { case env.Block: if rowRange.Series.Len() != 2 { - return MakeBuiltinError(ps, "Row range must be { start end }", "mat-slice") + return evaldo.MakeBuiltinError(ps, "Row range must be { start end }", "mat-slice") } switch colRange := arg2.(type) { case env.Block: if colRange.Series.Len() != 2 { - return MakeBuiltinError(ps, "Column range must be { start end }", "mat-slice") + return evaldo.MakeBuiltinError(ps, "Column range must be { start end }", "mat-slice") } r0, ok1 := rowRange.Series.Get(0).(env.Integer) r1, ok2 := rowRange.Series.Get(1).(env.Integer) c0, ok3 := colRange.Series.Get(0).(env.Integer) c1, ok4 := colRange.Series.Get(1).(env.Integer) if !ok1 || !ok2 || !ok3 || !ok4 { - return MakeBuiltinError(ps, "Ranges must contain integers", "mat-slice") + return evaldo.MakeBuiltinError(ps, "Ranges must contain integers", "mat-slice") } rowStart, rowEnd := int(r0.Value), int(r1.Value) colStart, colEnd := int(c0.Value), int(c1.Value) if rowStart < 0 || rowEnd >= m.Rows || rowStart > rowEnd { - return MakeBuiltinError(ps, "Invalid row range", "mat-slice") + return evaldo.MakeBuiltinError(ps, "Invalid row range", "mat-slice") } if colStart < 0 || colEnd >= m.Cols || colStart > colEnd { - return MakeBuiltinError(ps, "Invalid column range", "mat-slice") + return evaldo.MakeBuiltinError(ps, "Invalid column range", "mat-slice") } newRows := rowEnd - rowStart + 1 newCols := colEnd - colStart + 1 @@ -907,13 +911,13 @@ var Builtins_matrix = map[string]*env.Builtin{ } return *env.NewMatrixWithData(newRows, newCols, data) default: - return MakeArgError(ps, 3, []env.Type{env.BlockType}, "mat-slice") + return evaldo.MakeArgError(ps, 3, []env.Type{env.BlockType}, "mat-slice") } default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "mat-slice") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "mat-slice") } default: - return MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-slice") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-slice") } }, }, @@ -953,7 +957,7 @@ var Builtins_matrix = map[string]*env.Builtin{ } return *env.NewMatrixWithData(m.Rows, m.Cols, data) default: - return MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-softmax") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-softmax") } }, }, @@ -976,12 +980,12 @@ var Builtins_matrix = map[string]*env.Builtin{ case env.Integer: c := int(col.Value) if c < 0 || c >= m.Cols { - return MakeBuiltinError(ps, fmt.Sprintf("Column index %d out of bounds (matrix has %d columns)", c, m.Cols), "mat-set-col!") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Column index %d out of bounds (matrix has %d columns)", c, m.Cols), "mat-set-col!") } switch vals := arg2.(type) { case env.Vector: if len(vals.Value) != m.Rows { - return MakeBuiltinError(ps, "Vector length must match matrix rows", "mat-set-col!") + return evaldo.MakeBuiltinError(ps, "Vector length must match matrix rows", "mat-set-col!") } for i := 0; i < m.Rows; i++ { m.Set(i, c, vals.Value[i]) @@ -989,7 +993,7 @@ var Builtins_matrix = map[string]*env.Builtin{ return m case env.Block: if vals.Series.Len() != m.Rows { - return MakeBuiltinError(ps, "Block length must match matrix rows", "mat-set-col!") + return evaldo.MakeBuiltinError(ps, "Block length must match matrix rows", "mat-set-col!") } for i := 0; i < m.Rows; i++ { switch v := vals.Series.Get(i).(type) { @@ -998,18 +1002,18 @@ var Builtins_matrix = map[string]*env.Builtin{ case env.Integer: m.Set(i, c, float64(v.Value)) default: - return MakeBuiltinError(ps, "Block must contain numbers", "mat-set-col!") + return evaldo.MakeBuiltinError(ps, "Block must contain numbers", "mat-set-col!") } } return m default: - return MakeArgError(ps, 3, []env.Type{env.VectorType, env.BlockType}, "mat-set-col!") + return evaldo.MakeArgError(ps, 3, []env.Type{env.VectorType, env.BlockType}, "mat-set-col!") } default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "mat-set-col!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "mat-set-col!") } default: - return MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-set-col!") + return evaldo.MakeArgError(ps, 1, []env.Type{env.MatrixType}, "mat-set-col!") } }, }, @@ -1030,7 +1034,7 @@ var Builtins_matrix = map[string]*env.Builtin{ switch v2 := arg1.(type) { case env.Vector: if len(v1.Value) != len(v2.Value) { - return MakeBuiltinError(ps, "Vectors must have same length", "vec-add") + return evaldo.MakeBuiltinError(ps, "Vectors must have same length", "vec-add") } data := make(govector.Vector, len(v1.Value)) for i := range v1.Value { @@ -1038,10 +1042,10 @@ var Builtins_matrix = map[string]*env.Builtin{ } return *env.NewVector(data) default: - return MakeArgError(ps, 2, []env.Type{env.VectorType}, "vec-add") + return evaldo.MakeArgError(ps, 2, []env.Type{env.VectorType}, "vec-add") } default: - return MakeArgError(ps, 1, []env.Type{env.VectorType}, "vec-add") + return evaldo.MakeArgError(ps, 1, []env.Type{env.VectorType}, "vec-add") } }, }, @@ -1062,7 +1066,7 @@ var Builtins_matrix = map[string]*env.Builtin{ switch v2 := arg1.(type) { case env.Vector: if len(v1.Value) != len(v2.Value) { - return MakeBuiltinError(ps, "Vectors must have same length", "vec-sub") + return evaldo.MakeBuiltinError(ps, "Vectors must have same length", "vec-sub") } data := make(govector.Vector, len(v1.Value)) for i := range v1.Value { @@ -1070,10 +1074,10 @@ var Builtins_matrix = map[string]*env.Builtin{ } return *env.NewVector(data) default: - return MakeArgError(ps, 2, []env.Type{env.VectorType}, "vec-sub") + return evaldo.MakeArgError(ps, 2, []env.Type{env.VectorType}, "vec-sub") } default: - return MakeArgError(ps, 1, []env.Type{env.VectorType}, "vec-sub") + return evaldo.MakeArgError(ps, 1, []env.Type{env.VectorType}, "vec-sub") } }, }, @@ -1096,7 +1100,7 @@ var Builtins_matrix = map[string]*env.Builtin{ } return *env.NewBlock(*env.NewTSeries(items)) default: - return MakeArgError(ps, 1, []env.Type{env.VectorType}, "vec-to-block") + return evaldo.MakeArgError(ps, 1, []env.Type{env.VectorType}, "vec-to-block") } }, }, diff --git a/batteries/builtins_matrix_not.go b/batteries/builtins_matrix_not.go new file mode 100644 index 00000000..8718d08f --- /dev/null +++ b/batteries/builtins_matrix_not.go @@ -0,0 +1,10 @@ +//go:build no_vector +// +build no_vector + +package batteries + +import "github.com/refaktor/rye/env" + +// Builtins_matrix is empty when the no_vector build tag is active. +// This removes the govector dependency. +var Builtins_matrix = map[string]*env.Builtin{} diff --git a/evaldo/builtins_mcp.go b/batteries/builtins_mcp.go similarity index 74% rename from evaldo/builtins_mcp.go rename to batteries/builtins_mcp.go index c8846f1d..8ba4b04d 100644 --- a/evaldo/builtins_mcp.go +++ b/batteries/builtins_mcp.go @@ -1,12 +1,13 @@ //go:build !no_mcp // +build !no_mcp -package evaldo +package batteries import ( "sync" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" ) // Global variables to store MCP servers and clients @@ -40,11 +41,11 @@ var Builtins_mcp = map[string]*env.Builtin{ return *env.NewNative(ps.Idx, serverInfo, "Rye-mcp-server") default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "mcp-server//create") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "mcp-server//create") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "mcp-server//create") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "mcp-server//create") } }, }, @@ -74,15 +75,15 @@ var Builtins_mcp = map[string]*env.Builtin{ return *env.NewNative(ps.Idx, resourceInfo, "Rye-mcp-resource") default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.StringType}, "mcp-resource//create") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "mcp-resource//create") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "mcp-resource//create") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "mcp-resource//create") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "mcp-resource//create") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "mcp-resource//create") } }, }, @@ -108,11 +109,11 @@ var Builtins_mcp = map[string]*env.Builtin{ return *env.NewNative(ps.Idx, toolInfo, "Rye-mcp-tool") default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "mcp-tool//create") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "mcp-tool//create") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "mcp-tool//create") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "mcp-tool//create") } }, }, @@ -138,11 +139,11 @@ var Builtins_mcp = map[string]*env.Builtin{ return *env.NewNative(ps.Idx, promptInfo, "Rye-mcp-prompt") default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "mcp-prompt//create") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "mcp-prompt//create") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "mcp-prompt//create") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "mcp-prompt//create") } }, }, @@ -164,7 +165,7 @@ var Builtins_mcp = map[string]*env.Builtin{ case env.Native: if srv.Type() != env.NativeType { ps.FailureFlag = true - return MakeBuiltinError(ps, "Expected native type", "Rye-mcp-server//get-name") + return evaldo.MakeBuiltinError(ps, "Expected native type", "Rye-mcp-server//get-name") } serverInfo, ok := srv.Value.(struct { @@ -173,13 +174,13 @@ var Builtins_mcp = map[string]*env.Builtin{ }) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "Failed to cast to server info", "Rye-mcp-server//get-name") + return evaldo.MakeBuiltinError(ps, "Failed to cast to server info", "Rye-mcp-server//get-name") } return env.String{Value: serverInfo.Name} default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mcp-server//get-name") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mcp-server//get-name") } }, }, @@ -192,7 +193,7 @@ var Builtins_mcp = map[string]*env.Builtin{ case env.Native: if srv.Type() != env.NativeType { ps.FailureFlag = true - return MakeBuiltinError(ps, "Expected native type", "Rye-mcp-server//get-version") + return evaldo.MakeBuiltinError(ps, "Expected native type", "Rye-mcp-server//get-version") } serverInfo, ok := srv.Value.(struct { @@ -201,13 +202,13 @@ var Builtins_mcp = map[string]*env.Builtin{ }) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "Failed to cast to server info", "Rye-mcp-server//get-version") + return evaldo.MakeBuiltinError(ps, "Failed to cast to server info", "Rye-mcp-server//get-version") } return env.String{Value: serverInfo.Version} default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mcp-server//get-version") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mcp-server//get-version") } }, }, @@ -221,7 +222,7 @@ var Builtins_mcp = map[string]*env.Builtin{ case env.Native: if res.Type() != env.NativeType { ps.FailureFlag = true - return MakeBuiltinError(ps, "Expected native type", "Rye-mcp-resource//get-uri") + return evaldo.MakeBuiltinError(ps, "Expected native type", "Rye-mcp-resource//get-uri") } resourceInfo, ok := res.Value.(struct { @@ -231,13 +232,13 @@ var Builtins_mcp = map[string]*env.Builtin{ }) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "Failed to cast to resource info", "Rye-mcp-resource//get-uri") + return evaldo.MakeBuiltinError(ps, "Failed to cast to resource info", "Rye-mcp-resource//get-uri") } return env.String{Value: resourceInfo.URI} default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mcp-resource//get-uri") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mcp-resource//get-uri") } }, }, @@ -250,7 +251,7 @@ var Builtins_mcp = map[string]*env.Builtin{ case env.Native: if res.Type() != env.NativeType { ps.FailureFlag = true - return MakeBuiltinError(ps, "Expected native type", "Rye-mcp-resource//get-name") + return evaldo.MakeBuiltinError(ps, "Expected native type", "Rye-mcp-resource//get-name") } resourceInfo, ok := res.Value.(struct { @@ -260,13 +261,13 @@ var Builtins_mcp = map[string]*env.Builtin{ }) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "Failed to cast to resource info", "Rye-mcp-resource//get-name") + return evaldo.MakeBuiltinError(ps, "Failed to cast to resource info", "Rye-mcp-resource//get-name") } return env.String{Value: resourceInfo.Name} default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mcp-resource//get-name") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mcp-resource//get-name") } }, }, @@ -279,7 +280,7 @@ var Builtins_mcp = map[string]*env.Builtin{ case env.Native: if res.Type() != env.NativeType { ps.FailureFlag = true - return MakeBuiltinError(ps, "Expected native type", "Rye-mcp-resource//get-mime-type") + return evaldo.MakeBuiltinError(ps, "Expected native type", "Rye-mcp-resource//get-mime-type") } resourceInfo, ok := res.Value.(struct { @@ -289,13 +290,13 @@ var Builtins_mcp = map[string]*env.Builtin{ }) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "Failed to cast to resource info", "Rye-mcp-resource//get-mime-type") + return evaldo.MakeBuiltinError(ps, "Failed to cast to resource info", "Rye-mcp-resource//get-mime-type") } return env.String{Value: resourceInfo.MIMEType} default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mcp-resource//get-mime-type") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mcp-resource//get-mime-type") } }, }, @@ -309,7 +310,7 @@ var Builtins_mcp = map[string]*env.Builtin{ case env.Native: if tool.Type() != env.NativeType { ps.FailureFlag = true - return MakeBuiltinError(ps, "Expected native type", "Rye-mcp-tool//get-name") + return evaldo.MakeBuiltinError(ps, "Expected native type", "Rye-mcp-tool//get-name") } toolInfo, ok := tool.Value.(struct { @@ -318,13 +319,13 @@ var Builtins_mcp = map[string]*env.Builtin{ }) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "Failed to cast to tool info", "Rye-mcp-tool//get-name") + return evaldo.MakeBuiltinError(ps, "Failed to cast to tool info", "Rye-mcp-tool//get-name") } return env.String{Value: toolInfo.Name} default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mcp-tool//get-name") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mcp-tool//get-name") } }, }, @@ -337,7 +338,7 @@ var Builtins_mcp = map[string]*env.Builtin{ case env.Native: if tool.Type() != env.NativeType { ps.FailureFlag = true - return MakeBuiltinError(ps, "Expected native type", "Rye-mcp-tool//get-description") + return evaldo.MakeBuiltinError(ps, "Expected native type", "Rye-mcp-tool//get-description") } toolInfo, ok := tool.Value.(struct { @@ -346,13 +347,13 @@ var Builtins_mcp = map[string]*env.Builtin{ }) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "Failed to cast to tool info", "Rye-mcp-tool//get-description") + return evaldo.MakeBuiltinError(ps, "Failed to cast to tool info", "Rye-mcp-tool//get-description") } return env.String{Value: toolInfo.Description} default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mcp-tool//get-description") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mcp-tool//get-description") } }, }, @@ -366,7 +367,7 @@ var Builtins_mcp = map[string]*env.Builtin{ case env.Native: if prompt.Type() != env.NativeType { ps.FailureFlag = true - return MakeBuiltinError(ps, "Expected native type", "Rye-mcp-prompt//get-name") + return evaldo.MakeBuiltinError(ps, "Expected native type", "Rye-mcp-prompt//get-name") } promptInfo, ok := prompt.Value.(struct { @@ -375,13 +376,13 @@ var Builtins_mcp = map[string]*env.Builtin{ }) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "Failed to cast to prompt info", "Rye-mcp-prompt//get-name") + return evaldo.MakeBuiltinError(ps, "Failed to cast to prompt info", "Rye-mcp-prompt//get-name") } return env.String{Value: promptInfo.Name} default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mcp-prompt//get-name") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mcp-prompt//get-name") } }, }, @@ -394,7 +395,7 @@ var Builtins_mcp = map[string]*env.Builtin{ case env.Native: if prompt.Type() != env.NativeType { ps.FailureFlag = true - return MakeBuiltinError(ps, "Expected native type", "Rye-mcp-prompt//get-description") + return evaldo.MakeBuiltinError(ps, "Expected native type", "Rye-mcp-prompt//get-description") } promptInfo, ok := prompt.Value.(struct { @@ -403,13 +404,13 @@ var Builtins_mcp = map[string]*env.Builtin{ }) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "Failed to cast to prompt info", "Rye-mcp-prompt//get-description") + return evaldo.MakeBuiltinError(ps, "Failed to cast to prompt info", "Rye-mcp-prompt//get-description") } return env.String{Value: promptInfo.Description} default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mcp-prompt//get-description") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mcp-prompt//get-description") } }, }, diff --git a/evaldo/builtins_mcp_not.go b/batteries/builtins_mcp_not.go similarity index 91% rename from evaldo/builtins_mcp_not.go rename to batteries/builtins_mcp_not.go index 0e140b95..41b32b37 100644 --- a/evaldo/builtins_mcp_not.go +++ b/batteries/builtins_mcp_not.go @@ -1,7 +1,7 @@ //go:build no_mcp // +build no_mcp -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_mime-mail_more-raw.go b/batteries/builtins_mime-mail_more-raw.go old mode 100755 new mode 100644 similarity index 99% rename from evaldo/builtins_mime-mail_more-raw.go rename to batteries/builtins_mime-mail_more-raw.go index 86c4332e..ac888195 --- a/evaldo/builtins_mime-mail_more-raw.go +++ b/batteries/builtins_mime-mail_more-raw.go @@ -1,7 +1,7 @@ //go:build b_smtpd_MORE_RAW // +build b_smtpd_MORE_RAW -package evaldo +package batteries import ( // "bytes" diff --git a/evaldo/builtins_mqtt.go b/batteries/builtins_mqtt.go similarity index 79% rename from evaldo/builtins_mqtt.go rename to batteries/builtins_mqtt.go index 522ddc24..adc5a81c 100644 --- a/evaldo/builtins_mqtt.go +++ b/batteries/builtins_mqtt.go @@ -1,7 +1,7 @@ //go:build !no_mqtt // +build !no_mqtt -package evaldo +package batteries import ( "fmt" @@ -9,6 +9,7 @@ import ( "time" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" mqtt "github.com/eclipse/paho.mqtt.golang" ) @@ -52,7 +53,7 @@ var Builtins_mqtt = map[string]*env.Builtin{ scheme := ps.Idx.GetWord(uri.Scheme.Index) if scheme != "mqtt" && scheme != "mqtts" { ps.FailureFlag = true - return MakeBuiltinError(ps, "URI scheme must be 'mqtt' or 'mqtts'", "mqtt-uri//Open") + return evaldo.MakeBuiltinError(ps, "URI scheme must be 'mqtt' or 'mqtts'", "mqtt-uri//Open") } // Construct broker URL @@ -89,13 +90,13 @@ var Builtins_mqtt = map[string]*env.Builtin{ client := mqtt.NewClient(opts) if token := client.Connect(); token.Wait() && token.Error() != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, fmt.Sprintf("Failed to connect to MQTT broker: %v", token.Error()), "mqtt-uri//Open") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to connect to MQTT broker: %v", token.Error()), "mqtt-uri//Open") } return *env.NewNative(ps.Idx, client, "mqtt-client") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.UriType}, "mqtt-uri//Open") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "mqtt-uri//Open") } }, }, @@ -118,7 +119,7 @@ var Builtins_mqtt = map[string]*env.Builtin{ return *env.NewInteger(1) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-client//Disconnect") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-client//Disconnect") } }, }, @@ -137,14 +138,14 @@ var Builtins_mqtt = map[string]*env.Builtin{ switch client := arg0.(type) { case env.Native: if ps.Idx.GetWord(client.Kind.Index) != "mqtt-client" { - return MakeBuiltinError(ps, "Expected MQTT client connection.", "mqtt-client//Close") + return evaldo.MakeBuiltinError(ps, "Expected MQTT client connection.", "mqtt-client//Close") } mqttClient := client.Value.(mqtt.Client) mqttClient.Disconnect(250) // 250ms timeout return *env.NewInteger(1) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-client//Close") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-client//Close") } }, }, @@ -179,35 +180,35 @@ var Builtins_mqtt = map[string]*env.Builtin{ if qos.Value < 0 || qos.Value > 2 { ps.FailureFlag = true - return MakeBuiltinError(ps, "QoS must be 0, 1, or 2", "mqtt-client//Publish") + return evaldo.MakeBuiltinError(ps, "QoS must be 0, 1, or 2", "mqtt-client//Publish") } token := mqttClient.Publish(topic.Value, byte(qos.Value), retainBool, payload.Value) if token.Wait() && token.Error() != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, fmt.Sprintf("Failed to publish message: %v", token.Error()), "mqtt-client//Publish") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to publish message: %v", token.Error()), "mqtt-client//Publish") } return *env.NewInteger(1) default: ps.FailureFlag = true - return MakeArgError(ps, 5, []env.Type{env.IntegerType}, "mqtt-client//Publish") + return evaldo.MakeArgError(ps, 5, []env.Type{env.IntegerType}, "mqtt-client//Publish") } default: ps.FailureFlag = true - return MakeArgError(ps, 4, []env.Type{env.IntegerType}, "mqtt-client//Publish") + return evaldo.MakeArgError(ps, 4, []env.Type{env.IntegerType}, "mqtt-client//Publish") } default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.StringType}, "mqtt-client//Publish") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "mqtt-client//Publish") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "mqtt-client//Publish") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "mqtt-client//Publish") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-client//Publish") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-client//Publish") } }, }, @@ -236,21 +237,21 @@ var Builtins_mqtt = map[string]*env.Builtin{ token := mqttClient.Publish(topic.Value, 0, false, payload.Value) if token.Wait() && token.Error() != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, fmt.Sprintf("Failed to publish message: %v", token.Error()), "mqtt-client//Publish-simple") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to publish message: %v", token.Error()), "mqtt-client//Publish-simple") } return *env.NewInteger(1) default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.StringType}, "mqtt-client//Publish-simple") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "mqtt-client//Publish-simple") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "mqtt-client//Publish-simple") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "mqtt-client//Publish-simple") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-client//Publish-simple") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-client//Publish-simple") } }, }, @@ -281,7 +282,7 @@ var Builtins_mqtt = map[string]*env.Builtin{ if qos.Value < 0 || qos.Value > 2 { ps.FailureFlag = true - return MakeBuiltinError(ps, "QoS must be 0, 1, or 2", "mqtt-client//Subscribe") + return evaldo.MakeBuiltinError(ps, "QoS must be 0, 1, or 2", "mqtt-client//Subscribe") } callback := func(client mqtt.Client, msg mqtt.Message) { @@ -300,7 +301,7 @@ var Builtins_mqtt = map[string]*env.Builtin{ msgDict["duplicate"] = *env.NewBoolean(msg.Duplicate()) msgDict["message-id"] = *env.NewInteger(int64(msg.MessageID())) - CallFunctionArgs2(handler, + evaldo.CallFunctionArgs2(handler, &psCallback, *env.NewString(string(msg.Payload())), *env.NewDict(msgDict), @@ -308,32 +309,32 @@ var Builtins_mqtt = map[string]*env.Builtin{ if psCallback.FailureFlag || psCallback.ErrorFlag { fmt.Println("********* CALLBACK ERROR MQTT") } - MaybeDisplayFailureOrError(&psCallback, psCallback.Idx, "on-mqtt-message") + evaldo.MaybeDisplayFailureOrError(&psCallback, psCallback.Idx, "on-mqtt-message") } token := mqttClient.Subscribe(topic.Value, byte(qos.Value), callback) if token.Wait() && token.Error() != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, fmt.Sprintf("Failed to subscribe: %v", token.Error()), "mqtt-client//Subscribe") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to subscribe: %v", token.Error()), "mqtt-client//Subscribe") } return *env.NewInteger(1) default: fmt.Println(arg3.Inspect(*ps.Idx)) ps.FailureFlag = true - return MakeArgError(ps, 4, []env.Type{env.FunctionType}, "mqtt-client//Subscribe") + return evaldo.MakeArgError(ps, 4, []env.Type{env.FunctionType}, "mqtt-client//Subscribe") } default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.IntegerType}, "mqtt-client//Subscribe") + return evaldo.MakeArgError(ps, 3, []env.Type{env.IntegerType}, "mqtt-client//Subscribe") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "mqtt-client//Subscribe") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "mqtt-client//Subscribe") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-client//Subscribe") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-client//Subscribe") } }, }, @@ -372,27 +373,27 @@ var Builtins_mqtt = map[string]*env.Builtin{ msgDict["qos"] = *env.NewInteger(int64(msg.Qos())) msgDict["retained"] = *env.NewBoolean(msg.Retained()) - CallFunctionArgs2(handler, &psCallback, *env.NewDict(msgDict), env.Void{}, nil) + evaldo.CallFunctionArgs2(handler, &psCallback, *env.NewDict(msgDict), env.Void{}, nil) } token := mqttClient.Subscribe(topic.Value, 0, callback) if token.Wait() && token.Error() != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, fmt.Sprintf("Failed to subscribe: %v", token.Error()), "mqtt-client//Subscribe-simple") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to subscribe: %v", token.Error()), "mqtt-client//Subscribe-simple") } return *env.NewInteger(1) default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.FunctionType}, "mqtt-client//Subscribe-simple") + return evaldo.MakeArgError(ps, 3, []env.Type{env.FunctionType}, "mqtt-client//Subscribe-simple") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "mqtt-client//Subscribe-simple") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "mqtt-client//Subscribe-simple") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-client//Subscribe-simple") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-client//Subscribe-simple") } }, }, @@ -418,17 +419,17 @@ var Builtins_mqtt = map[string]*env.Builtin{ token := mqttClient.Unsubscribe(topic.Value) if token.Wait() && token.Error() != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, fmt.Sprintf("Failed to unsubscribe: %v", token.Error()), "mqtt-client//Unsubscribe") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to unsubscribe: %v", token.Error()), "mqtt-client//Unsubscribe") } return *env.NewInteger(1) default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "mqtt-client//Unsubscribe") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "mqtt-client//Unsubscribe") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-client//Unsubscribe") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-client//Unsubscribe") } }, }, @@ -453,7 +454,7 @@ var Builtins_mqtt = map[string]*env.Builtin{ } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-client//Connected?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-client//Connected?") } }, }, @@ -491,11 +492,11 @@ var Builtins_mqtt = map[string]*env.Builtin{ return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "mqtt-options//Set-broker") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "mqtt-options//Set-broker") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-options//Set-broker") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-options//Set-broker") } }, }, @@ -520,11 +521,11 @@ var Builtins_mqtt = map[string]*env.Builtin{ return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "mqtt-options//Set-client-id") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "mqtt-options//Set-client-id") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-options//Set-client-id") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-options//Set-client-id") } }, }, @@ -549,11 +550,11 @@ var Builtins_mqtt = map[string]*env.Builtin{ return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "mqtt-options//Set-keep-alive") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "mqtt-options//Set-keep-alive") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-options//Set-keep-alive") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-options//Set-keep-alive") } }, }, @@ -578,11 +579,11 @@ var Builtins_mqtt = map[string]*env.Builtin{ return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "mqtt-options//Set-username") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "mqtt-options//Set-username") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-options//Set-username") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-options//Set-username") } }, }, @@ -607,11 +608,11 @@ var Builtins_mqtt = map[string]*env.Builtin{ return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "mqtt-options//Set-password") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "mqtt-options//Set-password") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-options//Set-password") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-options//Set-password") } }, }, @@ -642,7 +643,7 @@ var Builtins_mqtt = map[string]*env.Builtin{ case env.Integer: if qos.Value < 0 || qos.Value > 2 { ps.FailureFlag = true - return MakeBuiltinError(ps, "QoS must be 0, 1, or 2", "mqtt-options//Set-will") + return evaldo.MakeBuiltinError(ps, "QoS must be 0, 1, or 2", "mqtt-options//Set-will") } options := opts.Value.(*mqtt.ClientOptions) @@ -651,23 +652,23 @@ var Builtins_mqtt = map[string]*env.Builtin{ return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 5, []env.Type{env.IntegerType}, "mqtt-options//Set-will") + return evaldo.MakeArgError(ps, 5, []env.Type{env.IntegerType}, "mqtt-options//Set-will") } default: ps.FailureFlag = true - return MakeArgError(ps, 4, []env.Type{env.IntegerType}, "mqtt-options//Set-will") + return evaldo.MakeArgError(ps, 4, []env.Type{env.IntegerType}, "mqtt-options//Set-will") } default: ps.FailureFlag = true - return MakeArgError(ps, 3, []env.Type{env.StringType}, "mqtt-options//Set-will") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "mqtt-options//Set-will") } default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "mqtt-options//Set-will") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "mqtt-options//Set-will") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-options//Set-will") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-options//Set-will") } }, }, @@ -690,13 +691,13 @@ var Builtins_mqtt = map[string]*env.Builtin{ if token := client.Connect(); token.Wait() && token.Error() != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, fmt.Sprintf("Failed to connect to MQTT broker: %v", token.Error()), "mqtt-options//Connect-with-options") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to connect to MQTT broker: %v", token.Error()), "mqtt-options//Connect-with-options") } return *env.NewNative(ps.Idx, client, "mqtt-client") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-options//Connect-with-options") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "mqtt-options//Connect-with-options") } }, }, diff --git a/evaldo/builtins_msgdispatcher.go b/batteries/builtins_msgdispatcher.go similarity index 79% rename from evaldo/builtins_msgdispatcher.go rename to batteries/builtins_msgdispatcher.go index 66280d96..b036c350 100644 --- a/evaldo/builtins_msgdispatcher.go +++ b/batteries/builtins_msgdispatcher.go @@ -1,4 +1,4 @@ -package evaldo +package batteries import ( "fmt" @@ -6,6 +6,7 @@ import ( "time" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" ) // MessageDispatcher provides a high-performance message routing system @@ -129,8 +130,8 @@ func (md *MessageDispatcher) runLoop(ps *env.ProgramState, updateCallback env.Fu state := md.state md.mu.RUnlock() - CallFunctionArgs2(updateCallback, ps, nil, state, nil) - MaybeDisplayFailureOrError(ps, ps.Idx, "msgdispatcher-update") + evaldo.CallFunctionArgs2(updateCallback, ps, nil, state, nil) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "msgdispatcher-update") if ps.ErrorFlag || ps.ReturnFlag { continue // Skip update on error } @@ -177,8 +178,8 @@ func (md *MessageDispatcher) processMessage(ps *env.ProgramState, msg env.Object } // Call handler with message and state - CallFunctionArgs2(handler, ps, msg, currentState, nil) - MaybeDisplayFailureOrError(ps, ps.Idx, "msgdispatcher-handler") + evaldo.CallFunctionArgs2(handler, ps, msg, currentState, nil) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "msgdispatcher-handler") if ps.ErrorFlag || ps.ReturnFlag { fmt.Printf("Warning: Handler error for message type '%s'\n", msgType) return @@ -211,10 +212,10 @@ var Builtins_msgdispatcher = map[string]*env.Builtin{ dispatcher := NewMessageDispatcher(int(bufSize.Value), initialState) return *env.NewNative(ps.Idx, dispatcher, "msg-dispatcher") default: - return MakeArgError(ps, 2, []env.Type{env.DictType}, "msg-dispatcher") + return evaldo.MakeArgError(ps, 2, []env.Type{env.DictType}, "msg-dispatcher") } default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "msg-dispatcher") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "msg-dispatcher") } }, }, @@ -235,7 +236,7 @@ var Builtins_msgdispatcher = map[string]*env.Builtin{ case env.Native: dispatcher, ok := native.Value.(*MessageDispatcher) if !ok { - return MakeBuiltinError(ps, "Expected MessageDispatcher", "Rye-msg-dispatcher//Register") + return evaldo.MakeBuiltinError(ps, "Expected MessageDispatcher", "Rye-msg-dispatcher//Register") } switch msgType := arg1.(type) { @@ -243,18 +244,18 @@ var Builtins_msgdispatcher = map[string]*env.Builtin{ switch handler := arg2.(type) { case env.Function: if handler.Argsn != 2 { - return MakeBuiltinError(ps, "Handler must accept 2 arguments (message, state)", "Rye-msg-dispatcher//Register") + return evaldo.MakeBuiltinError(ps, "Handler must accept 2 arguments (message, state)", "Rye-msg-dispatcher//Register") } dispatcher.RegisterHandler(msgType.Value, handler) return arg0 default: - return MakeArgError(ps, 3, []env.Type{env.FunctionType}, "Rye-msg-dispatcher//Register") + return evaldo.MakeArgError(ps, 3, []env.Type{env.FunctionType}, "Rye-msg-dispatcher//Register") } default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Rye-msg-dispatcher//Register") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Rye-msg-dispatcher//Register") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-msg-dispatcher//Register") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-msg-dispatcher//Register") } }, }, @@ -274,7 +275,7 @@ var Builtins_msgdispatcher = map[string]*env.Builtin{ case env.Native: dispatcher, ok := native.Value.(*MessageDispatcher) if !ok { - return MakeBuiltinError(ps, "Expected MessageDispatcher", "Rye-msg-dispatcher//Unregister") + return evaldo.MakeBuiltinError(ps, "Expected MessageDispatcher", "Rye-msg-dispatcher//Unregister") } switch msgType := arg1.(type) { @@ -282,10 +283,10 @@ var Builtins_msgdispatcher = map[string]*env.Builtin{ dispatcher.UnregisterHandler(msgType.Value) return arg0 default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Rye-msg-dispatcher//Unregister") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Rye-msg-dispatcher//Unregister") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-msg-dispatcher//Unregister") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-msg-dispatcher//Unregister") } }, }, @@ -305,16 +306,16 @@ var Builtins_msgdispatcher = map[string]*env.Builtin{ case env.Native: dispatcher, ok := native.Value.(*MessageDispatcher) if !ok { - return MakeBuiltinError(ps, "Expected MessageDispatcher", "Rye-msg-dispatcher//Send") + return evaldo.MakeBuiltinError(ps, "Expected MessageDispatcher", "Rye-msg-dispatcher//Send") } err := dispatcher.Send(arg1) if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Send failed: %v", err), "Rye-msg-dispatcher//Send") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Send failed: %v", err), "Rye-msg-dispatcher//Send") } return arg0 default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-msg-dispatcher//Send") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-msg-dispatcher//Send") } }, }, @@ -333,11 +334,11 @@ var Builtins_msgdispatcher = map[string]*env.Builtin{ case env.Native: dispatcher, ok := native.Value.(*MessageDispatcher) if !ok { - return MakeBuiltinError(ps, "Expected MessageDispatcher", "Rye-msg-dispatcher//State") + return evaldo.MakeBuiltinError(ps, "Expected MessageDispatcher", "Rye-msg-dispatcher//State") } return dispatcher.GetState() default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-msg-dispatcher//State") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-msg-dispatcher//State") } }, }, @@ -357,7 +358,7 @@ var Builtins_msgdispatcher = map[string]*env.Builtin{ case env.Native: dispatcher, ok := native.Value.(*MessageDispatcher) if !ok { - return MakeBuiltinError(ps, "Expected MessageDispatcher", "Rye-msg-dispatcher//Set-state") + return evaldo.MakeBuiltinError(ps, "Expected MessageDispatcher", "Rye-msg-dispatcher//Set-state") } switch newState := arg1.(type) { @@ -365,10 +366,10 @@ var Builtins_msgdispatcher = map[string]*env.Builtin{ dispatcher.SetState(newState) return arg0 default: - return MakeArgError(ps, 2, []env.Type{env.DictType}, "Rye-msg-dispatcher//Set-state") + return evaldo.MakeArgError(ps, 2, []env.Type{env.DictType}, "Rye-msg-dispatcher//Set-state") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-msg-dispatcher//Set-state") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-msg-dispatcher//Set-state") } }, }, @@ -388,27 +389,27 @@ var Builtins_msgdispatcher = map[string]*env.Builtin{ case env.Native: dispatcher, ok := native.Value.(*MessageDispatcher) if !ok { - return MakeBuiltinError(ps, "Expected MessageDispatcher", "Rye-msg-dispatcher//Start") + return evaldo.MakeBuiltinError(ps, "Expected MessageDispatcher", "Rye-msg-dispatcher//Start") } var updateCallback env.Function switch cb := arg1.(type) { case env.Function: if cb.Argsn != 1 { - return MakeBuiltinError(ps, "Update callback must accept 1 argument (state)", "Rye-msg-dispatcher//Start") + return evaldo.MakeBuiltinError(ps, "Update callback must accept 1 argument (state)", "Rye-msg-dispatcher//Start") } updateCallback = cb case env.Void: // No callback, use empty function updateCallback = env.Function{Argsn: -1} default: - return MakeArgError(ps, 2, []env.Type{env.FunctionType, env.VoidType}, "Rye-msg-dispatcher//Start") + return evaldo.MakeArgError(ps, 2, []env.Type{env.FunctionType, env.VoidType}, "Rye-msg-dispatcher//Start") } dispatcher.Start(ps, updateCallback) return arg0 default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-msg-dispatcher//Start") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-msg-dispatcher//Start") } }, }, @@ -427,12 +428,12 @@ var Builtins_msgdispatcher = map[string]*env.Builtin{ case env.Native: dispatcher, ok := native.Value.(*MessageDispatcher) if !ok { - return MakeBuiltinError(ps, "Expected MessageDispatcher", "Rye-msg-dispatcher//Stop") + return evaldo.MakeBuiltinError(ps, "Expected MessageDispatcher", "Rye-msg-dispatcher//Stop") } dispatcher.Stop() return arg0 default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-msg-dispatcher//Stop") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-msg-dispatcher//Stop") } }, }, diff --git a/evaldo/builtins_mysql.go b/batteries/builtins_mysql.go old mode 100755 new mode 100644 similarity index 77% rename from evaldo/builtins_mysql.go rename to batteries/builtins_mysql.go index 87b98531..cec5ace4 --- a/evaldo/builtins_mysql.go +++ b/batteries/builtins_mysql.go @@ -1,7 +1,7 @@ //go:build !no_mysql // +build !no_mysql -package evaldo +package batteries import ( "database/sql" @@ -9,6 +9,7 @@ import ( "strings" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" _ "github.com/go-sql-driver/mysql" ) @@ -32,15 +33,15 @@ var Builtins_mysql = map[string]*env.Builtin{ case env.Uri: db, err := sql.Open("mysql", str.Path) // TODO -- we need to make path parser in URI then this will be path if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Error opening MySQL: %v", err.Error()), "mysql-uri//Open") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Error opening MySQL: %v", err.Error()), "mysql-uri//Open") } // sql.Open doesn't actually connect, we need to ping to verify the connection if err := db.Ping(); err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Error connecting to MySQL: %v", err.Error()), "mysql-uri//Open") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Error connecting to MySQL: %v", err.Error()), "mysql-uri//Open") } return *env.NewNative(ps.Idx, db, "Rye-mysql") default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "mysql-uri//Open") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "mysql-uri//Open") } }, @@ -64,18 +65,18 @@ var Builtins_mysql = map[string]*env.Builtin{ path := strings.Replace(str.Path, "@", ":"+pwd.Value+"@", 1) db, err := sql.Open("mysql", path) if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Error opening MySQL: %v", err.Error()), "mysql-uri//Open\\pwd") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Error opening MySQL: %v", err.Error()), "mysql-uri//Open\\pwd") } // sql.Open doesn't actually connect, we need to ping to verify the connection if err := db.Ping(); err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Error connecting to MySQL: %v", err.Error()), "mysql-uri//Open\\pwd") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Error connecting to MySQL: %v", err.Error()), "mysql-uri//Open\\pwd") } return *env.NewNative(ps.Idx, db, "Rye-mysql") default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "mysql-uri//Open\\pwd") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "mysql-uri//Open\\pwd") } default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "mysql-uri//Open\\pwd") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "mysql-uri//Open\\pwd") } }, }, @@ -108,7 +109,7 @@ var Builtins_mysql = map[string]*env.Builtin{ sqlstr = str.Value default: ps.ErrorFlag = true - return MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-mysql//Exec") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-mysql//Exec") } if sqlstr != "" { //fmt.Println(sqlstr) @@ -117,21 +118,21 @@ var Builtins_mysql = map[string]*env.Builtin{ res, err := db2.Exec(sqlstr, vals...) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "Rye-mysql//Exec") + return evaldo.MakeBuiltinError(ps, err.Error(), "Rye-mysql//Exec") } else { num, _ := res.RowsAffected() if num > 0 { return env.NewInteger(1) } else { ps.FailureFlag = true - return MakeBuiltinError(ps, "No rows affected.", "Rye-mysql//Exec") + return evaldo.MakeBuiltinError(ps, "No rows affected.", "Rye-mysql//Exec") } } } else { - return MakeBuiltinError(ps, "SQL string is blank.", "Rye-mysql//Exec") + return evaldo.MakeBuiltinError(ps, "SQL string is blank.", "Rye-mysql//Exec") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mysql//Exec") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mysql//Exec") } }, }, @@ -166,7 +167,7 @@ var Builtins_mysql = map[string]*env.Builtin{ sqlstr = str.Value default: ps.ErrorFlag = true - return MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-mysql//Query") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-mysql//Query") } if sqlstr != "" { // fmt.Println(sqlstr) @@ -175,7 +176,7 @@ var Builtins_mysql = map[string]*env.Builtin{ // result := make([]map[string]any, 0) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "Rye-mysql//Query") + return evaldo.MakeBuiltinError(ps, err.Error(), "Rye-mysql//Query") } else { cols, _ := rows.Columns() spr := env.NewTable(cols) @@ -193,7 +194,7 @@ var Builtins_mysql = map[string]*env.Builtin{ // Scan the result into the column pointers... if err := rows.Scan(columnPointers...); err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "Rye-mysql//Query") + return evaldo.MakeBuiltinError(ps, err.Error(), "Rye-mysql//Query") } // Create our map, and retrieve the value for each column from the pointers slice, @@ -222,17 +223,17 @@ var Builtins_mysql = map[string]*env.Builtin{ // fmt.Print(result) if i == 0 { ps.FailureFlag = true - return MakeBuiltinError(ps, "No data.", "Rye-mysql//Query") + return evaldo.MakeBuiltinError(ps, "No data.", "Rye-mysql//Query") } return *spr //return *env.NewNative(ps.Idx, *spr, "Rye-table") } } else { - return MakeBuiltinError(ps, "Empty SQL.", "Rye-mysql//Query") + return evaldo.MakeBuiltinError(ps, "Empty SQL.", "Rye-mysql//Query") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mysql//Query") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mysql//Query") } }, }, @@ -251,19 +252,19 @@ var Builtins_mysql = map[string]*env.Builtin{ case env.Native: mysqlKind, _ := ps.Idx.GetIndex("Rye-mysql") if db.Kind.Index != mysqlKind { - return MakeBuiltinError(ps, "Expected MySQL database connection.", "Rye-mysql//Close") + return evaldo.MakeBuiltinError(ps, "Expected MySQL database connection.", "Rye-mysql//Close") } sqlDB, ok := db.Value.(*sql.DB) if !ok { - return MakeBuiltinError(ps, "Invalid database connection.", "Rye-mysql//Close") + return evaldo.MakeBuiltinError(ps, "Invalid database connection.", "Rye-mysql//Close") } err := sqlDB.Close() if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Error closing database: %v", err.Error()), "Rye-mysql//Close") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Error closing database: %v", err.Error()), "Rye-mysql//Close") } return *env.NewInteger(1) default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mysql//Close") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mysql//Close") } }, }, diff --git a/evaldo/builtins_mysql_not.go b/batteries/builtins_mysql_not.go similarity index 87% rename from evaldo/builtins_mysql_not.go rename to batteries/builtins_mysql_not.go index ec4a5c92..b46e0901 100644 --- a/evaldo/builtins_mysql_not.go +++ b/batteries/builtins_mysql_not.go @@ -1,7 +1,7 @@ //go:build no_mysql // +build no_mysql -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_os.go b/batteries/builtins_os.go similarity index 82% rename from evaldo/builtins_os.go rename to batteries/builtins_os.go index 4223f85f..265fb953 100644 --- a/evaldo/builtins_os.go +++ b/batteries/builtins_os.go @@ -1,6 +1,6 @@ //go:build !no_os && !b_wasm -package evaldo +package batteries import ( "archive/tar" @@ -20,6 +20,7 @@ import ( "github.com/atotto/clipboard" "github.com/refaktor/go-find" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/shirou/gopsutil/v3/disk" "github.com/shirou/gopsutil/v3/host" @@ -72,7 +73,7 @@ var Builtins_os = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { path, err := os.Getwd() if err != nil { - return MakeBuiltinError(ps, err.Error(), "cwd?") + return evaldo.MakeBuiltinError(ps, err.Error(), "cwd?") } return *env.NewUri1(ps.Idx, "file://"+path) }, @@ -93,11 +94,11 @@ var Builtins_os = map[string]*env.Builtin{ filePath := filepath.Join(ps.WorkingPath, path.GetPath()) res := FileExists(filePath) if res == -1 { - return MakeBuiltinError(ps, "Error checking if path exists", "does-exists") + return evaldo.MakeBuiltinError(ps, "Error checking if path exists", "does-exists") } return *env.NewBoolean(res == 1) default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "does-exist") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "does-exist") } }, }, @@ -117,11 +118,11 @@ var Builtins_os = map[string]*env.Builtin{ err := os.Chdir(path.GetPath()) if err != nil { - return MakeBuiltinError(ps, err.Error(), "cd") + return evaldo.MakeBuiltinError(ps, err.Error(), "cd") } return arg0 default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "cd") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "cd") } }, }, @@ -139,11 +140,11 @@ var Builtins_os = map[string]*env.Builtin{ val, ok := os.LookupEnv(variable_name.Value) if !ok { - return MakeBuiltinError(ps, "Variable couldn't be read", "env?") + return evaldo.MakeBuiltinError(ps, "Variable couldn't be read", "env?") } return *env.NewString(val) default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "env?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "env?") } }, }, @@ -168,12 +169,12 @@ var Builtins_os = map[string]*env.Builtin{ fmt.Println(newDir)*/ err := os.Mkdir(newDir, 0755) // Create directory with permissions 0755 if err != nil { - return MakeBuiltinError(ps, "Error creating directory: "+err.Error(), "mkdir") + return evaldo.MakeBuiltinError(ps, "Error creating directory: "+err.Error(), "mkdir") } else { return arg0 } default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "mkdir") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "mkdir") } }, }, @@ -188,7 +189,7 @@ var Builtins_os = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { dir, err := os.MkdirTemp("", "rye-tmp-") if err != nil { - return MakeBuiltinError(ps, "Error creating temporary directory: "+err.Error(), "mktmp") + return evaldo.MakeBuiltinError(ps, "Error creating temporary directory: "+err.Error(), "mktmp") } return *env.NewUri1(ps.Idx, "file://"+dir) }, @@ -208,11 +209,11 @@ var Builtins_os = map[string]*env.Builtin{ filePath := filepath.Join(ps.WorkingPath, path.GetPath()) err := os.Remove(filePath) if err != nil { - return MakeBuiltinError(ps, "Error removing file: "+err.Error(), "rm") + return evaldo.MakeBuiltinError(ps, "Error removing file: "+err.Error(), "rm") } return arg0 default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "rm") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "rm") } }, }, @@ -231,11 +232,11 @@ var Builtins_os = map[string]*env.Builtin{ dirPath := filepath.Join(ps.WorkingPath, path.GetPath()) err := os.RemoveAll(dirPath) if err != nil { - return MakeBuiltinError(ps, "Error removing directory: "+err.Error(), "rmdir") + return evaldo.MakeBuiltinError(ps, "Error removing directory: "+err.Error(), "rmdir") } return arg0 default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "rmdir") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "rmdir") } }, }, @@ -260,26 +261,26 @@ var Builtins_os = map[string]*env.Builtin{ // Read source file data, err := os.ReadFile(srcPath) if err != nil { - return MakeBuiltinError(ps, "Error reading source file: "+err.Error(), "cp") + return evaldo.MakeBuiltinError(ps, "Error reading source file: "+err.Error(), "cp") } // Get source file permissions srcInfo, err := os.Stat(srcPath) if err != nil { - return MakeBuiltinError(ps, "Error getting source file info: "+err.Error(), "cp") + return evaldo.MakeBuiltinError(ps, "Error getting source file info: "+err.Error(), "cp") } // Write to destination with same permissions err = os.WriteFile(dstPath, data, srcInfo.Mode()) if err != nil { - return MakeBuiltinError(ps, "Error writing destination file: "+err.Error(), "cp") + return evaldo.MakeBuiltinError(ps, "Error writing destination file: "+err.Error(), "cp") } return arg1 default: - return MakeArgError(ps, 2, []env.Type{env.UriType}, "cp") + return evaldo.MakeArgError(ps, 2, []env.Type{env.UriType}, "cp") } default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "cp") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "cp") } }, }, @@ -298,7 +299,7 @@ var Builtins_os = map[string]*env.Builtin{ filePath := filepath.Join(ps.WorkingPath, path.GetPath()) info, err := os.Stat(filePath) if err != nil { - return MakeBuiltinError(ps, "Error getting file info: "+err.Error(), "file-info?") + return evaldo.MakeBuiltinError(ps, "Error getting file info: "+err.Error(), "file-info?") } r := env.NewDict(make(map[string]any, 5)) r.Data["name"] = *env.NewString(info.Name()) @@ -308,7 +309,7 @@ var Builtins_os = map[string]*env.Builtin{ r.Data["is-dir"] = *env.NewBoolean(info.IsDir()) return *r default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "file-info?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-info?") } }, }, @@ -330,11 +331,11 @@ var Builtins_os = map[string]*env.Builtin{ if os.IsNotExist(err) { return *env.NewBoolean(false) } - return MakeBuiltinError(ps, "Error checking path: "+err.Error(), "is-dir?") + return evaldo.MakeBuiltinError(ps, "Error checking path: "+err.Error(), "is-dir?") } return *env.NewBoolean(info.IsDir()) default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "is-dir?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "is-dir?") } }, }, @@ -356,11 +357,11 @@ var Builtins_os = map[string]*env.Builtin{ if os.IsNotExist(err) { return *env.NewBoolean(false) } - return MakeBuiltinError(ps, "Error checking path: "+err.Error(), "is-file?") + return evaldo.MakeBuiltinError(ps, "Error checking path: "+err.Error(), "is-file?") } return *env.NewBoolean(info.Mode().IsRegular()) default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "is-file?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "is-file?") } }, }, @@ -376,7 +377,7 @@ var Builtins_os = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { dir, err := os.UserHomeDir() if err != nil { - return MakeBuiltinError(ps, "Error getting home directory: "+err.Error(), "home-dir?") + return evaldo.MakeBuiltinError(ps, "Error getting home directory: "+err.Error(), "home-dir?") } return *env.NewUri1(ps.Idx, "file://"+dir) }, @@ -410,7 +411,7 @@ var Builtins_os = map[string]*env.Builtin{ patternPath := filepath.Join(ps.WorkingPath, pattern.Value) matches, err := filepath.Glob(patternPath) if err != nil { - return MakeBuiltinError(ps, "Error in glob pattern: "+err.Error(), "glob") + return evaldo.MakeBuiltinError(ps, "Error in glob pattern: "+err.Error(), "glob") } items := make([]env.Object, len(matches)) for i, match := range matches { @@ -418,7 +419,7 @@ var Builtins_os = map[string]*env.Builtin{ } return *env.NewBlock(*env.NewTSeries(items)) default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "glob") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "glob") } }, }, @@ -440,14 +441,14 @@ var Builtins_os = map[string]*env.Builtin{ newPath := filepath.Join(ps.WorkingPath, dst.GetPath()) err := os.Rename(oldPath, newPath) if err != nil { - return MakeBuiltinError(ps, "Error moving file: "+err.Error(), "mv") + return evaldo.MakeBuiltinError(ps, "Error moving file: "+err.Error(), "mv") } return arg1 default: - return MakeArgError(ps, 2, []env.Type{env.UriType}, "mv") + return evaldo.MakeArgError(ps, 2, []env.Type{env.UriType}, "mv") } default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "mv") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "mv") } }, }, @@ -463,7 +464,7 @@ var Builtins_os = map[string]*env.Builtin{ files, err := os.ReadDir(".") if err != nil { - return MakeBuiltinError(ps, "Error reading directory:"+err.Error(), "ls") + return evaldo.MakeBuiltinError(ps, "Error reading directory:"+err.Error(), "ls") } items := make([]env.Object, len(files)) @@ -497,16 +498,16 @@ var Builtins_os = map[string]*env.Builtin{ info, err := os.Stat(targetPath) if err != nil { if os.IsNotExist(err) { - return MakeBuiltinError(ps, fmt.Sprintf("path doesn't exist: %s", uri.GetPath()), "ls\\") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("path doesn't exist: %s", uri.GetPath()), "ls\\") } if os.IsPermission(err) { - return MakeBuiltinError(ps, fmt.Sprintf("permission denied: %s", uri.GetPath()), "ls\\") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("permission denied: %s", uri.GetPath()), "ls\\") } - return MakeBuiltinError(ps, fmt.Sprintf("error accessing path %s: %s", uri.GetPath(), err.Error()), "ls\\") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("error accessing path %s: %s", uri.GetPath(), err.Error()), "ls\\") } if !info.IsDir() { - return MakeBuiltinError(ps, fmt.Sprintf("not a directory (is file): %s", uri.GetPath()), "ls\\") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("not a directory (is file): %s", uri.GetPath()), "ls\\") } targetDir = targetPath @@ -515,7 +516,7 @@ var Builtins_os = map[string]*env.Builtin{ files, err := os.ReadDir(targetDir) if err != nil { - return MakeBuiltinError(ps, "Error reading directory:"+err.Error(), "ls\\") + return evaldo.MakeBuiltinError(ps, "Error reading directory:"+err.Error(), "ls\\") } var items []env.Object @@ -537,7 +538,7 @@ var Builtins_os = map[string]*env.Builtin{ case env.Word: filter := ps.Idx.GetWord(filterArg.Index) if filter != "dirs" && filter != "files" { - return MakeBuiltinError(ps, "Word filter must be 'dirs' or 'files'", "ls\\") + return evaldo.MakeBuiltinError(ps, "Word filter must be 'dirs' or 'files'", "ls\\") } for _, file := range files { @@ -577,7 +578,7 @@ var Builtins_os = map[string]*env.Builtin{ case env.Native: // Check if it's a regexp if ps.Idx.GetWord(filterArg.Kind.Index) != "regexp" { - return MakeBuiltinError(ps, "Native object must be a regexp", "ls\\") + return evaldo.MakeBuiltinError(ps, "Native object must be a regexp", "ls\\") } regex := filterArg.Value.(*regexp.Regexp) @@ -594,7 +595,7 @@ var Builtins_os = map[string]*env.Builtin{ } default: - return MakeArgError(ps, 1, []env.Type{env.UriType, env.WordType, env.StringType, env.NativeType}, "ls\\") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType, env.WordType, env.StringType, env.NativeType}, "ls\\") } } @@ -612,7 +613,7 @@ var Builtins_os = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { files, err := os.ReadDir(".") if err != nil { - return MakeBuiltinError(ps, "Error reading directory:"+err.Error(), "ls\\dirs") + return evaldo.MakeBuiltinError(ps, "Error reading directory:"+err.Error(), "ls\\dirs") } var items []env.Object @@ -635,7 +636,7 @@ var Builtins_os = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { files, err := os.ReadDir(".") if err != nil { - return MakeBuiltinError(ps, "Error reading directory:"+err.Error(), "ls\\files") + return evaldo.MakeBuiltinError(ps, "Error reading directory:"+err.Error(), "ls\\files") } var items []env.Object @@ -658,7 +659,7 @@ var Builtins_os = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { files, err := os.ReadDir(".") if err != nil { - return MakeBuiltinError(ps, "Error reading directory:"+err.Error(), "ls\\dirs\\") + return evaldo.MakeBuiltinError(ps, "Error reading directory:"+err.Error(), "ls\\dirs\\") } var items []env.Object @@ -676,7 +677,7 @@ var Builtins_os = map[string]*env.Builtin{ case env.Native: // Check if it's a regexp if ps.Idx.GetWord(filterArg.Kind.Index) != "regexp" { - return MakeBuiltinError(ps, "Native object must be a regexp", "ls\\dirs\\") + return evaldo.MakeBuiltinError(ps, "Native object must be a regexp", "ls\\dirs\\") } regex := filterArg.Value.(*regexp.Regexp) @@ -687,7 +688,7 @@ var Builtins_os = map[string]*env.Builtin{ } default: - return MakeArgError(ps, 1, []env.Type{env.StringType, env.NativeType}, "ls\\dirs\\") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType, env.NativeType}, "ls\\dirs\\") } return *env.NewBlock(*env.NewTSeries(items)) @@ -704,7 +705,7 @@ var Builtins_os = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { files, err := os.ReadDir(".") if err != nil { - return MakeBuiltinError(ps, "Error reading directory:"+err.Error(), "ls\\files\\") + return evaldo.MakeBuiltinError(ps, "Error reading directory:"+err.Error(), "ls\\files\\") } var items []env.Object @@ -722,7 +723,7 @@ var Builtins_os = map[string]*env.Builtin{ case env.Native: // Check if it's a regexp if ps.Idx.GetWord(filterArg.Kind.Index) != "regexp" { - return MakeBuiltinError(ps, "Native object must be a regexp", "ls\\files\\") + return evaldo.MakeBuiltinError(ps, "Native object must be a regexp", "ls\\files\\") } regex := filterArg.Value.(*regexp.Regexp) @@ -733,7 +734,7 @@ var Builtins_os = map[string]*env.Builtin{ } default: - return MakeArgError(ps, 1, []env.Type{env.StringType, env.NativeType}, "ls\\files\\") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType, env.NativeType}, "ls\\files\\") } return *env.NewBlock(*env.NewTSeries(items)) @@ -758,14 +759,14 @@ var Builtins_os = map[string]*env.Builtin{ linkPath := resolvePath(ps.WorkingPath, link.GetPath()) err := os.Symlink(srcPath, linkPath) if err != nil { - return MakeBuiltinError(ps, "Error creating symlink: "+err.Error(), "symlink") + return evaldo.MakeBuiltinError(ps, "Error creating symlink: "+err.Error(), "symlink") } return arg1 default: - return MakeArgError(ps, 2, []env.Type{env.UriType}, "symlink") + return evaldo.MakeArgError(ps, 2, []env.Type{env.UriType}, "symlink") } default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "symlink") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "symlink") } }, }, @@ -787,11 +788,11 @@ var Builtins_os = map[string]*env.Builtin{ if os.IsNotExist(err) { return *env.NewBoolean(false) } - return MakeBuiltinError(ps, "Error checking path: "+err.Error(), "is-symlink?") + return evaldo.MakeBuiltinError(ps, "Error checking path: "+err.Error(), "is-symlink?") } return *env.NewBoolean(info.Mode()&os.ModeSymlink != 0) default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "is-symlink?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "is-symlink?") } }, }, @@ -810,11 +811,11 @@ var Builtins_os = map[string]*env.Builtin{ linkPath := resolvePath(ps.WorkingPath, path.GetPath()) target, err := os.Readlink(linkPath) if err != nil { - return MakeBuiltinError(ps, "Error reading symlink: "+err.Error(), "readlink") + return evaldo.MakeBuiltinError(ps, "Error reading symlink: "+err.Error(), "readlink") } return *env.NewUri1(ps.Idx, "file://"+target) default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "readlink") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "readlink") } }, }, @@ -836,14 +837,14 @@ var Builtins_os = map[string]*env.Builtin{ filePath := resolvePath(ps.WorkingPath, path.GetPath()) err := os.Chmod(filePath, os.FileMode(mode.Value)) if err != nil { - return MakeBuiltinError(ps, "Error changing permissions: "+err.Error(), "chmod") + return evaldo.MakeBuiltinError(ps, "Error changing permissions: "+err.Error(), "chmod") } return arg0 default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "chmod") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "chmod") } default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "chmod") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "chmod") } }, }, @@ -861,11 +862,11 @@ var Builtins_os = map[string]*env.Builtin{ case env.Uri: absPath, err := filepath.Abs(resolvePath(ps.WorkingPath, path.GetPath())) if err != nil { - return MakeBuiltinError(ps, "Error getting absolute path: "+err.Error(), "abs-path") + return evaldo.MakeBuiltinError(ps, "Error getting absolute path: "+err.Error(), "abs-path") } return *env.NewUri1(ps.Idx, "file://"+absPath) default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "abs-path") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "abs-path") } }, }, @@ -884,7 +885,7 @@ var Builtins_os = map[string]*env.Builtin{ dir := filepath.Dir(path.GetPath()) return *env.NewUri1(ps.Idx, "file://"+dir) default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "dirname") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "dirname") } }, }, @@ -903,7 +904,7 @@ var Builtins_os = map[string]*env.Builtin{ base := filepath.Base(path.GetPath()) return *env.NewString(base) default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "basename") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "basename") } }, }, @@ -922,7 +923,7 @@ var Builtins_os = map[string]*env.Builtin{ ext := filepath.Ext(path.GetPath()) return *env.NewString(ext) default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "file-ext") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-ext") } }, }, @@ -947,7 +948,7 @@ var Builtins_os = map[string]*env.Builtin{ case env.String: pathStrs[i] = p.Value default: - return MakeBuiltinError(ps, "Block must contain only uris or strings", "join-path") + return evaldo.MakeBuiltinError(ps, "Block must contain only uris or strings", "join-path") } } joined := filepath.Join(pathStrs...) @@ -956,7 +957,7 @@ var Builtins_os = map[string]*env.Builtin{ // If single uri passed, just return it return arg0 default: - return MakeArgError(ps, 1, []env.Type{env.UriType, env.BlockType}, "join-path") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType, env.BlockType}, "join-path") } }, }, @@ -975,7 +976,7 @@ var Builtins_os = map[string]*env.Builtin{ username = os.Getenv("USERNAME") // Windows } if username == "" { - return MakeBuiltinError(ps, "Unable to determine username", "whoami") + return evaldo.MakeBuiltinError(ps, "Unable to determine username", "whoami") } return *env.NewString(username) }, @@ -994,11 +995,11 @@ var Builtins_os = map[string]*env.Builtin{ case env.String: path, err := findExecutable(cmd.Value) if err != nil { - return MakeBuiltinError(ps, "Command not found: "+cmd.Value, "which") + return evaldo.MakeBuiltinError(ps, "Command not found: "+cmd.Value, "which") } return *env.NewUri1(ps.Idx, "file://"+path) default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "which") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "which") } }, }, @@ -1021,14 +1022,14 @@ var Builtins_os = map[string]*env.Builtin{ dstPath := resolvePath(ps.WorkingPath, dst.GetPath()) err := copyRecursive(srcPath, dstPath) if err != nil { - return MakeBuiltinError(ps, "Error copying recursively: "+err.Error(), "cp-r") + return evaldo.MakeBuiltinError(ps, "Error copying recursively: "+err.Error(), "cp-r") } return arg1 default: - return MakeArgError(ps, 2, []env.Type{env.UriType}, "cp-r") + return evaldo.MakeArgError(ps, 2, []env.Type{env.UriType}, "cp-r") } default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "cp-r") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "cp-r") } }, }, @@ -1047,11 +1048,11 @@ var Builtins_os = map[string]*env.Builtin{ dirPath := resolvePath(ps.WorkingPath, path.GetPath()) err := os.MkdirAll(dirPath, 0755) if err != nil { - return MakeBuiltinError(ps, "Error creating directory: "+err.Error(), "mkdir-p") + return evaldo.MakeBuiltinError(ps, "Error creating directory: "+err.Error(), "mkdir-p") } return arg0 default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "mkdir-p") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "mkdir-p") } }, }, @@ -1066,7 +1067,7 @@ var Builtins_os = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { v, err := host.Info() if err != nil { - return MakeBuiltinError(ps, err.Error(), "host-info?") + return evaldo.MakeBuiltinError(ps, err.Error(), "host-info?") } r := env.NewDict(make(map[string]any, 10)) r.Data["hostname"] = *env.NewString(v.Hostname) @@ -1092,7 +1093,7 @@ var Builtins_os = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { users, err := host.Users() if err != nil { - return MakeBuiltinError(ps, err.Error(), "users?") + return evaldo.MakeBuiltinError(ps, err.Error(), "users?") } s := env.NewTable([]string{"User", "Terminal", "Host", "Started"}) for _, user := range users { @@ -1117,7 +1118,7 @@ var Builtins_os = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { v, err := load.Avg() if err != nil { - return MakeBuiltinError(ps, err.Error(), "load-avg?") + return evaldo.MakeBuiltinError(ps, err.Error(), "load-avg?") } r := env.NewDict(make(map[string]any, 3)) r.Data["1"] = *env.NewDecimal(v.Load1) @@ -1136,7 +1137,7 @@ var Builtins_os = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { v, err := mem.VirtualMemory() if err != nil { - return MakeBuiltinError(ps, err.Error(), "virtual-memory?") + return evaldo.MakeBuiltinError(ps, err.Error(), "virtual-memory?") } r := env.NewDict(make(map[string]any, 3)) r.Data["total"] = *env.NewInteger(int64(v.Total)) @@ -1155,13 +1156,13 @@ var Builtins_os = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { partitions, err := disk.Partitions(true) if err != nil { - return MakeBuiltinError(ps, err.Error(), "disk-usage?") + return evaldo.MakeBuiltinError(ps, err.Error(), "disk-usage?") } s := env.NewTable([]string{"Filesystem", "Size", "Used", "Available", "Capacity", "iused", "ifree", "%iused", "Mounted on"}) for _, partition := range partitions { usage, err := disk.Usage(partition.Mountpoint) if err != nil { - return MakeBuiltinError(ps, err.Error(), "disk-usage?") + return evaldo.MakeBuiltinError(ps, err.Error(), "disk-usage?") } vals := []any{ *env.NewString(partition.Device), @@ -1189,7 +1190,7 @@ var Builtins_os = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { pids, err := process.Pids() if err != nil { - return MakeBuiltinError(ps, err.Error(), "pids?") + return evaldo.MakeBuiltinError(ps, err.Error(), "pids?") } pids2 := make([]env.Object, len(pids)) @@ -1209,7 +1210,7 @@ var Builtins_os = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { processes, err := process.Processes() if err != nil { - return MakeBuiltinError(ps, err.Error(), "processes?") + return evaldo.MakeBuiltinError(ps, err.Error(), "processes?") } s := proccesTableBase() for _, process := range processes { @@ -1230,13 +1231,13 @@ var Builtins_os = map[string]*env.Builtin{ case env.Integer: process, err := process.NewProcess(int32(pid.Value)) if err != nil { - return MakeBuiltinError(ps, err.Error(), "process") + return evaldo.MakeBuiltinError(ps, err.Error(), "process") } s := proccesTableBase() processTableAdd(s, process) return s.Rows[0].ToDict() default: - return *MakeArgError(ps, 1, []env.Type{env.IntegerType}, "process") + return *evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "process") } }, }, @@ -1253,7 +1254,7 @@ var Builtins_os = map[string]*env.Builtin{ case env.String: names, err := net.LookupAddr(ip.Value) if err != nil { - return MakeBuiltinError(ps, err.Error(), "lookup-address") + return evaldo.MakeBuiltinError(ps, err.Error(), "lookup-address") } items := make([]env.Object, len(names)) for i, name := range names { @@ -1261,7 +1262,7 @@ var Builtins_os = map[string]*env.Builtin{ } return *env.NewBlock(*env.NewTSeries(items)) default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "lookup-address") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "lookup-address") } }, }, @@ -1278,7 +1279,7 @@ var Builtins_os = map[string]*env.Builtin{ case env.String: ips, err := net.LookupIP(hostname.Value) if err != nil { - return MakeBuiltinError(ps, err.Error(), "lookup-ip") + return evaldo.MakeBuiltinError(ps, err.Error(), "lookup-ip") } items := make([]env.Object, len(ips)) for i, ip := range ips { @@ -1286,7 +1287,7 @@ var Builtins_os = map[string]*env.Builtin{ } return *env.NewBlock(*env.NewTSeries(items)) default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "lookup-ip") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "lookup-ip") } }, }, @@ -1303,11 +1304,11 @@ var Builtins_os = map[string]*env.Builtin{ case env.String: err := clipboard.WriteAll(val.Value) if err != nil { - return MakeBuiltinError(ps, err.Error(), "write\\clipboard") + return evaldo.MakeBuiltinError(ps, err.Error(), "write\\clipboard") } return arg0 default: - return *MakeArgError(ps, 1, []env.Type{env.StringType}, "write\\clipboard") + return *evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "write\\clipboard") } }, }, @@ -1322,7 +1323,7 @@ var Builtins_os = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { val, err := clipboard.ReadAll() if err != nil { - return MakeBuiltinError(ps, err.Error(), "read\\clipboard") + return evaldo.MakeBuiltinError(ps, err.Error(), "read\\clipboard") } return *env.NewString(val) }, @@ -1351,14 +1352,14 @@ var Builtins_os = map[string]*env.Builtin{ dstPath := resolvePath(ps.WorkingPath, dst.GetPath()) err := createTarGz(srcPath, dstPath) if err != nil { - return MakeBuiltinError(ps, "Error creating tar.gz: "+err.Error(), "tgz") + return evaldo.MakeBuiltinError(ps, "Error creating tar.gz: "+err.Error(), "tgz") } return arg1 default: - return MakeArgError(ps, 2, []env.Type{env.UriType}, "tgz") + return evaldo.MakeArgError(ps, 2, []env.Type{env.UriType}, "tgz") } default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "tgz") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "tgz") } }, }, @@ -1382,14 +1383,14 @@ var Builtins_os = map[string]*env.Builtin{ dstPath := resolvePath(ps.WorkingPath, dst.GetPath()) err := extractTarGz(srcPath, dstPath) if err != nil { - return MakeBuiltinError(ps, "Error extracting tar.gz: "+err.Error(), "un-tgz") + return evaldo.MakeBuiltinError(ps, "Error extracting tar.gz: "+err.Error(), "un-tgz") } return arg1 default: - return MakeArgError(ps, 2, []env.Type{env.UriType}, "un-tgz") + return evaldo.MakeArgError(ps, 2, []env.Type{env.UriType}, "un-tgz") } default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "un-tgz") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "un-tgz") } }, }, @@ -1413,14 +1414,14 @@ var Builtins_os = map[string]*env.Builtin{ dstPath := resolvePath(ps.WorkingPath, dst.GetPath()) err := createZip(srcPath, dstPath) if err != nil { - return MakeBuiltinError(ps, "Error creating zip: "+err.Error(), "zip") + return evaldo.MakeBuiltinError(ps, "Error creating zip: "+err.Error(), "zip") } return arg1 default: - return MakeArgError(ps, 2, []env.Type{env.UriType}, "zip") + return evaldo.MakeArgError(ps, 2, []env.Type{env.UriType}, "zip") } default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "zip") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "zip") } }, }, @@ -1444,14 +1445,14 @@ var Builtins_os = map[string]*env.Builtin{ dstPath := resolvePath(ps.WorkingPath, dst.GetPath()) err := extractZip(srcPath, dstPath) if err != nil { - return MakeBuiltinError(ps, "Error extracting zip: "+err.Error(), "unzip") + return evaldo.MakeBuiltinError(ps, "Error extracting zip: "+err.Error(), "unzip") } return arg1 default: - return MakeArgError(ps, 2, []env.Type{env.UriType}, "unzip") + return evaldo.MakeArgError(ps, 2, []env.Type{env.UriType}, "unzip") } default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "unzip") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "unzip") } }, }, @@ -1489,13 +1490,13 @@ var Builtins_os = map[string]*env.Builtin{ case env.String: paths = append(paths, p.Value) default: - return MakeBuiltinError(ps, "Block must contain only uris or strings", "find") + return evaldo.MakeBuiltinError(ps, "Block must contain only uris or strings", "find") } } finder := find.NewFind(paths...) return *env.NewNative(ps.Idx, finder, "finder") default: - return MakeArgError(ps, 1, []env.Type{env.UriType, env.BlockType}, "find") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType, env.BlockType}, "find") } }, }, @@ -1519,12 +1520,12 @@ var Builtins_os = map[string]*env.Builtin{ finder.MinDepth(int(depth.Value)) return arg0 default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "finder//min-depth!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "finder//min-depth!") } } - return MakeBuiltinError(ps, "Expected finder object", "finder//min-depth!") + return evaldo.MakeBuiltinError(ps, "Expected finder object", "finder//min-depth!") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "finder//min-depth!") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "finder//min-depth!") } }, }, @@ -1548,12 +1549,12 @@ var Builtins_os = map[string]*env.Builtin{ finder.MaxDepth(int(depth.Value)) return arg0 default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "finder//max-depth!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "finder//max-depth!") } } - return MakeBuiltinError(ps, "Expected finder object", "finder//max-depth!") + return evaldo.MakeBuiltinError(ps, "Expected finder object", "finder//max-depth!") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "finder//max-depth!") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "finder//max-depth!") } }, }, @@ -1582,22 +1583,22 @@ var Builtins_os = map[string]*env.Builtin{ case "dir": typeStr = "d" default: - return MakeBuiltinError(ps, "Type must be 'file or 'dir", "finder//type") + return evaldo.MakeBuiltinError(ps, "Type must be 'file or 'dir", "finder//type") } case env.String: if t.Value != "f" && t.Value != "d" { - return MakeBuiltinError(ps, "Type must be \"f\" or \"d\"", "finder//type") + return evaldo.MakeBuiltinError(ps, "Type must be \"f\" or \"d\"", "finder//type") } typeStr = t.Value default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "finder//type") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "finder//type") } finder.Type(typeStr) return arg0 } - return MakeBuiltinError(ps, "Expected finder object", "finder//type") + return evaldo.MakeBuiltinError(ps, "Expected finder object", "finder//type") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "finder//type") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "finder//type") } }, }, @@ -1621,12 +1622,12 @@ var Builtins_os = map[string]*env.Builtin{ finder.Name(pattern.Value) return arg0 default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "finder//name") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "finder//name") } } - return MakeBuiltinError(ps, "Expected finder object", "finder//name") + return evaldo.MakeBuiltinError(ps, "Expected finder object", "finder//name") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "finder//name") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "finder//name") } }, }, @@ -1650,12 +1651,12 @@ var Builtins_os = map[string]*env.Builtin{ finder.WholeName(pattern.Value) return arg0 default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "finder//whole-name") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "finder//whole-name") } } - return MakeBuiltinError(ps, "Expected finder object", "finder//whole-name") + return evaldo.MakeBuiltinError(ps, "Expected finder object", "finder//whole-name") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "finder//whole-name") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "finder//whole-name") } }, }, @@ -1680,14 +1681,14 @@ var Builtins_os = map[string]*env.Builtin{ finder.Regex(regex) return arg0 } - return MakeBuiltinError(ps, "Expected regexp object", "finder//regex") + return evaldo.MakeBuiltinError(ps, "Expected regexp object", "finder//regex") default: - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "finder//regex") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "finder//regex") } } - return MakeBuiltinError(ps, "Expected finder object", "finder//regex") + return evaldo.MakeBuiltinError(ps, "Expected finder object", "finder//regex") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "finder//regex") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "finder//regex") } }, }, @@ -1708,9 +1709,9 @@ var Builtins_os = map[string]*env.Builtin{ finder.Empty() return arg0 } - return MakeBuiltinError(ps, "Expected finder object", "finder//empty") + return evaldo.MakeBuiltinError(ps, "Expected finder object", "finder//empty") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "finder//empty") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "finder//empty") } }, }, @@ -1730,7 +1731,7 @@ var Builtins_os = map[string]*env.Builtin{ if finder, ok := f.Value.(*find.Find); ok { results, err := finder.Evaluate() if err != nil { - return MakeBuiltinError(ps, "Error evaluating find: "+err.Error(), "finder//eval") + return evaldo.MakeBuiltinError(ps, "Error evaluating find: "+err.Error(), "finder//eval") } items := make([]env.Object, len(results)) for i, path := range results { @@ -1738,9 +1739,9 @@ var Builtins_os = map[string]*env.Builtin{ } return *env.NewBlock(*env.NewTSeries(items)) } - return MakeBuiltinError(ps, "Expected finder object", "finder//eval") + return evaldo.MakeBuiltinError(ps, "Expected finder object", "finder//eval") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "finder//eval") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "finder//eval") } }, }, @@ -1764,11 +1765,11 @@ var Builtins_os = map[string]*env.Builtin{ filePath := resolvePath(ps.WorkingPath, path.GetPath()) info, err := os.Stat(filePath) if err != nil { - return MakeBuiltinError(ps, "Error getting file size: "+err.Error(), "file-size") + return evaldo.MakeBuiltinError(ps, "Error getting file size: "+err.Error(), "file-size") } return *env.NewInteger(info.Size()) default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "file-size") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-size") } }, }, @@ -1792,15 +1793,15 @@ var Builtins_os = map[string]*env.Builtin{ // File doesn't exist, create it file, err := os.Create(filePath) if err != nil { - return MakeBuiltinError(ps, "Error creating file: "+err.Error(), "touch") + return evaldo.MakeBuiltinError(ps, "Error creating file: "+err.Error(), "touch") } file.Close() } else if err != nil { - return MakeBuiltinError(ps, "Error touching file: "+err.Error(), "touch") + return evaldo.MakeBuiltinError(ps, "Error touching file: "+err.Error(), "touch") } return arg0 default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "touch") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "touch") } }, }, @@ -1824,14 +1825,14 @@ var Builtins_os = map[string]*env.Builtin{ linkPath := resolvePath(ps.WorkingPath, link.GetPath()) err := os.Link(srcPath, linkPath) if err != nil { - return MakeBuiltinError(ps, "Error creating hard link: "+err.Error(), "hardlink") + return evaldo.MakeBuiltinError(ps, "Error creating hard link: "+err.Error(), "hardlink") } return arg1 default: - return MakeArgError(ps, 2, []env.Type{env.UriType}, "hardlink") + return evaldo.MakeArgError(ps, 2, []env.Type{env.UriType}, "hardlink") } default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "hardlink") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "hardlink") } }, }, @@ -1851,12 +1852,12 @@ var Builtins_os = map[string]*env.Builtin{ case env.Uri: dirPath = resolvePath(ps.WorkingPath, path.GetPath()) default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "count-dir") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "count-dir") } files, err := os.ReadDir(dirPath) if err != nil { - return MakeBuiltinError(ps, "Error reading directory: "+err.Error(), "count-dir") + return evaldo.MakeBuiltinError(ps, "Error reading directory: "+err.Error(), "count-dir") } return *env.NewInteger(int64(len(files))) }, @@ -1905,7 +1906,7 @@ var Builtins_os = map[string]*env.Builtin{ time.Sleep(time.Duration(seconds.Value) * time.Second) return arg0 default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "sleep") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "sleep") } }, }, @@ -1939,7 +1940,7 @@ var Builtins_os = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { tmux, err := gotmux.DefaultTmux() if err != nil { - return MakeBuiltinError(ps, "Failed to connect to tmux: "+err.Error(), "tmux-new-session") + return evaldo.MakeBuiltinError(ps, "Failed to connect to tmux: "+err.Error(), "tmux-new-session") } switch name := arg0.(type) { @@ -1948,11 +1949,11 @@ var Builtins_os = map[string]*env.Builtin{ Name: name.Value, }) if err != nil { - return MakeBuiltinError(ps, "Failed to create session: "+err.Error(), "tmux-new-session") + return evaldo.MakeBuiltinError(ps, "Failed to create session: "+err.Error(), "tmux-new-session") } return *env.NewNative(ps.Idx, session, "tmux-session") default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "tmux-new-session") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "tmux-new-session") } }, }, @@ -1968,12 +1969,12 @@ var Builtins_os = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { tmux, err := gotmux.DefaultTmux() if err != nil { - return MakeBuiltinError(ps, "Failed to connect to tmux: "+err.Error(), "tmux-list-sessions") + return evaldo.MakeBuiltinError(ps, "Failed to connect to tmux: "+err.Error(), "tmux-list-sessions") } sessions, err := tmux.ListSessions() if err != nil { - return MakeBuiltinError(ps, "Failed to list sessions: "+err.Error(), "tmux-list-sessions") + return evaldo.MakeBuiltinError(ps, "Failed to list sessions: "+err.Error(), "tmux-list-sessions") } items := make([]env.Object, len(sessions)) @@ -1995,18 +1996,18 @@ var Builtins_os = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { tmux, err := gotmux.DefaultTmux() if err != nil { - return MakeBuiltinError(ps, "Failed to connect to tmux: "+err.Error(), "tmux-get-session") + return evaldo.MakeBuiltinError(ps, "Failed to connect to tmux: "+err.Error(), "tmux-get-session") } switch name := arg0.(type) { case env.String: session, err := tmux.GetSessionByName(name.Value) if err != nil { - return MakeBuiltinError(ps, "Failed to get session: "+err.Error(), "tmux-get-session") + return evaldo.MakeBuiltinError(ps, "Failed to get session: "+err.Error(), "tmux-get-session") } return *env.NewNative(ps.Idx, session, "tmux-session") default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "tmux-get-session") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "tmux-get-session") } }, }, @@ -2025,13 +2026,13 @@ var Builtins_os = map[string]*env.Builtin{ if session, ok := sess.Value.(*gotmux.Session); ok { window, err := session.New() if err != nil { - return MakeBuiltinError(ps, "Failed to create window: "+err.Error(), "tmux-new-window") + return evaldo.MakeBuiltinError(ps, "Failed to create window: "+err.Error(), "tmux-new-window") } return *env.NewNative(ps.Idx, window, "tmux-window") } - return MakeBuiltinError(ps, "Expected tmux-session object", "tmux-new-window") + return evaldo.MakeBuiltinError(ps, "Expected tmux-session object", "tmux-new-window") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tmux-new-window") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tmux-new-window") } }, }, @@ -2055,16 +2056,16 @@ var Builtins_os = map[string]*env.Builtin{ WindowName: name.Value, }) if err != nil { - return MakeBuiltinError(ps, "Failed to create named window: "+err.Error(), "tmux-new-window-named") + return evaldo.MakeBuiltinError(ps, "Failed to create named window: "+err.Error(), "tmux-new-window-named") } return *env.NewNative(ps.Idx, window, "tmux-window") default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "tmux-new-window-named") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "tmux-new-window-named") } } - return MakeBuiltinError(ps, "Expected tmux-session object", "tmux-new-window-named") + return evaldo.MakeBuiltinError(ps, "Expected tmux-session object", "tmux-new-window-named") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tmux-new-window-named") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tmux-new-window-named") } }, }, @@ -2083,7 +2084,7 @@ var Builtins_os = map[string]*env.Builtin{ if session, ok := sess.Value.(*gotmux.Session); ok { windows, err := session.ListWindows() if err != nil { - return MakeBuiltinError(ps, "Failed to list windows: "+err.Error(), "tmux-list-windows") + return evaldo.MakeBuiltinError(ps, "Failed to list windows: "+err.Error(), "tmux-list-windows") } items := make([]env.Object, len(windows)) @@ -2092,9 +2093,9 @@ var Builtins_os = map[string]*env.Builtin{ } return *env.NewBlock(*env.NewTSeries(items)) } - return MakeBuiltinError(ps, "Expected tmux-session object", "tmux-list-windows") + return evaldo.MakeBuiltinError(ps, "Expected tmux-session object", "tmux-list-windows") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tmux-list-windows") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tmux-list-windows") } }, }, @@ -2116,16 +2117,16 @@ var Builtins_os = map[string]*env.Builtin{ case env.Integer: pane, err := window.GetPaneByIndex(int(idx.Value)) if err != nil { - return MakeBuiltinError(ps, "Failed to get pane: "+err.Error(), "tmux-get-pane") + return evaldo.MakeBuiltinError(ps, "Failed to get pane: "+err.Error(), "tmux-get-pane") } return *env.NewNative(ps.Idx, pane, "tmux-pane") default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "tmux-get-pane") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "tmux-get-pane") } } - return MakeBuiltinError(ps, "Expected tmux-window object", "tmux-get-pane") + return evaldo.MakeBuiltinError(ps, "Expected tmux-window object", "tmux-get-pane") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tmux-get-pane") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tmux-get-pane") } }, }, @@ -2144,13 +2145,13 @@ var Builtins_os = map[string]*env.Builtin{ if pane, ok := p.Value.(*gotmux.Pane); ok { err := pane.Split() if err != nil { - return MakeBuiltinError(ps, "Failed to split pane: "+err.Error(), "tmux-split-pane") + return evaldo.MakeBuiltinError(ps, "Failed to split pane: "+err.Error(), "tmux-split-pane") } return arg0 } - return MakeBuiltinError(ps, "Expected tmux-pane object", "tmux-split-pane") + return evaldo.MakeBuiltinError(ps, "Expected tmux-pane object", "tmux-split-pane") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tmux-split-pane") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tmux-split-pane") } }, }, @@ -2172,16 +2173,16 @@ var Builtins_os = map[string]*env.Builtin{ case env.String: err := pane.SendKeys(cmd.Value) if err != nil { - return MakeBuiltinError(ps, "Failed to send keys: "+err.Error(), "tmux-send-keys") + return evaldo.MakeBuiltinError(ps, "Failed to send keys: "+err.Error(), "tmux-send-keys") } return arg0 default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "tmux-send-keys") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "tmux-send-keys") } } - return MakeBuiltinError(ps, "Expected tmux-pane object", "tmux-send-keys") + return evaldo.MakeBuiltinError(ps, "Expected tmux-pane object", "tmux-send-keys") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tmux-send-keys") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tmux-send-keys") } }, }, @@ -2200,13 +2201,13 @@ var Builtins_os = map[string]*env.Builtin{ if session, ok := sess.Value.(*gotmux.Session); ok { err := session.Kill() if err != nil { - return MakeBuiltinError(ps, "Failed to kill session: "+err.Error(), "tmux-kill-session") + return evaldo.MakeBuiltinError(ps, "Failed to kill session: "+err.Error(), "tmux-kill-session") } return arg0 } - return MakeBuiltinError(ps, "Expected tmux-session object", "tmux-kill-session") + return evaldo.MakeBuiltinError(ps, "Expected tmux-session object", "tmux-kill-session") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tmux-kill-session") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tmux-kill-session") } }, }, @@ -2233,12 +2234,12 @@ var Builtins_os = map[string]*env.Builtin{ iface, err := net.InterfaceByName(name.Value) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "net-interface?") + return evaldo.MakeBuiltinError(ps, err.Error(), "net-interface?") } return *env.NewNative(ps.Idx, iface, "net-iface") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.StringType}, "net-interface?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "net-interface?") } }, }, @@ -2259,7 +2260,7 @@ var Builtins_os = map[string]*env.Builtin{ addrs, err := iface.Value.(*net.Interface).Addrs() if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "net-iface//Addrs?") + return evaldo.MakeBuiltinError(ps, err.Error(), "net-iface//Addrs?") } items := make([]env.Object, len(addrs)) for i, addr := range addrs { @@ -2268,7 +2269,7 @@ var Builtins_os = map[string]*env.Builtin{ return *env.NewBlock(*env.NewTSeries(items)) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "net-iface//Addrs?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "net-iface//Addrs?") } }, }, @@ -2290,12 +2291,12 @@ var Builtins_os = map[string]*env.Builtin{ ipnet, ok := addr.Value.(net.Addr).(*net.IPNet) if !ok { ps.FailureFlag = true - return MakeBuiltinError(ps, "Address is not an *net.IPNet.", "net-addr//IPNet?") + return evaldo.MakeBuiltinError(ps, "Address is not an *net.IPNet.", "net-addr//IPNet?") } return *env.NewNative(ps.Idx, ipnet, "net-ipnet") default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "net-addr//IPNet?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "net-addr//IPNet?") } }, }, @@ -2315,7 +2316,7 @@ var Builtins_os = map[string]*env.Builtin{ return *env.NewBoolean(ipnet.Value.(*net.IPNet).IP.IsLoopback()) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "net-ipnet//Loopback?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "net-ipnet//Loopback?") } }, }, @@ -2335,7 +2336,7 @@ var Builtins_os = map[string]*env.Builtin{ return *env.NewBoolean(ipnet.Value.(*net.IPNet).IP.To4() != nil) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "net-ipnet//IPv4?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "net-ipnet//IPv4?") } }, }, @@ -2355,7 +2356,7 @@ var Builtins_os = map[string]*env.Builtin{ return *env.NewString(ipnet.Value.(*net.IPNet).IP.String()) default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "net-ipnet//IP-string") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "net-ipnet//IP-string") } }, }, diff --git a/evaldo/builtins_os_not.go b/batteries/builtins_os_not.go similarity index 88% rename from evaldo/builtins_os_not.go rename to batteries/builtins_os_not.go index 80262f1d..13d7b720 100644 --- a/evaldo/builtins_os_not.go +++ b/batteries/builtins_os_not.go @@ -1,7 +1,7 @@ //go:build no_os || b_wasm // +build no_os b_wasm -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_persistent_contexts.go b/batteries/builtins_persistent_contexts.go similarity index 96% rename from evaldo/builtins_persistent_contexts.go rename to batteries/builtins_persistent_contexts.go index 7c1cc87a..5e386059 100644 --- a/evaldo/builtins_persistent_contexts.go +++ b/batteries/builtins_persistent_contexts.go @@ -1,10 +1,14 @@ -package evaldo +//go:build !no_persistent +// +build !no_persistent + +package batteries import ( "fmt" "github.com/dgraph-io/badger/v4" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/refaktor/rye/loader" ) @@ -337,7 +341,7 @@ type PersistentCtxEvaluator struct { originalEvalStep *env.ProgramState } -// EvalBlock evaluates the current series while intercepting persistence operations +// evaldo.EvalBlock evaluates the current series while intercepting persistence operations func (pce *PersistentCtxEvaluator) Eval() { // Use a custom evaluation loop that handles setwords and modwords specially for pce.ps.Ser.Pos() < pce.ps.Ser.Len() && !pce.ps.ErrorFlag && !pce.ps.ReturnFlag && !pce.ps.FailureFlag { @@ -354,7 +358,7 @@ func (pce *PersistentCtxEvaluator) Eval() { default: // For all other operations, put the object back and use normal evaluation pce.ps.Ser.SetPos(pce.ps.Ser.Pos() - 1) // Put object back - EvalExpression_DispatchType(pce.ps) + evaldo.EvalExpression_DispatchType(pce.ps) } if pce.ps.SkipFlag { @@ -367,7 +371,7 @@ func (pce *PersistentCtxEvaluator) Eval() { // handleSetword processes setwords to ensure persistence func (pce *PersistentCtxEvaluator) handleSetword(sw env.Setword) { // First evaluate the next expression to get the value to set - EvalExpression_DispatchType(pce.ps) + evaldo.EvalExpression_DispatchType(pce.ps) if pce.ps.ErrorFlag || pce.ps.FailureFlag { return } @@ -412,7 +416,7 @@ var builtins_persistent_contexts = map[string]*env.Builtin{ } return pctx default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "persistent-context") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "persistent-context") } }, }, diff --git a/batteries/builtins_persistent_contexts_not.go b/batteries/builtins_persistent_contexts_not.go new file mode 100644 index 00000000..1ee4c3c6 --- /dev/null +++ b/batteries/builtins_persistent_contexts_not.go @@ -0,0 +1,23 @@ +//go:build no_persistent +// +build no_persistent + +package batteries + +import ( + "github.com/refaktor/rye/env" +) + +// PersistentCtx is a stub for when the no_persistent build tag is active. +// Without badger, persistent contexts are unavailable. +type PersistentCtx struct { + env.RyeCtx +} + +func (pc PersistentCtx) Type() env.Type { + return env.PersistentContextType +} + +// EvalBlockInPersistentCtx is a no-op stub. +func EvalBlockInPersistentCtx(ps *env.ProgramState, pctx *PersistentCtx) {} + +var builtins_persistent_contexts = map[string]*env.Builtin{} diff --git a/evaldo/builtins_pipes.go b/batteries/builtins_pipes.go similarity index 80% rename from evaldo/builtins_pipes.go rename to batteries/builtins_pipes.go index 812b2000..157d6c45 100644 --- a/evaldo/builtins_pipes.go +++ b/batteries/builtins_pipes.go @@ -1,7 +1,7 @@ //go:build !no_pipes // +build !no_pipes -package evaldo +package batteries import ( "bufio" @@ -14,6 +14,7 @@ import ( "strings" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/refaktor/rye/util" "github.com/bitfield/script" @@ -39,7 +40,7 @@ var Builtins_pipes = map[string]*env.Builtin{ p := script.File(path.GetPath()) return *env.NewNative(ps.Idx, p, "script-pipe") default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "p-new-file") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "p-new-file") } }, }, @@ -58,7 +59,7 @@ var Builtins_pipes = map[string]*env.Builtin{ p := script.FindFiles(path.GetPath()) return *env.NewNative(ps.Idx, p, "script-pipe") default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "p-new-find-files") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "p-new-find-files") } }, }, @@ -81,7 +82,7 @@ var Builtins_pipes = map[string]*env.Builtin{ p := script.ListFiles(path.Value) return *env.NewNative(ps.Idx, p, "script-pipe") default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "p-new-list-files") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "p-new-list-files") } }, }, @@ -104,13 +105,13 @@ var Builtins_pipes = map[string]*env.Builtin{ case env.String: strs[i] = s.Value default: - return MakeBuiltinError(ps, "Block must contain only strings", "p-new-block") + return evaldo.MakeBuiltinError(ps, "Block must contain only strings", "p-new-block") } } p := script.Slice(strs) return *env.NewNative(ps.Idx, p, "script-pipe") default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "p-new-block") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "p-new-block") } }, }, @@ -131,7 +132,7 @@ var Builtins_pipes = map[string]*env.Builtin{ p := script.Echo(s.Value) return *env.NewNative(ps.Idx, p, "script-pipe") default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "p-new-echo") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "p-new-echo") } }, }, @@ -151,7 +152,7 @@ var Builtins_pipes = map[string]*env.Builtin{ p := script.IfExists(path.GetPath()) return *env.NewNative(ps.Idx, p, "script-pipe") default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "p-new-if-exists") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "p-new-if-exists") } }, }, @@ -171,7 +172,7 @@ var Builtins_pipes = map[string]*env.Builtin{ p := script.Exec(cmd.Value) return *env.NewNative(ps.Idx, p, "script-pipe") default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "p-new-exec") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "p-new-exec") } }, }, @@ -196,13 +197,13 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.Exec(cmd.Value) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "p-exec") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "p-exec") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-exec") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-exec") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-exec") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-exec") } }, }, @@ -227,13 +228,13 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.ExecForEach(cmd.Value) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "p-exec-for-each") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "p-exec-for-each") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-exec-for-each") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-exec-for-each") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-exec-for-each") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-exec-for-each") } }, }, @@ -255,14 +256,14 @@ var Builtins_pipes = map[string]*env.Builtin{ case *script.Pipe: str, err := pipe.String() if err != nil { - return MakeBuiltinError(ps, err.Error(), "p-string") + return evaldo.MakeBuiltinError(ps, err.Error(), "p-string") } return *env.NewString(str) default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-string") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-string") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-string") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-string") } }, }, @@ -286,17 +287,17 @@ var Builtins_pipes = map[string]*env.Builtin{ case env.Uri: i, err := pipe.WriteFile(path.GetPath()) if err != nil { - return MakeBuiltinError(ps, err.Error(), "p-write-file") + return evaldo.MakeBuiltinError(ps, err.Error(), "p-write-file") } return *env.NewInteger(i) default: - return MakeArgError(ps, 2, []env.Type{env.UriType}, "p-write-file") + return evaldo.MakeArgError(ps, 2, []env.Type{env.UriType}, "p-write-file") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-write-file") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-write-file") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-write-file") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-write-file") } }, }, @@ -317,14 +318,14 @@ var Builtins_pipes = map[string]*env.Builtin{ case *script.Pipe: i, err := pipe.Stdout() if err != nil { - return MakeBuiltinError(ps, err.Error(), "p-stdout") + return evaldo.MakeBuiltinError(ps, err.Error(), "p-stdout") } return *env.NewInteger(int64(i)) default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-stdout") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-stdout") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-stdout") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-stdout") } }, }, @@ -350,13 +351,13 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.First(int(n.Value)) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "p-first-n") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "p-first-n") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-first-n") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-first-n") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-first-n") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-first-n") } }, }, @@ -382,13 +383,13 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.Last(int(n.Value)) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "p-last-n") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "p-last-n") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-last-n") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-last-n") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-last-n") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-last-n") } }, }, @@ -411,10 +412,10 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.Dirname() return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-dirname") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-dirname") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-dirname") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-dirname") } }, }, @@ -437,10 +438,10 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.Basename() return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-basename") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-basename") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-basename") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-basename") } }, }, @@ -462,14 +463,14 @@ var Builtins_pipes = map[string]*env.Builtin{ case *script.Pipe: n, err := pipe.CountLines() if err != nil { - return MakeBuiltinError(ps, err.Error(), "p-count-lines") + return evaldo.MakeBuiltinError(ps, err.Error(), "p-count-lines") } return *env.NewInteger(int64(n)) default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-count-lines") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-count-lines") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-count-lines") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-count-lines") } }, }, @@ -484,14 +485,14 @@ var Builtins_pipes = map[string]*env.Builtin{ case *script.Pipe: n, err := pipe.CountCharacters() if err != nil { - return MakeBuiltinError(ps, err.Error(), "p-count-lines") + return evaldo.MakeBuiltinError(ps, err.Error(), "p-count-lines") } return *env.NewInteger(int64(n)) default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-count-lines") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-count-lines") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-count-lines") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-count-lines") } }, }, @@ -514,10 +515,10 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.Freq() return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-freq") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-freq") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-freq") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-freq") } }, }, @@ -543,13 +544,13 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.Column(int(n.Value)) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "p-column") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "p-column") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-column") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-column") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-column") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-column") } }, }, @@ -574,13 +575,13 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.JQ(jq.Value) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "p-jq") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "p-jq") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-jq") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-jq") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-jq") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-jq") } }, }, @@ -606,13 +607,13 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.Match(s.Value) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "p-match") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "p-match") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-match") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-match") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-match") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-match") } }, }, @@ -639,16 +640,16 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.MatchRegexp(regxp) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeNativeArgError(ps, 2, []string{"regexp"}, "p-match-regexp") + return evaldo.MakeNativeArgError(ps, 2, []string{"regexp"}, "p-match-regexp") } default: - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "p-match-regexp") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "p-match-regexp") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-match-regexp") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-match-regexp") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-match-regexp") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-match-regexp") } }, }, @@ -674,13 +675,13 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.Reject(s.Value) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "p-not-match") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "p-not-match") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-not-match") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-not-match") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-not-match") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-not-match") } }, }, @@ -707,16 +708,16 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.RejectRegexp(regxp) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeNativeArgError(ps, 2, []string{"regexp"}, "p-not-match-regexp") + return evaldo.MakeNativeArgError(ps, 2, []string{"regexp"}, "p-not-match-regexp") } default: - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "p-not-match-regexp") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "p-not-match-regexp") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-not-match-regexp") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-not-match-regexp") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-not-match-regexp") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-not-match-regexp") } }, }, @@ -745,16 +746,16 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.Replace(search.Value, replace.Value) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeArgError(ps, 3, []env.Type{env.StringType}, "p-replace") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "p-replace") } default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "p-replace") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "p-replace") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-replace") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-replace") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-replace") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-replace") } }, }, @@ -784,19 +785,19 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.ReplaceRegexp(searchRegexp, replace.Value) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeArgError(ps, 3, []env.Type{env.StringType}, "p-replace-regexp") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "p-replace-regexp") } default: - return MakeNativeArgError(ps, 2, []string{"regexp"}, "p-replace-regexp") + return evaldo.MakeNativeArgError(ps, 2, []string{"regexp"}, "p-replace-regexp") } default: - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "p-replace-regexp") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "p-replace-regexp") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-replace-regexp") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-replace-regexp") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-replace-regexp") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-replace-regexp") } }, }, @@ -818,7 +819,7 @@ var Builtins_pipes = map[string]*env.Builtin{ case *script.Pipe: lines, err := pipe.Slice() if err != nil { - return MakeBuiltinError(ps, err.Error(), "p-block") + return evaldo.MakeBuiltinError(ps, err.Error(), "p-block") } items := make([]env.Object, len(lines)) for i, line := range lines { @@ -826,10 +827,10 @@ var Builtins_pipes = map[string]*env.Builtin{ } return *env.NewBlock(*env.NewTSeries(items)) default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-block") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-block") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-block") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-block") } }, }, @@ -854,10 +855,10 @@ var Builtins_pipes = map[string]*env.Builtin{ } return env.Void{} default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-error") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-error") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-error") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-error") } }, }, @@ -878,14 +879,14 @@ var Builtins_pipes = map[string]*env.Builtin{ case *script.Pipe: sha256, err := pipe.SHA256Sum() if err != nil { - return MakeBuiltinError(ps, err.Error(), "pipes/sha256sum") + return evaldo.MakeBuiltinError(ps, err.Error(), "pipes/sha256sum") } return *env.NewString(sha256) default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "pipes/sha256sum") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "pipes/sha256sum") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "pipes/sha256sum") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "pipes/sha256sum") } }, }, @@ -907,10 +908,10 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.SHA256Sums() return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "pipes/sha256sums") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "pipes/sha256sums") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "pipes/sha256sums") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "pipes/sha256sums") } }, }, @@ -932,10 +933,10 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.DecodeBase64() return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "decodeBase64") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "decodeBase64") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "decodeBase64") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "decodeBase64") } }, }, @@ -957,10 +958,10 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.EncodeBase64() return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "encodeBase64") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "encodeBase64") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "encodeBase64") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "encodeBase64") } }, }, @@ -982,10 +983,10 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.Join() return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-join") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-join") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-join") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-join") } }, }, @@ -1007,10 +1008,10 @@ var Builtins_pipes = map[string]*env.Builtin{ status := pipe.ExitStatus() return *env.NewInteger(int64(status)) default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-exit-status") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-exit-status") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-exit-status") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-exit-status") } }, }, @@ -1047,10 +1048,10 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.Concat() return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-concat") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-concat") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-concat") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-concat") } }, }, @@ -1075,10 +1076,10 @@ var Builtins_pipes = map[string]*env.Builtin{ } return *env.NewInteger(0) default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-close") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-close") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-close") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-close") } }, }, @@ -1103,13 +1104,13 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.Get(s.Value) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "p-get") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "p-get") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-get") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-get") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-get") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-get") } }, }, @@ -1134,13 +1135,13 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := pipe.Post(s.Value) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "p-post") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "p-post") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-post") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-post") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-post") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-post") } }, }, @@ -1180,10 +1181,10 @@ var Builtins_pipes = map[string]*env.Builtin{ } return *env.NewInteger(0) default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-wait") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-wait") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-wait") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-wait") } }, }, @@ -1217,13 +1218,13 @@ var Builtins_pipes = map[string]*env.Builtin{ } return *env.NewInteger(writtenBytes) default: - return MakeArgError(ps, 2, []env.Type{env.StringType, env.UriType}, "p-append-to-file") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType, env.UriType}, "p-append-to-file") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-append-to-file") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-append-to-file") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-append-to-file") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-append-to-file") } }, }, @@ -1263,10 +1264,10 @@ var Builtins_pipes = map[string]*env.Builtin{ } return *env.NewInteger(0) default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-error") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-error") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-error") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-error") } }, }, @@ -1292,13 +1293,13 @@ var Builtins_pipes = map[string]*env.Builtin{ pipe.SetError(err) return *env.NewNative(ps.Idx, pipe, "script-pipe") default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "p-set-error") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "p-set-error") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-set-error") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-set-error") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-set-error") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-set-error") } }, }, @@ -1338,16 +1339,16 @@ var Builtins_pipes = map[string]*env.Builtin{ }) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeNativeArgError(ps, 2, []string{"regexp"}, "extract\\regexp") + return evaldo.MakeNativeArgError(ps, 2, []string{"regexp"}, "extract\\regexp") } default: - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "extract\\regexp") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "extract\\regexp") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "extract\\regexp") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "extract\\regexp") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "extract\\regexp") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "extract\\regexp") } }, }, @@ -1383,10 +1384,10 @@ var Builtins_pipes = map[string]*env.Builtin{ }) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "sort") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "sort") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "sort") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "sort") } }, }, @@ -1422,10 +1423,10 @@ var Builtins_pipes = map[string]*env.Builtin{ }) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "sort\\reverse") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "sort\\reverse") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "sort\\reverse") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "sort\\reverse") } }, }, @@ -1460,10 +1461,10 @@ var Builtins_pipes = map[string]*env.Builtin{ }) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "uniq") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "uniq") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "uniq") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "uniq") } }, }, @@ -1493,10 +1494,10 @@ var Builtins_pipes = map[string]*env.Builtin{ }) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "trim-lines") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "trim-lines") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "trim-lines") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "trim-lines") } }, }, @@ -1523,13 +1524,13 @@ var Builtins_pipes = map[string]*env.Builtin{ }) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "prefix-lines") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "prefix-lines") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "prefix-lines") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "prefix-lines") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "prefix-lines") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "prefix-lines") } }, }, @@ -1571,13 +1572,13 @@ var Builtins_pipes = map[string]*env.Builtin{ }) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "skip") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "skip") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "skip") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "skip") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "skip") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "skip") } }, }, @@ -1607,10 +1608,10 @@ var Builtins_pipes = map[string]*env.Builtin{ }) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "number-lines") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "number-lines") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "number-lines") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "number-lines") } }, }, @@ -1635,7 +1636,7 @@ var Builtins_pipes = map[string]*env.Builtin{ case env.String: lines, err := pipe.Slice() if err != nil { - return MakeBuiltinError(ps, err.Error(), "count-matches") + return evaldo.MakeBuiltinError(ps, err.Error(), "count-matches") } count := 0 for _, line := range lines { @@ -1645,13 +1646,13 @@ var Builtins_pipes = map[string]*env.Builtin{ } return *env.NewInteger(int64(count)) default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "count-matches") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "count-matches") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "count-matches") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "count-matches") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "count-matches") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "count-matches") } }, }, @@ -1697,16 +1698,16 @@ var Builtins_pipes = map[string]*env.Builtin{ }) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeArgError(ps, 3, []env.Type{env.StringType}, "between") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "between") } default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "between") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "between") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "between") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "between") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "between") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "between") } }, }, @@ -1734,25 +1735,25 @@ var Builtins_pipes = map[string]*env.Builtin{ case env.Uri: file, err := os.Create(path.GetPath()) if err != nil { - return MakeBuiltinError(ps, err.Error(), "tee\\file") + return evaldo.MakeBuiltinError(ps, err.Error(), "tee\\file") } newPipe := pipe.Tee(file) return *env.NewNative(ps.Idx, newPipe, "script-pipe") case env.String: file, err := os.Create(path.Value) if err != nil { - return MakeBuiltinError(ps, err.Error(), "tee\\file") + return evaldo.MakeBuiltinError(ps, err.Error(), "tee\\file") } newPipe := pipe.Tee(file) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeArgError(ps, 2, []env.Type{env.UriType, env.StringType}, "tee\\file") + return evaldo.MakeArgError(ps, 2, []env.Type{env.UriType, env.StringType}, "tee\\file") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "tee\\file") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "tee\\file") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tee\\file") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tee\\file") } }, }, @@ -1782,7 +1783,7 @@ var Builtins_pipes = map[string]*env.Builtin{ // Eager evaluation: collect all lines lines, err := pipe.Slice() if err != nil { - return MakeBuiltinError(ps, err.Error(), "map-each") + return evaldo.MakeBuiltinError(ps, err.Error(), "map-each") } // Process each line through the Rye block @@ -1791,10 +1792,10 @@ var Builtins_pipes = map[string]*env.Builtin{ for _, line := range lines { ps.Ser = block.Series ps.Ser.SetPos(0) - EvalBlockInj(ps, *env.NewString(line), true) + evaldo.EvalBlockInj(ps, *env.NewString(line), true) if ps.ErrorFlag { ps.Ser = ser - return MakeBuiltinError(ps, "Error during evaluation of block", "map-each") + return evaldo.MakeBuiltinError(ps, "Error during evaluation of block", "map-each") } if ps.FailureFlag { ps.Ser = ser @@ -1815,13 +1816,13 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := script.Slice(result) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "map-each") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "map-each") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "map-each") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "map-each") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "map-each") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "map-each") } }, }, @@ -1847,7 +1848,7 @@ var Builtins_pipes = map[string]*env.Builtin{ // Eager evaluation: collect all lines lines, err := pipe.Slice() if err != nil { - return MakeBuiltinError(ps, err.Error(), "filter-each") + return evaldo.MakeBuiltinError(ps, err.Error(), "filter-each") } // Filter each line through the Rye block @@ -1856,10 +1857,10 @@ var Builtins_pipes = map[string]*env.Builtin{ for _, line := range lines { ps.Ser = block.Series ps.Ser.SetPos(0) - EvalBlockInj(ps, *env.NewString(line), true) + evaldo.EvalBlockInj(ps, *env.NewString(line), true) if ps.ErrorFlag { ps.Ser = ser - return MakeBuiltinError(ps, "Error during evaluation of block", "filter-each") + return evaldo.MakeBuiltinError(ps, "Error during evaluation of block", "filter-each") } if ps.FailureFlag { ps.Ser = ser @@ -1876,13 +1877,13 @@ var Builtins_pipes = map[string]*env.Builtin{ newPipe := script.Slice(result) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "filter-each") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "filter-each") } default: - return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "filter-each") + return evaldo.MakeNativeArgError(ps, 1, []string{"script-pipe"}, "filter-each") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "filter-each") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "filter-each") } }, }, diff --git a/evaldo/builtins_pipes_not.go b/batteries/builtins_pipes_not.go similarity index 87% rename from evaldo/builtins_pipes_not.go rename to batteries/builtins_pipes_not.go index a00edd3b..82bc1934 100644 --- a/evaldo/builtins_pipes_not.go +++ b/batteries/builtins_pipes_not.go @@ -1,7 +1,7 @@ //go:build no_pipes // +build no_pipes -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_prometheus.go b/batteries/builtins_prometheus.go similarity index 75% rename from evaldo/builtins_prometheus.go rename to batteries/builtins_prometheus.go index bd71a669..983b2cda 100644 --- a/evaldo/builtins_prometheus.go +++ b/batteries/builtins_prometheus.go @@ -1,7 +1,7 @@ //go:build !no_prometheus // +build !no_prometheus -package evaldo +package batteries import ( "fmt" @@ -10,6 +10,7 @@ import ( "sync" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" @@ -32,11 +33,11 @@ func __prometheus_new_counter(ps *env.ProgramState, arg0 env.Object, arg1 env.Ob case env.String: constLabels[k] = val.Value default: - return MakeBuiltinError(ps, "Label values must be strings", "prometheus//new-counter") + return evaldo.MakeBuiltinError(ps, "Label values must be strings", "prometheus//new-counter") } } default: - return MakeArgError(ps, 3, []env.Type{env.DictType}, "prometheus//new-counter") + return evaldo.MakeArgError(ps, 3, []env.Type{env.DictType}, "prometheus//new-counter") } } @@ -49,15 +50,15 @@ func __prometheus_new_counter(ps *env.ProgramState, arg0 env.Object, arg1 env.Ob // Register the counter err := prometheus.Register(counter) if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Failed to register counter: %v", err), "prometheus//new-counter") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to register counter: %v", err), "prometheus//new-counter") } return *env.NewNative(ps.Idx, counter, "prometheus-counter") default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "prometheus//new-counter") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "prometheus//new-counter") } default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "prometheus//new-counter") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "prometheus//new-counter") } } @@ -66,13 +67,13 @@ func __prometheus_counter_inc(ps *env.ProgramState, arg0 env.Object, arg1 env.Ob switch counter := arg0.(type) { case env.Native: if ps.Idx.GetWord(counter.Kind.Index) != "prometheus-counter" { - return MakeBuiltinError(ps, "Expected a prometheus-counter", "prometheus-counter//inc") + return evaldo.MakeBuiltinError(ps, "Expected a prometheus-counter", "prometheus-counter//inc") } counter.Value.(prometheus.Counter).Inc() return arg0 default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-counter//inc") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-counter//inc") } } @@ -81,7 +82,7 @@ func __prometheus_counter_add(ps *env.ProgramState, arg0 env.Object, arg1 env.Ob switch counter := arg0.(type) { case env.Native: if ps.Idx.GetWord(counter.Kind.Index) != "prometheus-counter" { - return MakeBuiltinError(ps, "Expected a prometheus-counter", "prometheus-counter//add") + return evaldo.MakeBuiltinError(ps, "Expected a prometheus-counter", "prometheus-counter//add") } switch value := arg1.(type) { @@ -92,10 +93,10 @@ func __prometheus_counter_add(ps *env.ProgramState, arg0 env.Object, arg1 env.Ob counter.Value.(prometheus.Counter).Add(value.Value) return arg0 default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "prometheus-counter//add") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "prometheus-counter//add") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-counter//add") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-counter//add") } } @@ -116,11 +117,11 @@ func __prometheus_new_gauge(ps *env.ProgramState, arg0 env.Object, arg1 env.Obje case env.String: constLabels[k] = val.Value default: - return MakeBuiltinError(ps, "Label values must be strings", "prometheus//new-gauge") + return evaldo.MakeBuiltinError(ps, "Label values must be strings", "prometheus//new-gauge") } } default: - return MakeArgError(ps, 3, []env.Type{env.DictType}, "prometheus//new-gauge") + return evaldo.MakeArgError(ps, 3, []env.Type{env.DictType}, "prometheus//new-gauge") } } @@ -133,15 +134,15 @@ func __prometheus_new_gauge(ps *env.ProgramState, arg0 env.Object, arg1 env.Obje // Register the gauge err := prometheus.Register(gauge) if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Failed to register gauge: %v", err), "prometheus//new-gauge") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to register gauge: %v", err), "prometheus//new-gauge") } return *env.NewNative(ps.Idx, gauge, "prometheus-gauge") default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "prometheus//new-gauge") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "prometheus//new-gauge") } default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "prometheus//new-gauge") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "prometheus//new-gauge") } } @@ -150,7 +151,7 @@ func __prometheus_gauge_set(ps *env.ProgramState, arg0 env.Object, arg1 env.Obje switch gauge := arg0.(type) { case env.Native: if ps.Idx.GetWord(gauge.Kind.Index) != "prometheus-gauge" { - return MakeBuiltinError(ps, "Expected a prometheus-gauge", "prometheus-gauge//set") + return evaldo.MakeBuiltinError(ps, "Expected a prometheus-gauge", "prometheus-gauge//set") } switch value := arg1.(type) { @@ -161,10 +162,10 @@ func __prometheus_gauge_set(ps *env.ProgramState, arg0 env.Object, arg1 env.Obje gauge.Value.(prometheus.Gauge).Set(value.Value) return arg0 default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "prometheus-gauge//set") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "prometheus-gauge//set") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-gauge//set") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-gauge//set") } } @@ -173,13 +174,13 @@ func __prometheus_gauge_inc(ps *env.ProgramState, arg0 env.Object, arg1 env.Obje switch gauge := arg0.(type) { case env.Native: if ps.Idx.GetWord(gauge.Kind.Index) != "prometheus-gauge" { - return MakeBuiltinError(ps, "Expected a prometheus-gauge", "prometheus-gauge//inc") + return evaldo.MakeBuiltinError(ps, "Expected a prometheus-gauge", "prometheus-gauge//inc") } gauge.Value.(prometheus.Gauge).Inc() return arg0 default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-gauge//inc") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-gauge//inc") } } @@ -188,13 +189,13 @@ func __prometheus_gauge_dec(ps *env.ProgramState, arg0 env.Object, arg1 env.Obje switch gauge := arg0.(type) { case env.Native: if ps.Idx.GetWord(gauge.Kind.Index) != "prometheus-gauge" { - return MakeBuiltinError(ps, "Expected a prometheus-gauge", "prometheus-gauge//dec") + return evaldo.MakeBuiltinError(ps, "Expected a prometheus-gauge", "prometheus-gauge//dec") } gauge.Value.(prometheus.Gauge).Dec() return arg0 default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-gauge//dec") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-gauge//dec") } } @@ -203,7 +204,7 @@ func __prometheus_gauge_add(ps *env.ProgramState, arg0 env.Object, arg1 env.Obje switch gauge := arg0.(type) { case env.Native: if ps.Idx.GetWord(gauge.Kind.Index) != "prometheus-gauge" { - return MakeBuiltinError(ps, "Expected a prometheus-gauge", "prometheus-gauge//add") + return evaldo.MakeBuiltinError(ps, "Expected a prometheus-gauge", "prometheus-gauge//add") } switch value := arg1.(type) { @@ -214,10 +215,10 @@ func __prometheus_gauge_add(ps *env.ProgramState, arg0 env.Object, arg1 env.Obje gauge.Value.(prometheus.Gauge).Add(value.Value) return arg0 default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "prometheus-gauge//add") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "prometheus-gauge//add") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-gauge//add") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-gauge//add") } } @@ -226,7 +227,7 @@ func __prometheus_gauge_sub(ps *env.ProgramState, arg0 env.Object, arg1 env.Obje switch gauge := arg0.(type) { case env.Native: if ps.Idx.GetWord(gauge.Kind.Index) != "prometheus-gauge" { - return MakeBuiltinError(ps, "Expected a prometheus-gauge", "prometheus-gauge//sub") + return evaldo.MakeBuiltinError(ps, "Expected a prometheus-gauge", "prometheus-gauge//sub") } switch value := arg1.(type) { @@ -237,10 +238,10 @@ func __prometheus_gauge_sub(ps *env.ProgramState, arg0 env.Object, arg1 env.Obje gauge.Value.(prometheus.Gauge).Sub(value.Value) return arg0 default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "prometheus-gauge//sub") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "prometheus-gauge//sub") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-gauge//sub") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-gauge//sub") } } @@ -263,11 +264,11 @@ func __prometheus_new_histogram(ps *env.ProgramState, arg0 env.Object, arg1 env. case env.Decimal: buckets[i] = val.Value default: - return MakeBuiltinError(ps, "Bucket values must be numbers", "prometheus//new-histogram") + return evaldo.MakeBuiltinError(ps, "Bucket values must be numbers", "prometheus//new-histogram") } } default: - return MakeArgError(ps, 3, []env.Type{env.BlockType}, "prometheus//new-histogram") + return evaldo.MakeArgError(ps, 3, []env.Type{env.BlockType}, "prometheus//new-histogram") } } @@ -282,11 +283,11 @@ func __prometheus_new_histogram(ps *env.ProgramState, arg0 env.Object, arg1 env. case env.String: constLabels[k] = val.Value default: - return MakeBuiltinError(ps, "Label values must be strings", "prometheus//new-histogram") + return evaldo.MakeBuiltinError(ps, "Label values must be strings", "prometheus//new-histogram") } } default: - return MakeArgError(ps, 4, []env.Type{env.DictType}, "prometheus//new-histogram") + return evaldo.MakeArgError(ps, 4, []env.Type{env.DictType}, "prometheus//new-histogram") } } @@ -309,15 +310,15 @@ func __prometheus_new_histogram(ps *env.ProgramState, arg0 env.Object, arg1 env. // Register the histogram err := prometheus.Register(histogram) if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Failed to register histogram: %v", err), "prometheus//new-histogram") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to register histogram: %v", err), "prometheus//new-histogram") } return *env.NewNative(ps.Idx, histogram, "prometheus-histogram") default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "prometheus//new-histogram") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "prometheus//new-histogram") } default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "prometheus//new-histogram") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "prometheus//new-histogram") } } @@ -326,7 +327,7 @@ func __prometheus_histogram_observe(ps *env.ProgramState, arg0 env.Object, arg1 switch histogram := arg0.(type) { case env.Native: if ps.Idx.GetWord(histogram.Kind.Index) != "prometheus-histogram" { - return MakeBuiltinError(ps, "Expected a prometheus-histogram", "prometheus-histogram//observe") + return evaldo.MakeBuiltinError(ps, "Expected a prometheus-histogram", "prometheus-histogram//observe") } switch value := arg1.(type) { @@ -337,10 +338,10 @@ func __prometheus_histogram_observe(ps *env.ProgramState, arg0 env.Object, arg1 histogram.Value.(prometheus.Histogram).Observe(value.Value) return arg0 default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "prometheus-histogram//observe") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "prometheus-histogram//observe") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-histogram//observe") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-histogram//observe") } } @@ -365,7 +366,7 @@ func __prometheus_new_summary(ps *env.ProgramState, arg0 env.Object, arg1 env.Ob if q, err := strconv.ParseFloat(quantileStr, 64); err == nil { quantile = q } else { - return MakeBuiltinError(ps, "Quantile must be a valid float64", "prometheus//new-summary") + return evaldo.MakeBuiltinError(ps, "Quantile must be a valid float64", "prometheus//new-summary") } // Try to parse the value as a float64 (error) @@ -375,13 +376,13 @@ func __prometheus_new_summary(ps *env.ProgramState, arg0 env.Object, arg1 env.Ob case env.Decimal: error = val.Value default: - return MakeBuiltinError(ps, "Error values must be numbers", "prometheus//new-summary") + return evaldo.MakeBuiltinError(ps, "Error values must be numbers", "prometheus//new-summary") } objectives[quantile] = error } default: - return MakeArgError(ps, 3, []env.Type{env.DictType}, "prometheus//new-summary") + return evaldo.MakeArgError(ps, 3, []env.Type{env.DictType}, "prometheus//new-summary") } } @@ -396,11 +397,11 @@ func __prometheus_new_summary(ps *env.ProgramState, arg0 env.Object, arg1 env.Ob case env.String: constLabels[k] = val.Value default: - return MakeBuiltinError(ps, "Label values must be strings", "prometheus//new-summary") + return evaldo.MakeBuiltinError(ps, "Label values must be strings", "prometheus//new-summary") } } default: - return MakeArgError(ps, 4, []env.Type{env.DictType}, "prometheus//new-summary") + return evaldo.MakeArgError(ps, 4, []env.Type{env.DictType}, "prometheus//new-summary") } } @@ -423,15 +424,15 @@ func __prometheus_new_summary(ps *env.ProgramState, arg0 env.Object, arg1 env.Ob // Register the summary err := prometheus.Register(summary) if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Failed to register summary: %v", err), "prometheus//new-summary") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to register summary: %v", err), "prometheus//new-summary") } return *env.NewNative(ps.Idx, summary, "prometheus-summary") default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "prometheus//new-summary") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "prometheus//new-summary") } default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "prometheus//new-summary") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "prometheus//new-summary") } } @@ -440,7 +441,7 @@ func __prometheus_summary_observe(ps *env.ProgramState, arg0 env.Object, arg1 en switch summary := arg0.(type) { case env.Native: if ps.Idx.GetWord(summary.Kind.Index) != "prometheus-summary" { - return MakeBuiltinError(ps, "Expected a prometheus-summary", "prometheus-summary//observe") + return evaldo.MakeBuiltinError(ps, "Expected a prometheus-summary", "prometheus-summary//observe") } switch value := arg1.(type) { @@ -451,10 +452,10 @@ func __prometheus_summary_observe(ps *env.ProgramState, arg0 env.Object, arg1 en summary.Value.(prometheus.Summary).Observe(value.Value) return arg0 default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "prometheus-summary//observe") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "prometheus-summary//observe") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-summary//observe") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-summary//observe") } } @@ -468,7 +469,7 @@ func __prometheus_must_register(ps *env.ProgramState, arg0 env.Object, arg1 env. kindName != "prometheus-gauge" && kindName != "prometheus-histogram" && kindName != "prometheus-summary" { - return MakeBuiltinError(ps, "Expected a Prometheus collector", "prometheus//must-register") + return evaldo.MakeBuiltinError(ps, "Expected a Prometheus collector", "prometheus//must-register") } // Use MustRegister to register the collector @@ -476,7 +477,7 @@ func __prometheus_must_register(ps *env.ProgramState, arg0 env.Object, arg1 env. prometheus.MustRegister(collector.Value.(prometheus.Collector)) return arg0 default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus//must-register") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus//must-register") } } @@ -503,7 +504,7 @@ func __prometheus_start_http_server(ps *env.ProgramState, arg0 env.Object, arg1 return *env.NewInteger(1) default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "prometheus//start-http-server") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "prometheus//start-http-server") } } @@ -518,13 +519,13 @@ func __prometheus_mutex_lock(ps *env.ProgramState, arg0 env.Object, arg1 env.Obj switch mutex := arg0.(type) { case env.Native: if ps.Idx.GetWord(mutex.Kind.Index) != "prometheus-mutex" { - return MakeBuiltinError(ps, "Expected a prometheus-mutex", "prometheus-mutex//lock") + return evaldo.MakeBuiltinError(ps, "Expected a prometheus-mutex", "prometheus-mutex//lock") } mutex.Value.(*sync.Mutex).Lock() return arg0 default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-mutex//lock") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-mutex//lock") } } @@ -533,13 +534,13 @@ func __prometheus_mutex_unlock(ps *env.ProgramState, arg0 env.Object, arg1 env.O switch mutex := arg0.(type) { case env.Native: if ps.Idx.GetWord(mutex.Kind.Index) != "prometheus-mutex" { - return MakeBuiltinError(ps, "Expected a prometheus-mutex", "prometheus-mutex//unlock") + return evaldo.MakeBuiltinError(ps, "Expected a prometheus-mutex", "prometheus-mutex//unlock") } mutex.Value.(*sync.Mutex).Unlock() return arg0 default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-mutex//unlock") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "prometheus-mutex//unlock") } } diff --git a/evaldo/builtins_prometheus_not.go b/batteries/builtins_prometheus_not.go similarity index 71% rename from evaldo/builtins_prometheus_not.go rename to batteries/builtins_prometheus_not.go index 50f1bcbd..0abbc79c 100644 --- a/evaldo/builtins_prometheus_not.go +++ b/batteries/builtins_prometheus_not.go @@ -1,10 +1,11 @@ //go:build no_prometheus // +build no_prometheus -package evaldo +package batteries import ( "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" ) // Builtins_prometheus is a placeholder map when Prometheus support is not enabled @@ -13,7 +14,7 @@ var Builtins_prometheus = map[string]*env.Builtin{ Argsn: 0, Doc: "Placeholder function when Prometheus support is not enabled", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { - return MakeBuiltinError(ps, "Prometheus support is not enabled. Rebuild Rye with -tags prometheus", "prometheus-not-enabled") + return evaldo.MakeBuiltinError(ps, "Prometheus support is not enabled. Rebuild Rye with -tags prometheus", "prometheus-not-enabled") }, }, } diff --git a/evaldo/builtins_psql.go b/batteries/builtins_psql.go old mode 100755 new mode 100644 similarity index 80% rename from evaldo/builtins_psql.go rename to batteries/builtins_psql.go index 38c8546e..bd6f53a9 --- a/evaldo/builtins_psql.go +++ b/batteries/builtins_psql.go @@ -1,13 +1,14 @@ //go:build !no_psql // +build !no_psql -package evaldo +package batteries import ( "database/sql" "fmt" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" _ "github.com/lib/pq" ) @@ -32,15 +33,15 @@ var Builtins_psql = map[string]*env.Builtin{ case env.Uri: db, err := sql.Open("postgres", "postgresql://"+str.Path) // TODO -- we need to make path parser in URI then this will be path if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Error opening PostgreSQL: %v", err.Error()), "postgres-uri//Open") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Error opening PostgreSQL: %v", err.Error()), "postgres-uri//Open") } // sql.Open doesn't actually connect, we need to ping to verify the connection if err := db.Ping(); err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Error connecting to PostgreSQL: %v", err.Error()), "postgres-uri//Open") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Error connecting to PostgreSQL: %v", err.Error()), "postgres-uri//Open") } return *env.NewNative(ps.Idx, db, "Rye-psql") default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "postgres-uri//Open") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "postgres-uri//Open") } }, @@ -76,7 +77,7 @@ var Builtins_psql = map[string]*env.Builtin{ sqlstr = str.Value default: ps.ErrorFlag = true - return MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-psql//Exec") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-psql//Exec") } if sqlstr != "" { //fmt.Println(sqlstr) @@ -92,15 +93,15 @@ var Builtins_psql = map[string]*env.Builtin{ // if num > 0 { // } else { // ps.FailureFlag = true - // return MakeBuiltinError(ps, "No rows affected.", "Rye-psql//Exec") + // return evaldo.MakeBuiltinError(ps, "No rows affected.", "Rye-psql//Exec") // } } } else { - return MakeBuiltinError(ps, "Sql string is empty.", "Rye-psql//Exec") + return evaldo.MakeBuiltinError(ps, "Sql string is empty.", "Rye-psql//Exec") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-psql//Exec") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-psql//Exec") } }, }, @@ -135,7 +136,7 @@ var Builtins_psql = map[string]*env.Builtin{ sqlstr = str.Value default: ps.ErrorFlag = true - return MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-psql//Query") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-psql//Query") } if sqlstr != "" { // fmt.Println(sqlstr) @@ -144,7 +145,7 @@ var Builtins_psql = map[string]*env.Builtin{ // result := make([]map[string]any, 0) if err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, err.Error(), "Rye-psql//Query") + return evaldo.MakeBuiltinError(ps, err.Error(), "Rye-psql//Query") } else { cols, _ := rows.Columns() spr := env.NewTable(cols) @@ -162,7 +163,7 @@ var Builtins_psql = map[string]*env.Builtin{ // Scan the result into the column pointers... if err := rows.Scan(columnPointers...); err != nil { ps.FailureFlag = true - return MakeBuiltinError(ps, "Error scanning row: "+err.Error(), "Rye-psql//Query") + return evaldo.MakeBuiltinError(ps, "Error scanning row: "+err.Error(), "Rye-psql//Query") } // Create our map, and retrieve the value for each column from the pointers slice, @@ -190,17 +191,17 @@ var Builtins_psql = map[string]*env.Builtin{ // fmt.Print(result) if i == 0 { ps.FailureFlag = true - return MakeBuiltinError(ps, "No data.", "Rye-psql//Query") + return evaldo.MakeBuiltinError(ps, "No data.", "Rye-psql//Query") } return *spr //return *env.NewNative(ps.Idx, *spr, "Rye-table") } } else { - return MakeBuiltinError(ps, "Empty SQL.", "Rye-psql//Query") + return evaldo.MakeBuiltinError(ps, "Empty SQL.", "Rye-psql//Query") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-psql//Query") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-psql//Query") } }, }, @@ -235,7 +236,7 @@ var Builtins_psql = map[string]*env.Builtin{ sqlstr = str.Value default: ps.ErrorFlag = true - return MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-psql//Show-SQL") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-psql//Show-SQL") } if sqlstr != "" { // If there are parameters, show them as comments @@ -251,10 +252,10 @@ var Builtins_psql = map[string]*env.Builtin{ } return *env.NewString(sqlstr) } else { - return MakeBuiltinError(ps, "Empty SQL.", "Rye-psql//Show-SQL") + return evaldo.MakeBuiltinError(ps, "Empty SQL.", "Rye-psql//Show-SQL") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-psql//Show-SQL") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-psql//Show-SQL") } }, }, @@ -273,19 +274,19 @@ var Builtins_psql = map[string]*env.Builtin{ case env.Native: psqlKind, _ := ps.Idx.GetIndex("Rye-psql") if db.Kind.Index != psqlKind { - return MakeBuiltinError(ps, "Expected PostgreSQL database connection.", "Rye-psql//Close") + return evaldo.MakeBuiltinError(ps, "Expected PostgreSQL database connection.", "Rye-psql//Close") } sqlDB, ok := db.Value.(*sql.DB) if !ok { - return MakeBuiltinError(ps, "Invalid database connection.", "Rye-psql//Close") + return evaldo.MakeBuiltinError(ps, "Invalid database connection.", "Rye-psql//Close") } err := sqlDB.Close() if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Error closing database: %v", err.Error()), "Rye-psql//Close") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Error closing database: %v", err.Error()), "Rye-psql//Close") } return *env.NewInteger(1) default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-psql//Close") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-psql//Close") } }, }, diff --git a/evaldo/builtins_psql_not.go b/batteries/builtins_psql_not.go similarity index 87% rename from evaldo/builtins_psql_not.go rename to batteries/builtins_psql_not.go index c744a8d7..311f722b 100644 --- a/evaldo/builtins_psql_not.go +++ b/batteries/builtins_psql_not.go @@ -1,7 +1,7 @@ //go:build no_psql // +build no_psql -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_regexp.go b/batteries/builtins_regexp.go old mode 100755 new mode 100644 similarity index 81% rename from evaldo/builtins_regexp.go rename to batteries/builtins_regexp.go index 4f92ac1c..773304d4 --- a/evaldo/builtins_regexp.go +++ b/batteries/builtins_regexp.go @@ -1,9 +1,10 @@ -package evaldo +package batteries import ( "regexp" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" ) var Builtins_regexp = map[string]*env.Builtin{ @@ -26,11 +27,11 @@ var Builtins_regexp = map[string]*env.Builtin{ case env.String: val, err := regexp.Compile(s.Value) if err != nil { - return MakeError(ps, err.Error()) + return evaldo.MakeError(ps, err.Error()) } return *env.NewNative(ps.Idx, val, "regexp") default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "regexp") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "regexp") } }, }, @@ -44,11 +45,11 @@ var Builtins_regexp = map[string]*env.Builtin{ case env.String: val, err := regexp.Compile(s.Value) if err != nil { - return MakeError(ps, err.Error()) + return evaldo.MakeError(ps, err.Error()) } return *env.NewNative(ps.Idx, val, "regexp") default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "regexp") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "regexp") } }, }, @@ -76,10 +77,10 @@ var Builtins_regexp = map[string]*env.Builtin{ return *env.NewBoolean(false) } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "regexp//Is-match") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "regexp//Is-match") } default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "regexp//Is-match") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "regexp//Is-match") } }, }, @@ -103,13 +104,13 @@ var Builtins_regexp = map[string]*env.Builtin{ if len(res) > 1 { return *env.NewString(res[1]) } else { - return MakeBuiltinError(ps, "No submatch.", "regexp//Submatch?") + return evaldo.MakeBuiltinError(ps, "No submatch.", "regexp//Submatch?") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "regexp//Submatch?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "regexp//Submatch?") } default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "regexp//Submatch?") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "regexp//Submatch?") } }, }, @@ -139,12 +140,12 @@ var Builtins_regexp = map[string]*env.Builtin{ } return *env.NewBlock(*env.NewTSeries(col1)) } - return MakeBuiltinError(env1, "No results", "Submatches?") + return evaldo.MakeBuiltinError(env1, "No results", "Submatches?") default: - return MakeError(env1, "Arg2 not Native") + return evaldo.MakeError(env1, "Arg2 not Native") } default: - return MakeError(env1, "Arg1 not String") + return evaldo.MakeError(env1, "Arg1 not String") } }, }, @@ -178,12 +179,12 @@ var Builtins_regexp = map[string]*env.Builtin{ } return *env.NewBlock(*env.NewTSeries(blks)) } - return MakeBuiltinError(env1, "No results", "Submatches?") + return evaldo.MakeBuiltinError(env1, "No results", "Submatches?") default: - return MakeError(env1, "Arg2 not Native") + return evaldo.MakeError(env1, "Arg2 not Native") } default: - return MakeError(env1, "Arg1 not String") + return evaldo.MakeError(env1, "Arg1 not String") } }, }, @@ -211,12 +212,12 @@ var Builtins_regexp = map[string]*env.Builtin{ } return *env.NewBlock(*env.NewTSeries(col1)) } - return MakeBuiltinError(env1, "No results", "Find-all") + return evaldo.MakeBuiltinError(env1, "No results", "Find-all") default: - return MakeError(env1, "Arg2 not Native") + return evaldo.MakeError(env1, "Arg2 not Native") } default: - return MakeError(env1, "Arg1 not String") + return evaldo.MakeError(env1, "Arg1 not String") } }, }, @@ -240,12 +241,12 @@ var Builtins_regexp = map[string]*env.Builtin{ if len(res) > 0 { return *env.NewString(res) } - return MakeBuiltinError(ps, "No result", "Match?") + return evaldo.MakeBuiltinError(ps, "No result", "Match?") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "regexp//Match?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "regexp//Match?") } default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "regexp//Match?") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "regexp//Match?") } }, }, @@ -271,13 +272,13 @@ var Builtins_regexp = map[string]*env.Builtin{ res := re.Value.(*regexp.Regexp).ReplaceAllString(val.Value, replac.Value) return *env.NewString(res) default: - return MakeArgError(ps, 3, []env.Type{env.StringType}, "regexp//Replace-all") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "regexp//Replace-all") } default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "regexp//Replace-all") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "regexp//Replace-all") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "regexp//Replace-all") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "regexp//Replace-all") } }, }, diff --git a/evaldo/builtins_smtpd.go b/batteries/builtins_smtpd.go old mode 100755 new mode 100644 similarity index 89% rename from evaldo/builtins_smtpd.go rename to batteries/builtins_smtpd.go index 5c54163d..d56cf217 --- a/evaldo/builtins_smtpd.go +++ b/batteries/builtins_smtpd.go @@ -1,7 +1,7 @@ //go:build !no_smtpd // +build !no_smtpd -package evaldo +package batteries import ( "bytes" @@ -9,6 +9,7 @@ import ( "net" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/jinzhu/copier" "github.com/mhale/smtpd" @@ -79,7 +80,7 @@ var Builtins_smtpd = map[string]*env.Builtin{ // - from: sender email address string // - to: list of recipient email addresses // - origin: network address of sender - CallFunctionArgs4(handler, ps, + evaldo.CallFunctionArgs4(handler, ps, *env.NewNative(ps.Idx, bytes.NewReader(data), "reader"), env.NewString(from), *env.NewList(lstTo), @@ -87,17 +88,17 @@ var Builtins_smtpd = map[string]*env.Builtin{ return nil }, name.Value, "") if err != nil { - return makeError(ps, err.Error()) + return evaldo.MakeError(ps, err.Error()) } return arg0 default: - return MakeArgError(ps, 3, []env.Type{env.StringType}, "smtpd//serve") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "smtpd//serve") } default: - return MakeArgError(ps, 2, []env.Type{env.FunctionType}, "smtpd//serve") + return evaldo.MakeArgError(ps, 2, []env.Type{env.FunctionType}, "smtpd//serve") } default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "smtpd//serve") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "smtpd//serve") } }, }, diff --git a/evaldo/builtins_smtpd_not.go b/batteries/builtins_smtpd_not.go old mode 100755 new mode 100644 similarity index 87% rename from evaldo/builtins_smtpd_not.go rename to batteries/builtins_smtpd_not.go index d8480600..e8b22e57 --- a/evaldo/builtins_smtpd_not.go +++ b/batteries/builtins_smtpd_not.go @@ -1,7 +1,7 @@ //go:build no_smtpd // +build no_smtpd -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_sql.go b/batteries/builtins_sql.go similarity index 99% rename from evaldo/builtins_sql.go rename to batteries/builtins_sql.go index 979e2cf2..c43d9a7b 100644 --- a/evaldo/builtins_sql.go +++ b/batteries/builtins_sql.go @@ -1,7 +1,7 @@ //go:build !no_sql // +build !no_sql -package evaldo +package batteries import ( "fmt" diff --git a/evaldo/builtins_sqlite.go b/batteries/builtins_sqlite.go old mode 100755 new mode 100644 similarity index 80% rename from evaldo/builtins_sqlite.go rename to batteries/builtins_sqlite.go index a107979e..4b2e960e --- a/evaldo/builtins_sqlite.go +++ b/batteries/builtins_sqlite.go @@ -1,7 +1,7 @@ //go:build !no_sqlite // +build !no_sqlite -package evaldo +package batteries // import "C" @@ -10,6 +10,7 @@ import ( "fmt" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" _ "github.com/glebarez/sqlite" ) @@ -41,15 +42,15 @@ var Builtins_sqlite = map[string]*env.Builtin{ case env.Uri: db, err := sql.Open("sqlite", str.GetPath()) // TODO -- we need to make path parser in URI then this will be path if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Error opening SQLite: %v", err.Error()), "sqlite-uri//Open") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Error opening SQLite: %v", err.Error()), "sqlite-uri//Open") } // sql.Open doesn't actually connect, we need to ping to verify the connection if err := db.Ping(); err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Error connecting to SQLite: %v", err.Error()), "sqlite-uri//Open") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Error connecting to SQLite: %v", err.Error()), "sqlite-uri//Open") } return *env.NewNative(ps.Idx, db, "Rye-sqlite") default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "sqlite-uri//Open") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "sqlite-uri//Open") } }, @@ -69,7 +70,7 @@ var Builtins_sqlite = map[string]*env.Builtin{ case env.Table: return *env.NewString(str.ToHtml()) default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "htmlize") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "htmlize") } }, @@ -102,21 +103,21 @@ var Builtins_sqlite = map[string]*env.Builtin{ case env.String: sqlstr = str.Value default: - return MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-sqlite//Exec") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-sqlite//Exec") } if sqlstr != "" { db2 := db1.Value.(*sql.DB) _, err := db2.Exec(sqlstr, vals...) if err != nil { - return MakeBuiltinError(ps, err.Error(), "Rye-sqlite//Exec") + return evaldo.MakeBuiltinError(ps, err.Error(), "Rye-sqlite//Exec") } // rows, err := db1.Value.(*sql.DB).Query(sqlstr, vals...) return arg0 } else { - return MakeBuiltinError(ps, "sql string not found.", "Rye-sqlite//Exec") + return evaldo.MakeBuiltinError(ps, "sql string not found.", "Rye-sqlite//Exec") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-sqlite//Exec") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-sqlite//Exec") } }, }, @@ -148,12 +149,12 @@ var Builtins_sqlite = map[string]*env.Builtin{ case env.String: sqlstr = str.Value default: - return MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-sqlite//Query") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-sqlite//Query") } if sqlstr != "" { rows, err := db1.Value.(*sql.DB).Query(sqlstr, vals...) if err != nil { - return MakeBuiltinError(ps, err.Error(), "Rye-sqlite//Query") + return evaldo.MakeBuiltinError(ps, err.Error(), "Rye-sqlite//Query") } columns, _ := rows.Columns() spr := env.NewTable(columns) @@ -201,12 +202,12 @@ var Builtins_sqlite = map[string]*env.Builtin{ // return *env.NewNative(ps.Idx, *spr, "Rye-table") return *spr } - return MakeBuiltinError(ps, "Empty SQL.", "Rye-sqlite//Query") + return evaldo.MakeBuiltinError(ps, "Empty SQL.", "Rye-sqlite//Query") } else { - return MakeBuiltinError(ps, "Sql string not found.", "Rye-sqlite//Query") + return evaldo.MakeBuiltinError(ps, "Sql string not found.", "Rye-sqlite//Query") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-sqlite//Query") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-sqlite//Query") } }, }, @@ -237,7 +238,7 @@ var Builtins_sqlite = map[string]*env.Builtin{ case env.String: sqlstr = str.Value default: - return MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-sqlite//Show-SQL") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-sqlite//Show-SQL") } if sqlstr != "" { // If there are parameters, show them as comments @@ -253,10 +254,10 @@ var Builtins_sqlite = map[string]*env.Builtin{ } return *env.NewString(sqlstr) } else { - return MakeBuiltinError(ps, "Empty SQL.", "Rye-sqlite//Show-SQL") + return evaldo.MakeBuiltinError(ps, "Empty SQL.", "Rye-sqlite//Show-SQL") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-sqlite//Show-SQL") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-sqlite//Show-SQL") } }, }, @@ -275,19 +276,19 @@ var Builtins_sqlite = map[string]*env.Builtin{ case env.Native: sqliteKind, _ := ps.Idx.GetIndex("Rye-sqlite") if db.Kind.Index != sqliteKind { - return MakeBuiltinError(ps, "Expected SQLite database connection.", "Rye-sqlite//Close") + return evaldo.MakeBuiltinError(ps, "Expected SQLite database connection.", "Rye-sqlite//Close") } sqlDB, ok := db.Value.(*sql.DB) if !ok { - return MakeBuiltinError(ps, "Invalid database connection.", "Rye-sqlite//Close") + return evaldo.MakeBuiltinError(ps, "Invalid database connection.", "Rye-sqlite//Close") } err := sqlDB.Close() if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Error closing database: %v", err.Error()), "Rye-sqlite//Close") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Error closing database: %v", err.Error()), "Rye-sqlite//Close") } return *env.NewInteger(1) default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-sqlite//Close") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-sqlite//Close") } }, }, diff --git a/evaldo/builtins_sqlite_not.go b/batteries/builtins_sqlite_not.go old mode 100755 new mode 100644 similarity index 88% rename from evaldo/builtins_sqlite_not.go rename to batteries/builtins_sqlite_not.go index 93cbd363..7a615e87 --- a/evaldo/builtins_sqlite_not.go +++ b/batteries/builtins_sqlite_not.go @@ -1,7 +1,7 @@ //go:build no_sqlite // +build no_sqlite -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_ssh.go b/batteries/builtins_ssh.go old mode 100755 new mode 100644 similarity index 82% rename from evaldo/builtins_ssh.go rename to batteries/builtins_ssh.go index a1c5cb75..23254bcf --- a/evaldo/builtins_ssh.go +++ b/batteries/builtins_ssh.go @@ -1,7 +1,7 @@ //go:build add_ssh // +build add_ssh -package evaldo +package batteries import ( "io" @@ -9,6 +9,7 @@ import ( "github.com/gliderlabs/ssh" "github.com/jinzhu/copier" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/refaktor/rye/util" ) @@ -41,7 +42,7 @@ var Builtins_ssh = map[string]*env.Builtin{ 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") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "ssh-server") } }, @@ -68,7 +69,7 @@ var Builtins_ssh = map[string]*env.Builtin{ ps.ReturnFlag = false psTemp := env.ProgramState{} copier.Copy(&psTemp, &ps) - CallFunctionWithArgs(handler, ps, nil, *env.NewNative(ps.Idx, s, "ssh-session")) + evaldo.CallFunctionWithArgs(handler, ps, nil, *env.NewNative(ps.Idx, s, "ssh-session")) // Check for errors after calling handler and print to server console if ps.FailureFlag || ps.ErrorFlag { println("Error in SSH handler: " + ps.Res.Inspect(*ps.Idx)) @@ -77,11 +78,11 @@ var Builtins_ssh = map[string]*env.Builtin{ return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.FunctionType}, "ssh-server//Handle") + return evaldo.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") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "ssh-server//Handle") } }, }, @@ -107,18 +108,18 @@ var Builtins_ssh = map[string]*env.Builtin{ ps.ReturnFlag = false psTemp := env.ProgramState{} copier.Copy(&psTemp, &ps) - CallFunctionWithArgs(handler, ps, nil, *env.NewString(pass)) + evaldo.CallFunctionWithArgs(handler, ps, nil, *env.NewString(pass)) return util.IsTruthy(ps.Res) }) server.Value.(*ssh.Server).SetOption(pwda) return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.FunctionType}, "ssh-server//Password-auth") + return evaldo.MakeArgError(ps, 2, []env.Type{env.FunctionType}, "ssh-server//Password-auth") } default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "ssh-server//Password-auth") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "ssh-server//Password-auth") } }, }, @@ -137,12 +138,12 @@ var Builtins_ssh = map[string]*env.Builtin{ case env.Native: err := server.Value.(*ssh.Server).ListenAndServe() if err != nil { - return makeError(ps, err.Error()) + return evaldo.MakeError(ps, err.Error()) } return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "ssh-server//Serve") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "ssh-server//Serve") } }, }, @@ -166,11 +167,11 @@ var Builtins_ssh = map[string]*env.Builtin{ return arg0 default: ps.FailureFlag = true - return MakeArgError(ps, 2, []env.Type{env.StringType}, "ssh-session//Write") + return evaldo.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") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "ssh-session//Write") } }, }, diff --git a/evaldo/builtins_ssh_not.go b/batteries/builtins_ssh_not.go old mode 100755 new mode 100644 similarity index 87% rename from evaldo/builtins_ssh_not.go rename to batteries/builtins_ssh_not.go index 4966df3b..feaf1533 --- a/evaldo/builtins_ssh_not.go +++ b/batteries/builtins_ssh_not.go @@ -1,7 +1,7 @@ //go:build !add_ssh // +build !add_ssh -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_stackless.go b/batteries/builtins_stackless.go old mode 100755 new mode 100644 similarity index 84% rename from evaldo/builtins_stackless.go rename to batteries/builtins_stackless.go index b297928b..ed23fe55 --- a/evaldo/builtins_stackless.go +++ b/batteries/builtins_stackless.go @@ -1,10 +1,11 @@ // builtins.go -package evaldo +package batteries import ( "fmt" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" ) // definiraj frame @@ -14,7 +15,7 @@ import ( // če je builtin potem pusha trenuten frame na stack in kreira novega func Stck_CallBuiltin(bi env.Builtin, ps *env.ProgramState, arg0_ env.Object, toLeft bool) *env.ProgramState { - evalExprFn := EvalExpression_CollectArg + evalExprFn := evaldo.EvalExpression_CollectArg var arg0 env.Object var arg1 env.Object @@ -23,7 +24,7 @@ func Stck_CallBuiltin(bi env.Builtin, ps *env.ProgramState, arg0_ env.Object, to //fmt.Println(ps.Ser.GetPos()) evalExprFn(ps, true, false) - if checkForFailureWithBuiltin(bi, ps, 0) { + if evaldo.CheckForFailureWithBuiltin(bi, ps, 0) { return ps } if ps.ErrorFlag || ps.ReturnFlag { @@ -34,7 +35,7 @@ func Stck_CallBuiltin(bi env.Builtin, ps *env.ProgramState, arg0_ env.Object, to if bi.Argsn > 1 { evalExprFn(ps, true, false) // <---- THESE DETERMINE IF IT CONSUMES WHOLE EXPRESSION OR NOT IN CASE OF PIPEWORDS .. HM*... MAYBE WOULD COULD HAVE A WORD MODIFIER?? a: 2 |add 5 a:: 2 |add 5 print* --TODO - if checkForFailureWithBuiltin(bi, ps, 1) { + if evaldo.CheckForFailureWithBuiltin(bi, ps, 1) { return ps } if ps.ErrorFlag || ps.ReturnFlag { @@ -60,7 +61,7 @@ func Stck_EvalObject(ps *env.ProgramState, object env.Object, leftVal env.Object // OBJECT INJECTION EXPERIMENT // ps.Ser.Put(bu) - if checkForFailureWithBuiltin(bu, ps, 333) { + if evaldo.CheckForFailureWithBuiltin(bu, ps, 333) { return ps } return Stck_CallBuiltin(bu, ps, leftVal, toLeft) @@ -69,7 +70,7 @@ func Stck_EvalObject(ps *env.ProgramState, object env.Object, leftVal env.Object //return ps case env.CurriedCallerType: cc := object.(env.CurriedCaller) - CallCurriedCaller(cc, ps, leftVal, toLeft, false, nil, false, false) + evaldo.CallCurriedCaller(cc, ps, leftVal, toLeft, false, nil, false, false) return ps default: //d object.Trace("DEFAULT**") @@ -81,14 +82,14 @@ func Stck_EvalObject(ps *env.ProgramState, object env.Object, leftVal env.Object func Stck_EvalWord(ps *env.ProgramState, word env.Object, leftVal env.Object, toLeft bool) *env.ProgramState { // LOCAL FIRST - found, object, ctx := findWordValue(ps, word) + found, object, ctx := evaldo.FindWordValue(ps, word) if found { - trace("****33") + evaldo.Trace("****33") return Stck_EvalObject(ps, object, leftVal, toLeft, ctx) //ww0128a * //ps.Res.Trace("After eval Object") //return ps } else { - trace("****34") + evaldo.Trace("****34") ps.ErrorFlag = true if !ps.FailureFlag { ps.Res = *env.NewError2(5, "Word not found: "+word.Inspect(*ps.Idx)) @@ -100,7 +101,7 @@ func Stck_EvalWord(ps *env.ProgramState, word env.Object, leftVal env.Object, to func Stck_EvalExpression(ps *env.ProgramState) *env.ProgramState { object := ps.Ser.Pop() - trace("Before entering expression") + evaldo.Trace("Before entering expression") if object != nil { switch object.Type() { case env.IntegerType: @@ -129,7 +130,7 @@ func Stck_EvalExpression(ps *env.ProgramState) *env.ProgramState { func Stck_EvalBlock(ps *env.ProgramState) *env.ProgramState { for ps.Ser.Pos() < ps.Ser.Len() { ps = Stck_EvalExpression(ps) - if tryHandleFailure(ps) { + if evaldo.TryHandleFailure(ps) { return ps } if ps.ReturnFlag || ps.ErrorFlag { @@ -153,7 +154,7 @@ var Builtins_stackless = map[string]*env.Builtin{ ps.Ser = ser return ps.Res default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "ry0") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "ry0") } }, }, @@ -175,10 +176,10 @@ var Builtins_stackless = map[string]*env.Builtin{ ps.Ser = ser return ps.Res default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "ry0-loop") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "ry0-loop") } default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "ry0-loop") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "ry0-loop") } }, }, diff --git a/evaldo/builtins_structures.go b/batteries/builtins_structures.go similarity index 94% rename from evaldo/builtins_structures.go rename to batteries/builtins_structures.go index 119f05fe..39a90590 100644 --- a/evaldo/builtins_structures.go +++ b/batteries/builtins_structures.go @@ -1,4 +1,4 @@ -package evaldo +package batteries import ( "fmt" @@ -7,6 +7,7 @@ import ( "unicode" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" ) // { [ .print ] } @@ -73,12 +74,12 @@ func load_structures_Dict(ps *env.ProgramState, block env.Block) (env.Dict, *env keys = []string{} } } else { - return _emptyRM(), MakeBuiltinError(ps, "No selectors before tag map.", "process") + return _emptyRM(), evaldo.MakeBuiltinError(ps, "No selectors before tag map.", "process") } } default: // ni Dict ampak blok kode, vrni blok - return _emptyRM(), MakeBuiltinError(ps, "Unknow type in block parsing TODO.", "process") + return _emptyRM(), evaldo.MakeBuiltinError(ps, "Unknow type in block parsing TODO.", "process") } } return rmap, nil @@ -105,7 +106,7 @@ func do_structures(ps *env.ProgramState, data env.Dict, rmap env.Dict) env.Objec // stack = append(stack, rmap) ser := ps.Ser // TODO -- make helper function that "does" a block ps.Ser = obj.Series - EvalBlockInj(ps, env.ToRyeValue(val), true) + evaldo.EvalBlockInj(ps, env.ToRyeValue(val), true) if ps.ErrorFlag { ps.Ser = ser return ps.Res @@ -126,7 +127,7 @@ func do_structures(ps *env.ProgramState, data env.Dict, rmap env.Dict) env.Objec // stack = append(stack, rmap) ser := ps.Ser // TODO -- make helper function that "does" a block ps.Ser = obj.Series - EvalBlockInj(ps, env.ToRyeValue(val), true) + evaldo.EvalBlockInj(ps, env.ToRyeValue(val), true) if ps.ErrorFlag { ps.Ser = ser return ps.Res @@ -145,7 +146,7 @@ func dictToStruct(ps *env.ProgramState, dict env.Dict, structPtr any) env.Object // Check if it's a pointer if structVal.Kind() != reflect.Ptr { - return MakeBuiltinError(ps, "Second argument must be a pointer to a struct", "dict->struct") + return evaldo.MakeBuiltinError(ps, "Second argument must be a pointer to a struct", "dict->struct") } // Get the struct value that the pointer points to @@ -153,7 +154,7 @@ func dictToStruct(ps *env.ProgramState, dict env.Dict, structPtr any) env.Object // Check if it's a struct if structVal.Kind() != reflect.Struct { - return MakeBuiltinError(ps, "Second argument must be a pointer to a struct", "dict->struct") + return evaldo.MakeBuiltinError(ps, "Second argument must be a pointer to a struct", "dict->struct") } // Get the struct type @@ -190,7 +191,7 @@ func dictToStruct(ps *env.ProgramState, dict env.Dict, structPtr any) env.Object // Set the field value based on its type if err := setFieldValue(field, dictValue); err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Error setting field %s: %s", fieldName, err.Error()), "dict->struct") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Error setting field %s: %s", fieldName, err.Error()), "dict->struct") } } @@ -338,7 +339,7 @@ func structToDict(ps *env.ProgramState, structPtr any) env.Object { // Check if it's a struct if structVal.Kind() != reflect.Struct { - return MakeBuiltinError(ps, "Argument must be a struct or pointer to a struct", "struct->dict") + return evaldo.MakeBuiltinError(ps, "Argument must be a struct or pointer to a struct", "struct->dict") } // Create a new Dict @@ -684,10 +685,10 @@ var Builtins_structures = map[string]*env.Builtin{ // Convert the Dict to a struct return dictToStruct(ps, dict, native.Value) default: - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "dict->struct") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "dict->struct") } default: - return MakeArgError(ps, 1, []env.Type{env.DictType}, "dict->struct") + return evaldo.MakeArgError(ps, 1, []env.Type{env.DictType}, "dict->struct") } }, }, @@ -711,16 +712,16 @@ var Builtins_structures = map[string]*env.Builtin{ // Create a new struct type and populate it structPtr, err := dictToNewStruct(ps, dict, nameObj.Value) if err != nil { - return MakeBuiltinError(ps, err.Error(), "dict->new-struct") + return evaldo.MakeBuiltinError(ps, err.Error(), "dict->new-struct") } // Return the new struct as a Native return *env.NewNative(ps.Idx, structPtr, nameObj.Value) default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "dict->new-struct") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "dict->new-struct") } default: - return MakeArgError(ps, 1, []env.Type{env.DictType}, "dict->new-struct") + return evaldo.MakeArgError(ps, 1, []env.Type{env.DictType}, "dict->new-struct") } }, }, @@ -740,7 +741,7 @@ var Builtins_structures = map[string]*env.Builtin{ // Convert the struct to a Dict return structToDict(ps, native.Value) default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "struct->dict") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "struct->dict") } }, }, diff --git a/evaldo/builtins_sxml.go b/batteries/builtins_sxml.go similarity index 84% rename from evaldo/builtins_sxml.go rename to batteries/builtins_sxml.go index 40b66eeb..d9def7e0 100644 --- a/evaldo/builtins_sxml.go +++ b/batteries/builtins_sxml.go @@ -1,13 +1,14 @@ //go:build !no_sxml // +build !no_sxml -package evaldo +package batteries import ( "encoding/xml" "strings" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "io" ) @@ -58,12 +59,12 @@ func load_saxml_Dict(ps *env.ProgramState, block env.Block) (env.Dict, *env.Erro keys = []string{} } } else { - return EmptyRM(), MakeBuiltinError(ps, "No selectors before tag map.", "reader//do-sxml") + return EmptyRM(), evaldo.MakeBuiltinError(ps, "No selectors before tag map.", "reader//do-sxml") } } default: // ni Dict ampak blok kode, vrni blok - return EmptyRM(), MakeBuiltinError(ps, "Unknown type in block parsing: "+obj.Inspect(*ps.Idx), "reader//do-sxml") + return EmptyRM(), evaldo.MakeBuiltinError(ps, "Unknown type in block parsing: "+obj.Inspect(*ps.Idx), "reader//do-sxml") } } return rmap, nil @@ -112,8 +113,8 @@ func do_sxml(ps *env.ProgramState, reader io.Reader, rmap env.Dict) env.Object { case env.Block: ser := ps.Ser // TODO -- make helper function that "does" a block ps.Ser = obj.Series - EvalBlockInj(ps, *env.NewNative(ps.Idx, se, "rye-sxml-start"), true) - MaybeDisplayFailureOrError(ps, ps.Idx, "do-sxml 1") + evaldo.EvalBlockInj(ps, *env.NewNative(ps.Idx, se, "rye-sxml-start"), true) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "do-sxml 1") if ps.ErrorFlag { ps.Ser = ser return ps.Res @@ -128,8 +129,8 @@ func do_sxml(ps *env.ProgramState, reader io.Reader, rmap env.Dict) env.Object { curtag = tag ser := ps.Ser // TODO -- make helper function that "does" a block ps.Ser = obj.Series - EvalBlockInj(ps, *env.NewNative(ps.Idx, se, "rye-sxml-start"), true) - MaybeDisplayFailureOrError(ps, ps.Idx, "do-sxml 2") + evaldo.EvalBlockInj(ps, *env.NewNative(ps.Idx, se, "rye-sxml-start"), true) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "do-sxml 2") if ps.ErrorFlag { ps.Ser = ser return ps.Res @@ -153,8 +154,8 @@ func do_sxml(ps *env.ProgramState, reader io.Reader, rmap env.Dict) env.Object { curtag = inElement ser := ps.Ser // TODO -- make helper function that "does" a block ps.Ser = obj.Series - EvalBlockInj(ps, *env.NewNative(ps.Idx, se, "rye-sxml-start"), true) - MaybeDisplayFailureOrError(ps, ps.Idx, "do-sxml 3") + evaldo.EvalBlockInj(ps, *env.NewNative(ps.Idx, se, "rye-sxml-start"), true) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "do-sxml 3") if ps.ErrorFlag { ps.Ser = ser return ps.Res @@ -173,8 +174,8 @@ func do_sxml(ps *env.ProgramState, reader io.Reader, rmap env.Dict) env.Object { case env.Block: ser := ps.Ser // TODO -- make helper function that "does" a block ps.Ser = obj.Series - EvalBlockInj(ps, *env.NewString(string(se.Copy())), true) - MaybeDisplayFailureOrError(ps, ps.Idx, "do-sxml 5") + evaldo.EvalBlockInj(ps, *env.NewString(string(se.Copy())), true) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "do-sxml 5") if ps.ErrorFlag { ps.Ser = ser return ps.Res @@ -199,8 +200,8 @@ func do_sxml(ps *env.ProgramState, reader io.Reader, rmap env.Dict) env.Object { case env.Block: ser := ps.Ser // TODO -- make helper function that "does" a block ps.Ser = obj.Series - EvalBlockInj(ps, *env.NewNative(ps.Idx, se, "rye-sxml-start"), true) - MaybeDisplayFailureOrError(ps, ps.Idx, "do-sxml 6") + evaldo.EvalBlockInj(ps, *env.NewNative(ps.Idx, se, "rye-sxml-start"), true) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "do-sxml 6") if ps.ErrorFlag { ps.Ser = ser return ps.Res @@ -314,7 +315,7 @@ var Builtins_sxml = map[string]*env.Builtin{ *env.NewString(attr.Value), }) } else { - return MakeBuiltinError(ps, "Attribute index out of bounds.", "rye-sxml-start//Attr?") + return evaldo.MakeBuiltinError(ps, "Attribute index out of bounds.", "rye-sxml-start//Attr?") } case env.Word: attrName := ps.Idx.GetWord(n.Index) @@ -326,7 +327,7 @@ var Builtins_sxml = map[string]*env.Builtin{ return *env.NewString(attr.Value) } } - return MakeBuiltinError(ps, "Attribute '"+attrName+"' not found.", "rye-sxml-start//Attr?") + return evaldo.MakeBuiltinError(ps, "Attribute '"+attrName+"' not found.", "rye-sxml-start//Attr?") case env.String: attrName := n.Value // Check if string contains namespace (format: "namespace:attrname") @@ -348,15 +349,15 @@ var Builtins_sxml = map[string]*env.Builtin{ } } } - return MakeBuiltinError(ps, "Attribute '"+attrName+"' not found.", "rye-sxml-start//Attr?") + return evaldo.MakeBuiltinError(ps, "Attribute '"+attrName+"' not found.", "rye-sxml-start//Attr?") default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.WordType, env.StringType}, "rye-sxml-start//Attr?") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType, env.WordType, env.StringType}, "rye-sxml-start//Attr?") } default: - return MakeBuiltinError(ps, "Not xml-start element.", "rye-sxml-start//Attr?") + return evaldo.MakeBuiltinError(ps, "Not xml-start element.", "rye-sxml-start//Attr?") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-sxml-start//Attr?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-sxml-start//Attr?") } }, }, @@ -385,10 +386,10 @@ var Builtins_sxml = map[string]*env.Builtin{ } return *env.NewDict(data) default: - return MakeBuiltinError(ps, "Not xml-start element.", "rye-sxml-start//Attrs?") + return evaldo.MakeBuiltinError(ps, "Not xml-start element.", "rye-sxml-start//Attrs?") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-sxml-start//Attrs?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-sxml-start//Attrs?") } }, }, @@ -417,10 +418,10 @@ var Builtins_sxml = map[string]*env.Builtin{ case xml.StartElement: return *env.NewString(obj1.Name.Local) default: - return MakeBuiltinError(ps, "Not xml-start element.", "rye-sxml-start//Name?") + return evaldo.MakeBuiltinError(ps, "Not xml-start element.", "rye-sxml-start//Name?") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-sxml-start//Name?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-sxml-start//Name?") } }, }, diff --git a/evaldo/builtins_sxml_not.go b/batteries/builtins_sxml_not.go similarity index 98% rename from evaldo/builtins_sxml_not.go rename to batteries/builtins_sxml_not.go index 04d2e5c9..a77a945d 100644 --- a/evaldo/builtins_sxml_not.go +++ b/batteries/builtins_sxml_not.go @@ -1,7 +1,7 @@ //go:build not_sxml // +build not_sxml -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_table.go b/batteries/builtins_table.go similarity index 81% rename from evaldo/builtins_table.go rename to batteries/builtins_table.go index d03c56ed..887413e1 100644 --- a/evaldo/builtins_table.go +++ b/batteries/builtins_table.go @@ -1,6 +1,9 @@ // SECTION: Core/tables -package evaldo +//go:build !no_table +// +build !no_table + +package batteries import ( "encoding/csv" @@ -13,6 +16,7 @@ import ( "strings" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/refaktor/rye/util" "github.com/xuri/excelize/v2" ) @@ -66,7 +70,7 @@ var Builtins_table = map[string]*env.Builtin{ } return *spr default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "table") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "table") } /* for data.Pos() < data.Len() { rowd := make([]any, header.Len()) @@ -77,7 +81,7 @@ var Builtins_table = map[string]*env.Builtin{ spr.AddRow(*env.NewTableRow(rowd, spr)) } */ default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "table") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "table") } }, }, @@ -132,7 +136,7 @@ var Builtins_table = map[string]*env.Builtin{ } return *spr default: - return MakeArgError(ps, 2, []env.Type{env.BlockType, env.ListType}, "table\\rows") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType, env.ListType}, "table\\rows") } }, }, @@ -152,7 +156,7 @@ var Builtins_table = map[string]*env.Builtin{ case env.Block: data := block.Series if data.Len() == 0 { - return MakeBuiltinError(ps, "Block is empty", "to-table") + return evaldo.MakeBuiltinError(ps, "Block is empty", "to-table") } k := make(map[string]struct{}) for _, obj := range data.S { @@ -162,7 +166,7 @@ var Builtins_table = map[string]*env.Builtin{ k[key] = struct{}{} } default: - return MakeBuiltinError(ps, "Block must contain only dicts", "to-table") + return evaldo.MakeBuiltinError(ps, "Block must contain only dicts", "to-table") } } var keys []string @@ -189,7 +193,7 @@ var Builtins_table = map[string]*env.Builtin{ case env.List: data := block.Data if len(data) == 0 { - return MakeBuiltinError(ps, "List is empty", "to-table") + return evaldo.MakeBuiltinError(ps, "List is empty", "to-table") } k := make(map[string]struct{}) for _, obj := range data { @@ -203,7 +207,7 @@ var Builtins_table = map[string]*env.Builtin{ k[key] = struct{}{} } default: - return MakeBuiltinError(ps, "List must contain only dicts", "to-table") + return evaldo.MakeBuiltinError(ps, "List must contain only dicts", "to-table") } } var keys []string @@ -238,7 +242,7 @@ var Builtins_table = map[string]*env.Builtin{ return *spr default: - return MakeArgError(ps, 1, []env.Type{env.BlockType, env.ListType}, "to-table") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType, env.ListType}, "to-table") } }, }, @@ -264,10 +268,10 @@ var Builtins_table = map[string]*env.Builtin{ case *env.Table: spr = s default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "to-dict") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "to-dict") } if len(spr.Cols) != 2 { - return MakeBuiltinError(ps, fmt.Sprintf("to-dict requires a table with exactly 2 columns, got %d", len(spr.Cols)), "to-dict") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("to-dict requires a table with exactly 2 columns, got %d", len(spr.Cols)), "to-dict") } data := make(map[string]any, len(spr.Rows)) for _, row := range spr.Rows { @@ -283,7 +287,7 @@ var Builtins_table = map[string]*env.Builtin{ case env.Decimal: keyStr = fmt.Sprintf("%g", k.Value) default: - return MakeBuiltinError(ps, fmt.Sprintf("to-dict: key column values must be strings or numbers, got %s", keyObj.Inspect(*ps.Idx)), "to-dict") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("to-dict: key column values must be strings or numbers, got %s", keyObj.Inspect(*ps.Idx)), "to-dict") } data[keyStr] = env.ToRyeValue(row.Values[1]) } @@ -314,7 +318,7 @@ var Builtins_table = map[string]*env.Builtin{ case env.Table: spr = &s default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-equal") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "where-equal") } switch col := arg1.(type) { case env.Word: @@ -322,7 +326,7 @@ var Builtins_table = map[string]*env.Builtin{ case env.String: return WhereEquals(ps, spr, col.Value, arg2) default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-equal") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-equal") } }, }, @@ -344,7 +348,7 @@ var Builtins_table = map[string]*env.Builtin{ case env.Table: spr = &s default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-not-equal") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "where-not-equal") } switch col := arg1.(type) { case env.Word: @@ -352,7 +356,7 @@ var Builtins_table = map[string]*env.Builtin{ case env.String: return WhereNotEquals(ps, spr, col.Value, arg2) default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-not-equal") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-not-equal") } }, }, @@ -378,7 +382,7 @@ var Builtins_table = map[string]*env.Builtin{ case env.Table: spr = &s default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-void") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "where-void") } switch col := arg1.(type) { case env.Word: @@ -386,7 +390,7 @@ var Builtins_table = map[string]*env.Builtin{ case env.String: return WhereEquals(ps, spr, col.Value, env.NewVoid()) default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-void") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-void") } }, }, @@ -412,13 +416,13 @@ var Builtins_table = map[string]*env.Builtin{ case *env.Table: spr = sheet default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-match") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "where-match") } switch reNative := arg2.(type) { case env.Native: re, ok := reNative.Value.(*regexp.Regexp) if !ok { - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "where-match") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "where-match") } switch col := arg1.(type) { case env.Word: @@ -426,10 +430,10 @@ var Builtins_table = map[string]*env.Builtin{ case env.String: return WhereMatch(ps, spr, col.Value, re) default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-match") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-match") } default: - return MakeArgError(ps, 3, []env.Type{env.NativeType}, "where-match") + return evaldo.MakeArgError(ps, 3, []env.Type{env.NativeType}, "where-match") } }, }, @@ -455,7 +459,7 @@ var Builtins_table = map[string]*env.Builtin{ case *env.Table: spr = sheet default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-contains") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "where-contains") } switch s := arg2.(type) { case env.String: @@ -465,10 +469,10 @@ var Builtins_table = map[string]*env.Builtin{ case env.String: return WhereContains(ps, spr, col.Value, s.Value, false) default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-contains") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-contains") } default: - return MakeArgError(ps, 3, []env.Type{env.StringType}, "where-contains") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "where-contains") } }, }, @@ -494,7 +498,7 @@ var Builtins_table = map[string]*env.Builtin{ case *env.Table: spr = sheet default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-not-contains") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "where-not-contains") } switch s := arg2.(type) { case env.String: @@ -504,10 +508,10 @@ var Builtins_table = map[string]*env.Builtin{ case env.String: return WhereContains(ps, spr, col.Value, s.Value, true) default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-not-contains") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-not-contains") } default: - return MakeArgError(ps, 3, []env.Type{env.StringType}, "where-not-contains") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "where-not-contains") } }, }, @@ -532,7 +536,7 @@ var Builtins_table = map[string]*env.Builtin{ case *env.Table: spr = sheet default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-greater") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "where-greater") } switch col := arg1.(type) { case env.Word: @@ -540,7 +544,7 @@ var Builtins_table = map[string]*env.Builtin{ case env.String: return WhereGreater(ps, spr, col.Value, arg2) default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-greater") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-greater") } }, }, @@ -565,7 +569,7 @@ var Builtins_table = map[string]*env.Builtin{ case *env.Table: spr = sheet default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-lesser") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "where-lesser") } switch col := arg1.(type) { case env.Word: @@ -573,7 +577,7 @@ var Builtins_table = map[string]*env.Builtin{ case env.String: return WhereLesser(ps, spr, col.Value, arg2) default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-lesser") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-lesser") } }, }, @@ -601,7 +605,7 @@ var Builtins_table = map[string]*env.Builtin{ case *env.Table: spr = sheet default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-between") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "where-between") } switch col := arg1.(type) { case env.Word: @@ -609,7 +613,7 @@ var Builtins_table = map[string]*env.Builtin{ case env.String: return WhereBetween(ps, spr, col.Value, arg2, arg3, false) default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-between") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-between") } }, }, @@ -635,7 +639,7 @@ var Builtins_table = map[string]*env.Builtin{ case *env.Table: spr = sheet default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-between\\inclusive") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "where-between\\inclusive") } switch col := arg1.(type) { case env.Word: @@ -643,7 +647,7 @@ var Builtins_table = map[string]*env.Builtin{ case env.String: return WhereBetween(ps, spr, col.Value, arg2, arg3, true) default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-between\\inclusive") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-between\\inclusive") } }, }, @@ -671,7 +675,7 @@ var Builtins_table = map[string]*env.Builtin{ case *env.Table: spr = s default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-in") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "where-in") } switch vals := arg2.(type) { case env.Block: @@ -681,10 +685,10 @@ var Builtins_table = map[string]*env.Builtin{ case env.String: return WhereIn(ps, spr, col.Value, vals.Series.S) default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-in") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-in") } default: - return MakeArgError(ps, 3, []env.Type{env.BlockType}, "where-in") + return evaldo.MakeArgError(ps, 3, []env.Type{env.BlockType}, "where-in") } }, }, @@ -712,7 +716,7 @@ var Builtins_table = map[string]*env.Builtin{ case *env.Table: spr = s default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-not-in") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "where-not-in") } switch vals := arg2.(type) { case env.Block: @@ -722,10 +726,10 @@ var Builtins_table = map[string]*env.Builtin{ case env.String: return WhereNotIn(ps, spr, col.Value, vals.Series.S) default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-not-in") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-not-in") } default: - return MakeArgError(ps, 3, []env.Type{env.BlockType}, "where-not-in") + return evaldo.MakeArgError(ps, 3, []env.Type{env.BlockType}, "where-not-in") } }, }, @@ -756,7 +760,7 @@ var Builtins_table = map[string]*env.Builtin{ case *env.Table: spr = table default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "where") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "where") } switch col := arg1.(type) { @@ -770,7 +774,7 @@ var Builtins_table = map[string]*env.Builtin{ case env.Function: return WhereFunction(ps, spr, colName, block) default: - return MakeArgError(ps, 3, []env.Type{env.BlockType, env.BuiltinType, env.FunctionType}, "where") + return evaldo.MakeArgError(ps, 3, []env.Type{env.BlockType, env.BuiltinType, env.FunctionType}, "where") } case env.String: colName := col.Value @@ -782,17 +786,17 @@ var Builtins_table = map[string]*env.Builtin{ case env.Function: return WhereFunction(ps, spr, colName, block) default: - return MakeArgError(ps, 3, []env.Type{env.BlockType, env.BuiltinType, env.FunctionType}, "where") + return evaldo.MakeArgError(ps, 3, []env.Type{env.BlockType, env.BuiltinType, env.FunctionType}, "where") } case env.Block: switch block := arg2.(type) { case env.Block: return WhereBlockMultiCol(ps, spr, col, block) default: - return MakeArgError(ps, 3, []env.Type{env.BlockType}, "where") + return evaldo.MakeArgError(ps, 3, []env.Type{env.BlockType}, "where") } default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType, env.BlockType}, "where") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType, env.BlockType}, "where") } }, }, @@ -819,7 +823,7 @@ var Builtins_table = map[string]*env.Builtin{ case *env.Table: spr = s default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "distinct") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "distinct") } switch col := arg1.(type) { case env.Word: @@ -837,12 +841,12 @@ var Builtins_table = map[string]*env.Builtin{ case env.String: cols = append(cols, w.Value) default: - return MakeBuiltinError(ps, "Column names block must contain only words or strings.", "distinct") + return evaldo.MakeBuiltinError(ps, "Column names block must contain only words or strings.", "distinct") } } return Distinct(ps, spr, cols) default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType, env.BlockType}, "distinct") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType, env.BlockType}, "distinct") } }, }, @@ -869,7 +873,7 @@ var Builtins_table = map[string]*env.Builtin{ case *env.Table: spr = s default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "fill-void") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "fill-void") } var colName string switch col := arg1.(type) { @@ -878,7 +882,7 @@ var Builtins_table = map[string]*env.Builtin{ case env.String: colName = col.Value default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "fill-void") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "fill-void") } return FillVoid(ps, spr, colName, arg2) }, @@ -907,7 +911,7 @@ var Builtins_table = map[string]*env.Builtin{ case *env.Table: spr = table default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "count-where") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "count-where") } switch col := arg1.(type) { @@ -921,7 +925,7 @@ var Builtins_table = map[string]*env.Builtin{ case env.Function: return CountWhereFunction(ps, spr, colName, block) default: - return MakeArgError(ps, 3, []env.Type{env.BlockType, env.BuiltinType, env.FunctionType}, "count-where") + return evaldo.MakeArgError(ps, 3, []env.Type{env.BlockType, env.BuiltinType, env.FunctionType}, "count-where") } case env.String: colName := col.Value @@ -933,17 +937,17 @@ var Builtins_table = map[string]*env.Builtin{ case env.Function: return CountWhereFunction(ps, spr, colName, block) default: - return MakeArgError(ps, 3, []env.Type{env.BlockType, env.BuiltinType, env.FunctionType}, "count-where") + return evaldo.MakeArgError(ps, 3, []env.Type{env.BlockType, env.BuiltinType, env.FunctionType}, "count-where") } case env.Block: switch block := arg2.(type) { case env.Block: return CountWhereBlockMultiCol(ps, spr, col, block) default: - return MakeArgError(ps, 3, []env.Type{env.BlockType}, "count-where") + return evaldo.MakeArgError(ps, 3, []env.Type{env.BlockType}, "count-where") } default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType, env.BlockType}, "count-where") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType, env.BlockType}, "count-where") } }, }, @@ -980,10 +984,10 @@ var Builtins_table = map[string]*env.Builtin{ table.AddRow(*env.NewTableRow(vals, &table)) return table default: - return MakeArgError(ps, 2, []env.Type{env.BlockType, env.ListType}, "add-row") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType, env.ListType}, "add-row") } default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "add-row") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "add-row") } }, }, @@ -1003,7 +1007,7 @@ var Builtins_table = map[string]*env.Builtin{ rows := spr.GetRows() return *env.NewNative(ps.Idx, rows, "table-rows") default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "get-rows") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "get-rows") } }, }, @@ -1060,10 +1064,10 @@ var Builtins_table = map[string]*env.Builtin{ return spr default: fmt.Println(data1.Inspect(*ps.Idx)) - return MakeArgError(ps, 2, []env.Type{env.BlockType, env.NativeType}, "add-rows") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType, env.NativeType}, "add-rows") } default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "add-rows") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "add-rows") } }, }, @@ -1102,7 +1106,7 @@ var Builtins_table = map[string]*env.Builtin{ spr.Rows = append(spr.Rows, data1.Value.([]env.TableRow)...) return spr default: - return MakeArgError(ps, 2, []env.Type{env.BlockType, env.NativeType}, "add-rows!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType, env.NativeType}, "add-rows!") } case *env.PersistentTable: switch data1 := arg1.(type) { @@ -1118,10 +1122,10 @@ var Builtins_table = map[string]*env.Builtin{ } return spr default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "add-rows!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "add-rows!") } default: - return MakeArgError(ps, 1, []env.Type{env.TableType, env.PersistentTableType}, "add-rows!") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType, env.PersistentTableType}, "add-rows!") } }, }, @@ -1156,21 +1160,21 @@ var Builtins_table = map[string]*env.Builtin{ case env.Integer: if idx.Value < 1 || (idx.Value-1) > int64(len(spr.Rows)) { errMsg := fmt.Sprintf("update-row! called with row index %d, but table only has %d rows", idx.Value, len(spr.Rows)) - return makeError(ps, errMsg) + return evaldo.MakeError(ps, errMsg) } switch updater := arg2.(type) { case env.Function: - CallFunction_CollectArgs(updater, ps, spr.Rows[idx.Value-1], false, ps.Ctx) + evaldo.CallFunction_CollectArgs(updater, ps, spr.Rows[idx.Value-1], false, ps.Ctx) ret := ps.Res if ok, err, row := RyeValueToTableRow(spr, ret); ok { spr.Rows[idx.Value-1] = *row return spr } else if len(err) > 0 { - return makeError(ps, err) + return evaldo.MakeError(ps, err) } else { - return makeError(ps, fmt.Sprintf( + return evaldo.MakeError(ps, fmt.Sprintf( "Function given to update-row! should have returned a Dict or a TableRow, but returned a %s %#v instead", - NameOfRyeType(ret.Type()), ret, + evaldo.NameOfRyeType(ret.Type()), ret, )) } case env.Dict: @@ -1180,7 +1184,7 @@ var Builtins_table = map[string]*env.Builtin{ for keyStr, val := range updater.Data { index := spr.GetColumnIndex(keyStr) if index < 0 { - return makeError(ps, "Column "+keyStr+" was not found") + return evaldo.MakeError(ps, "Column "+keyStr+" was not found") } row.Values[index] = val } @@ -1189,13 +1193,13 @@ var Builtins_table = map[string]*env.Builtin{ spr.Rows[idx.Value-1] = updater return spr default: - return MakeArgError(ps, 3, []env.Type{env.FunctionType, env.DictType, env.TableRowType}, "update-row!") + return evaldo.MakeArgError(ps, 3, []env.Type{env.FunctionType, env.DictType, env.TableRowType}, "update-row!") } default: - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "update-row!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "update-row!") } default: - return MakeNeedsThawedArgError(ps, "update-row!") + return evaldo.MakeNeedsThawedArgError(ps, "update-row!") } }, @@ -1222,13 +1226,13 @@ var Builtins_table = map[string]*env.Builtin{ spr.RemoveRowByIndex(data1.Value - 1) return spr } else { - return makeError(ps, fmt.Sprintf("Table had less then %d rows", data1.Value)) + return evaldo.MakeError(ps, fmt.Sprintf("Table had less then %d rows", data1.Value)) } default: - return MakeArgError(ps, 2, []env.Type{env.BlockType, env.NativeType}, "remove-row!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType, env.NativeType}, "remove-row!") } default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "remove-row!") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "remove-row!") } }, }, @@ -1265,21 +1269,21 @@ var Builtins_table = map[string]*env.Builtin{ case env.LSetword: // Rename the previous column if len(colNames) == 0 { - return MakeBuiltinError(ps, "LSetword :"+ps.Idx.GetWord(ww.Index)+" found but no previous column to rename", "columns?") + return evaldo.MakeBuiltinError(ps, "LSetword :"+ps.Idx.GetWord(ww.Index)+" found but no previous column to rename", "columns?") } // Replace the last column name with the new name from lsetword newName := ps.Idx.GetWord(ww.Index) colNames[len(colNames)-1] = newName default: - return MakeBuiltinError(ps, "Expected string, tagword, or lsetword in columns specification", "columns?") + return evaldo.MakeBuiltinError(ps, "Expected string, tagword, or lsetword in columns specification", "columns?") } } return spr.ColumnsRenamed(ps, cols, colNames) default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "columns?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "columns?") } default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "columns?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "columns?") } }, }, @@ -1299,7 +1303,7 @@ var Builtins_table = map[string]*env.Builtin{ case env.Table: return spr.GetColumns() default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "headers?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "headers?") } }, }, @@ -1330,30 +1334,30 @@ var Builtins_table = map[string]*env.Builtin{ } return res default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "column?") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "column?") } case env.Block: switch col := arg1.(type) { case env.Integer: col1 := make([]env.Object, len(spr.Series.S)) if col.Value < 0 { - return MakeBuiltinError(ps, "Index can't be negative", "column?") + return evaldo.MakeBuiltinError(ps, "Index can't be negative", "column?") } for i, item_ := range spr.Series.S { switch item := item_.(type) { case env.Block: if len(item.Series.S) < int(col.Value) { - return MakeBuiltinError(ps, "index out of bounds for item: "+strconv.Itoa(i), "column?") + return evaldo.MakeBuiltinError(ps, "index out of bounds for item: "+strconv.Itoa(i), "column?") } col1[i] = item.Series.S[col.Value] } } return *env.NewBlock(*env.NewTSeries(col1)) default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "column?") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "column?") } default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "column?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "column?") } }, }, @@ -1378,10 +1382,10 @@ var Builtins_table = map[string]*env.Builtin{ case env.Block: return DropColumnBlock(ps, spr, rmCol) default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType, env.BlockType}, "drop-column") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType, env.BlockType}, "drop-column") } } - return MakeArgError(ps, 1, []env.Type{env.TableType}, "drop-column") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "drop-column") }, }, // Tests: @@ -1399,13 +1403,13 @@ var Builtins_table = map[string]*env.Builtin{ case env.String: return RenameColumn(ps, spr, oldName, newName) default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.BlockType}, "rename-column") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.BlockType}, "rename-column") } default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.BlockType}, "rename-column") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.BlockType}, "rename-column") } } - return MakeArgError(ps, 1, []env.Type{env.TableType}, "rename-column") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "rename-column") }, }, // TODO: also create gen-column\i 'name { +100 } ( or \idx \pos) @@ -1434,25 +1438,25 @@ var Builtins_table = map[string]*env.Builtin{ case env.Block: return GenerateColumn(ps, spr, newCol, fromCols, code) default: - return MakeArgError(ps, 4, []env.Type{env.BlockType}, "gen-column") + return evaldo.MakeArgError(ps, 4, []env.Type{env.BlockType}, "gen-column") } case env.Word: switch replaceBlock := arg3.(type) { case env.Block: if replaceBlock.Series.Len() != 2 { - return MakeBuiltinError(ps, "Replacement block must contain a regex object and replacement string.", "genadd-umn") + return evaldo.MakeBuiltinError(ps, "Replacement block must contain a regex object and replacement string.", "genadd-umn") } regexNative, ok := replaceBlock.Series.S[0].(env.Native) if !ok { - return MakeBuiltinError(ps, "First element of replacement block must be a regex object.", "genaddumn") + return evaldo.MakeBuiltinError(ps, "First element of replacement block must be a regex object.", "genaddumn") } regex, ok := regexNative.Value.(*regexp.Regexp) if !ok { - return MakeBuiltinError(ps, "First element of replacement block must be a regex object.", "gen-column") + return evaldo.MakeBuiltinError(ps, "First element of replacement block must be a regex object.", "gen-column") } replaceStr, ok := replaceBlock.Series.S[1].(env.String) if !ok { - return MakeBuiltinError(ps, "Second element of replacement block must be a string.", "gen-column") + return evaldo.MakeBuiltinError(ps, "Second element of replacement block must be a string.", "gen-column") } err := GenerateColumnRegexReplace(ps, &spr, newCol, fromCols, regex, replaceStr.Value) if err != nil { @@ -1460,16 +1464,16 @@ var Builtins_table = map[string]*env.Builtin{ } return spr default: - return MakeArgError(ps, 3, []env.Type{env.BlockType}, "gen-column") + return evaldo.MakeArgError(ps, 3, []env.Type{env.BlockType}, "gen-column") } default: - return MakeArgError(ps, 3, []env.Type{env.BlockType}, "gen-column") + return evaldo.MakeArgError(ps, 3, []env.Type{env.BlockType}, "gen-column") } default: - return MakeArgError(ps, 2, []env.Type{env.WordType}, "gen-column") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType}, "gen-column") } default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "gen-column") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "gen-column") } }, }, @@ -1499,19 +1503,19 @@ var Builtins_table = map[string]*env.Builtin{ case env.String: colName = col.Value default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "update-column!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "update-column!") } colIdx := slices.Index(spr.Cols, colName) if colIdx < 0 { - return MakeBuiltinError(ps, fmt.Sprintf("Column '%s' not found", colName), "update-column!") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Column '%s' not found", colName), "update-column!") } switch updater := arg2.(type) { case env.Function: for i := range spr.Rows { cell := env.ToRyeValue(spr.Rows[i].Values[colIdx]) - CallFunctionArgs2(updater, ps, cell, spr.Rows[i], ps.Ctx) + evaldo.CallFunctionArgs2(updater, ps, cell, spr.Rows[i], ps.Ctx) if ps.ErrorFlag { return ps.Res } @@ -1519,10 +1523,10 @@ var Builtins_table = map[string]*env.Builtin{ } return spr default: - return MakeArgError(ps, 3, []env.Type{env.FunctionType}, "update-column!") + return evaldo.MakeArgError(ps, 3, []env.Type{env.FunctionType}, "update-column!") } default: - return MakeNeedsThawedArgError(ps, "update-column!") + return evaldo.MakeNeedsThawedArgError(ps, "update-column!") } }, }, @@ -1548,7 +1552,7 @@ var Builtins_table = map[string]*env.Builtin{ case env.String: colName = col.Value default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "add-column") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "add-column") } numRows := len(spr.Rows) @@ -1557,7 +1561,7 @@ var Builtins_table = map[string]*env.Builtin{ case env.Block: if data.Series.Len() != numRows { - return MakeBuiltinError(ps, fmt.Sprintf("Column data has %d values but table has %d rows", data.Series.Len(), numRows), "add-column") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Column data has %d values but table has %d rows", data.Series.Len(), numRows), "add-column") } // Add column name spr.Cols = append(spr.Cols, colName) @@ -1569,7 +1573,7 @@ var Builtins_table = map[string]*env.Builtin{ return spr case env.List: if len(data.Data) != numRows { - return MakeBuiltinError(ps, fmt.Sprintf("Column data has %d values but table has %d rows", len(data.Data), numRows), "add-column") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Column data has %d values but table has %d rows", len(data.Data), numRows), "add-column") } // Add column name spr.Cols = append(spr.Cols, colName) @@ -1580,10 +1584,10 @@ var Builtins_table = map[string]*env.Builtin{ } return spr default: - return MakeArgError(ps, 3, []env.Type{env.BlockType, env.ListType}, "add-column") + return evaldo.MakeArgError(ps, 3, []env.Type{env.BlockType, env.ListType}, "add-column") } default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "add-column") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "add-column") } }, }, @@ -1603,7 +1607,7 @@ var Builtins_table = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { dir, ok := arg2.(env.Word) if !ok { - return MakeArgError(ps, 3, []env.Type{env.WordType}, "sort-by!") + return evaldo.MakeArgError(ps, 3, []env.Type{env.WordType}, "sort-by!") } var dirAsc bool if dir.Index == ps.Idx.IndexWord("asc") { @@ -1611,7 +1615,7 @@ var Builtins_table = map[string]*env.Builtin{ } else if dir.Index == ps.Idx.IndexWord("desc") { dirAsc = false } else { - return MakeBuiltinError(ps, "Direction can be just asc or desc.", "sort-by!") + return evaldo.MakeBuiltinError(ps, "Direction can be just asc or desc.", "sort-by!") } switch spr := arg0.(type) { case env.Table: @@ -1631,10 +1635,10 @@ var Builtins_table = map[string]*env.Builtin{ } return spr default: - return MakeArgError(ps, 2, []env.Type{env.WordType}, "sort-by!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType}, "sort-by!") } default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "sort-by!") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "sort-by!") } }, }, @@ -1651,7 +1655,7 @@ var Builtins_table = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { dir, ok := arg2.(env.Word) if !ok { - return MakeArgError(ps, 3, []env.Type{env.WordType}, "sort-by!") + return evaldo.MakeArgError(ps, 3, []env.Type{env.WordType}, "sort-by!") } var dirAsc bool if dir.Index == ps.Idx.IndexWord("asc") { @@ -1659,7 +1663,7 @@ var Builtins_table = map[string]*env.Builtin{ } else if dir.Index == ps.Idx.IndexWord("desc") { dirAsc = false } else { - return MakeBuiltinError(ps, "Direction can be just asc or desc.", "sort-by!") + return evaldo.MakeBuiltinError(ps, "Direction can be just asc or desc.", "sort-by!") } switch spr := arg0.(type) { case env.Table: @@ -1683,10 +1687,10 @@ var Builtins_table = map[string]*env.Builtin{ } return *newSpr default: - return MakeArgError(ps, 2, []env.Type{env.WordType}, "sort-by!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType}, "sort-by!") } default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "sort-by!") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "sort-by!") } }, }, @@ -1708,7 +1712,7 @@ var Builtins_table = map[string]*env.Builtin{ case env.Word: colWords[c] = ww default: - return MakeError(ps, "Block of tagwords needed") + return evaldo.MakeError(ps, "Block of tagwords needed") } } err := AddIndexes(ps, &spr, colWords) @@ -1717,10 +1721,10 @@ var Builtins_table = map[string]*env.Builtin{ } return spr default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "add-indexes!") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "add-indexes!") } default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "add-indexes!") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "add-indexes!") } }, }, @@ -1739,7 +1743,7 @@ var Builtins_table = map[string]*env.Builtin{ } return *env.NewBlock(*env.NewTSeries(res)) default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "indexes?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "indexes?") } }, }, @@ -1756,10 +1760,10 @@ var Builtins_table = map[string]*env.Builtin{ case env.Decimal: return AutoType(ps, &spr, percent.Value) default: - return MakeArgError(ps, 2, []env.Type{env.DecimalType}, "autotype") + return evaldo.MakeArgError(ps, 2, []env.Type{env.DecimalType}, "autotype") } default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "autotype") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "autotype") } }, }, @@ -1792,23 +1796,23 @@ var Builtins_table = map[string]*env.Builtin{ case env.Word: col2, ok := arg3.(env.Word) if !ok { - return MakeArgError(ps, 4, []env.Type{env.WordType}, "left-join") + return evaldo.MakeArgError(ps, 4, []env.Type{env.WordType}, "left-join") } return LeftJoin(ps, spr1, spr2, ps.Idx.GetWord(col1.Index), ps.Idx.GetWord(col2.Index), false) case env.String: col2, ok := arg3.(env.String) if !ok { - MakeArgError(ps, 4, []env.Type{env.StringType}, "left-join") + evaldo.MakeArgError(ps, 4, []env.Type{env.StringType}, "left-join") } return LeftJoin(ps, spr1, spr2, col1.Value, col2.Value, false) default: - return MakeArgError(ps, 3, []env.Type{env.WordType, env.StringType}, "left-join") + return evaldo.MakeArgError(ps, 3, []env.Type{env.WordType, env.StringType}, "left-join") } default: - return MakeArgError(ps, 2, []env.Type{env.TableType}, "left-join") + return evaldo.MakeArgError(ps, 2, []env.Type{env.TableType}, "left-join") } default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "left-join") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "left-join") } }, }, @@ -1842,23 +1846,23 @@ var Builtins_table = map[string]*env.Builtin{ case env.Word: col2, ok := arg3.(env.Word) if !ok { - return MakeArgError(ps, 4, []env.Type{env.WordType}, "inner-join") + return evaldo.MakeArgError(ps, 4, []env.Type{env.WordType}, "inner-join") } return LeftJoin(ps, spr1, spr2, ps.Idx.GetWord(col1.Index), ps.Idx.GetWord(col2.Index), true) case env.String: col2, ok := arg3.(env.String) if !ok { - MakeArgError(ps, 4, []env.Type{env.StringType}, "inner-join") + evaldo.MakeArgError(ps, 4, []env.Type{env.StringType}, "inner-join") } return LeftJoin(ps, spr1, spr2, col1.Value, col2.Value, true) default: - return MakeArgError(ps, 3, []env.Type{env.WordType, env.StringType}, "inner-join") + return evaldo.MakeArgError(ps, 3, []env.Type{env.WordType, env.StringType}, "inner-join") } default: - return MakeArgError(ps, 2, []env.Type{env.TableType}, "inner-join") + return evaldo.MakeArgError(ps, 2, []env.Type{env.TableType}, "inner-join") } default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "inner-join") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "inner-join") } }, }, @@ -1890,14 +1894,14 @@ var Builtins_table = map[string]*env.Builtin{ switch aggBlock := arg2.(type) { case env.Block: if len(aggBlock.Series.S)%2 != 0 { - return MakeBuiltinError(ps, "Aggregation block must contain pairs of column name and function for each aggregation.", "group-by") + return evaldo.MakeBuiltinError(ps, "Aggregation block must contain pairs of column name and function for each aggregation.", "group-by") } aggregations := make(map[string][]string) for i := 0; i < len(aggBlock.Series.S); i += 2 { col := aggBlock.Series.S[i] fun, ok := aggBlock.Series.S[i+1].(env.Word) if !ok { - return MakeBuiltinError(ps, "Aggregation function must be a word", "group-by") + return evaldo.MakeBuiltinError(ps, "Aggregation function must be a word", "group-by") } colStr := "" switch col := col.(type) { @@ -1906,7 +1910,7 @@ var Builtins_table = map[string]*env.Builtin{ case env.String: colStr = col.Value default: - return MakeBuiltinError(ps, "Aggregation column must be a word or string", "group-by") + return evaldo.MakeBuiltinError(ps, "Aggregation column must be a word or string", "group-by") } funStr := ps.Idx.GetWord(fun.Index) aggregations[colStr] = append(aggregations[colStr], funStr) @@ -1927,18 +1931,18 @@ var Builtins_table = map[string]*env.Builtin{ case env.Word: cols[c] = ps.Idx.GetWord(ww.Index) default: - return MakeBuiltinError(ps, "Block must contain only strings or words for column names", "group-by") + return evaldo.MakeBuiltinError(ps, "Block must contain only strings or words for column names", "group-by") } } return GroupBy(ps, spr, cols, aggregations) default: - return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType, env.BlockType}, "group-by") + return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType, env.BlockType}, "group-by") } default: - return MakeArgError(ps, 3, []env.Type{env.BlockType}, "group-by") + return evaldo.MakeArgError(ps, 3, []env.Type{env.BlockType}, "group-by") } default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "group-by") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "group-by") } }, }, @@ -2042,7 +2046,7 @@ var Builtins_table = map[string]*env.Builtin{ f, err := os.Open(file.GetPath()) if err != nil { // log.Fatal("Unable to read input file "+filePath, err) - return MakeBuiltinError(ps, "Unable to read input file:"+err.Error(), "Load\\csv") + return evaldo.MakeBuiltinError(ps, "Unable to read input file:"+err.Error(), "Load\\csv") } defer f.Close() @@ -2050,10 +2054,10 @@ var Builtins_table = map[string]*env.Builtin{ rows, err := csvReader.ReadAll() if err != nil { // log.Fatal("Unable to parse file as CSV for "+filePath, err) - return MakeBuiltinError(ps, "Unable to parse file as CSV: "+err.Error(), "Load\\csv") + return evaldo.MakeBuiltinError(ps, "Unable to parse file as CSV: "+err.Error(), "Load\\csv") } if len(rows) == 0 { - return MakeBuiltinError(ps, "File is empty", "Load\\csv") + return evaldo.MakeBuiltinError(ps, "File is empty", "Load\\csv") } spr := env.NewTable(rows[0]) // for i, row := range rows { @@ -2072,7 +2076,7 @@ var Builtins_table = map[string]*env.Builtin{ } return *spr default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "Load\\csv") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "Load\\csv") } }, }, @@ -2104,22 +2108,22 @@ var Builtins_table = map[string]*env.Builtin{ f, err := os.Open(file.GetPath()) if err != nil { // log.Fatal("Unable to read input file "+filePath, err) - return MakeBuiltinError(ps, "Unable to read input file:"+err.Error(), "Load\\csv") + return evaldo.MakeBuiltinError(ps, "Unable to read input file:"+err.Error(), "Load\\csv") } defer f.Close() csvReader := csv.NewReader(f) if len(separator.Value) != 1 { - return MakeBuiltinError(ps, "Separator must be exactly 1 character long", "Load\\csv\\") + return evaldo.MakeBuiltinError(ps, "Separator must be exactly 1 character long", "Load\\csv\\") } csvReader.Comma = rune(separator.Value[0]) rows, err := csvReader.ReadAll() if err != nil { // log.Fatal("Unable to parse file as CSV for "+filePath, err) - return MakeBuiltinError(ps, "Unable to parse file as CSV: "+err.Error(), "Load\\csv") + return evaldo.MakeBuiltinError(ps, "Unable to parse file as CSV: "+err.Error(), "Load\\csv") } if len(rows) == 0 { - return MakeBuiltinError(ps, "File is empty", "Load\\csv") + return evaldo.MakeBuiltinError(ps, "File is empty", "Load\\csv") } spr := env.NewTable(rows[0]) // for i, row := range rows { @@ -2138,10 +2142,10 @@ var Builtins_table = map[string]*env.Builtin{ } return *spr default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Load\\csv\\") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Load\\csv\\") } default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "Load\\csv\\") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "Load\\csv\\") } }, }, @@ -2170,7 +2174,7 @@ var Builtins_table = map[string]*env.Builtin{ f, err := os.Open(file.GetPath()) if err != nil { // log.Fatal("Unable to read input file "+filePath, err) - return MakeBuiltinError(ps, "Unable to read input file:"+err.Error(), "Load\\csv") + return evaldo.MakeBuiltinError(ps, "Unable to read input file:"+err.Error(), "Load\\csv") } defer f.Close() @@ -2179,10 +2183,10 @@ var Builtins_table = map[string]*env.Builtin{ rows, err := csvReader.ReadAll() if err != nil { // log.Fatal("Unable to parse file as CSV for "+filePath, err) - return MakeBuiltinError(ps, "Unable to parse file as CSV: "+err.Error(), "Load\\csv") + return evaldo.MakeBuiltinError(ps, "Unable to parse file as CSV: "+err.Error(), "Load\\csv") } if len(rows) == 0 { - return MakeBuiltinError(ps, "File is empty", "Load\\csv") + return evaldo.MakeBuiltinError(ps, "File is empty", "Load\\csv") } spr := env.NewTable(rows[0]) // for i, row := range rows { @@ -2201,7 +2205,7 @@ var Builtins_table = map[string]*env.Builtin{ } return *spr default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "Load\\csv") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "Load\\csv") } }, }, @@ -2231,7 +2235,7 @@ var Builtins_table = map[string]*env.Builtin{ f, err := os.Create(file.GetPath()) if err != nil { // log.Fatal("Unable to read input file "+filePath, err) - return MakeBuiltinError(ps, "Unable to create input file.", "file-uri//Save\\csv") + return evaldo.MakeBuiltinError(ps, "Unable to create input file.", "file-uri//Save\\csv") } defer f.Close() @@ -2241,7 +2245,7 @@ var Builtins_table = map[string]*env.Builtin{ err1 := csvWriter.Write(spr.Cols) if err1 != nil { - return MakeBuiltinError(ps, "Unable to create write header.", "file-uri//Save\\csv") + return evaldo.MakeBuiltinError(ps, "Unable to create write header.", "file-uri//Save\\csv") } for ir, row := range spr.Rows { @@ -2269,17 +2273,17 @@ var Builtins_table = map[string]*env.Builtin{ } err := csvWriter.Write(strVals) if err != nil { - return MakeBuiltinError(ps, "Unable to write line: "+strconv.Itoa(ir), "file-uri//Save\\csv") + return evaldo.MakeBuiltinError(ps, "Unable to write line: "+strconv.Itoa(ir), "file-uri//Save\\csv") } } csvWriter.Flush() f.Close() return spr default: - return MakeArgError(ps, 2, []env.Type{env.TableType}, "file-uri//Save\\csv") + return evaldo.MakeArgError(ps, 2, []env.Type{env.TableType}, "file-uri//Save\\csv") } default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Save\\csv") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Save\\csv") } }, }, @@ -2311,7 +2315,7 @@ var Builtins_table = map[string]*env.Builtin{ f, err := os.Create(file.GetPath()) if err != nil { // log.Fatal("Unable to read input file "+filePath, err) - return MakeBuiltinError(ps, "Unable to create input file.", "file-uri//Save\\tsv") + return evaldo.MakeBuiltinError(ps, "Unable to create input file.", "file-uri//Save\\tsv") } defer f.Close() @@ -2321,7 +2325,7 @@ var Builtins_table = map[string]*env.Builtin{ csvWriter.Comma = '\t' err1 := csvWriter.Write(spr.Cols) if err1 != nil { - return MakeBuiltinError(ps, "Unable to create write header.", "file-uri//Save\\tsv") + return evaldo.MakeBuiltinError(ps, "Unable to create write header.", "file-uri//Save\\tsv") } for ir, row := range spr.Rows { @@ -2349,17 +2353,17 @@ var Builtins_table = map[string]*env.Builtin{ } err := csvWriter.Write(strVals) if err != nil { - return MakeBuiltinError(ps, "Unable to write line: "+strconv.Itoa(ir), "file-uri//Save\\tsv") + return evaldo.MakeBuiltinError(ps, "Unable to write line: "+strconv.Itoa(ir), "file-uri//Save\\tsv") } } csvWriter.Flush() f.Close() return spr default: - return MakeArgError(ps, 2, []env.Type{env.TableType}, "file-uri//Save\\tsv") + return evaldo.MakeArgError(ps, 2, []env.Type{env.TableType}, "file-uri//Save\\tsv") } default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Save\\tsv") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Save\\tsv") } }, }, @@ -2384,33 +2388,33 @@ var Builtins_table = map[string]*env.Builtin{ case env.Uri: f, err := excelize.OpenFile(file.GetPath()) if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Unable to open file: %s", err), "Load\\xlsx") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Unable to open file: %s", err), "Load\\xlsx") } defer f.Close() sheetMap := f.GetSheetMap() if len(sheetMap) == 0 { - return MakeBuiltinError(ps, "No sheets found in file", "Load\\xlsx") + return evaldo.MakeBuiltinError(ps, "No sheets found in file", "Load\\xlsx") } // sheets map index is 1-based sheetName := sheetMap[1] rows, err := f.Rows(sheetName) if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Unable to get rows from sheet: %s", err), "Load\\xlsx") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Unable to get rows from sheet: %s", err), "Load\\xlsx") } rows.Next() header, err := rows.Columns() if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Unable to get columns from sheet: %s", err), "Load\\xlsx") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Unable to get columns from sheet: %s", err), "Load\\xlsx") } if len(header) == 0 { - return MakeBuiltinError(ps, "Header row is empty", "Load\\xlsx") + return evaldo.MakeBuiltinError(ps, "Header row is empty", "Load\\xlsx") } spr := env.NewTable(header) for rows.Next() { row, err := rows.Columns() if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Unable to get row: %s", err), "Load\\xlsx") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Unable to get row: %s", err), "Load\\xlsx") } anyRow := make([]any, len(row)) for i, v := range row { @@ -2424,7 +2428,7 @@ var Builtins_table = map[string]*env.Builtin{ } return *spr default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "Load\\xlsx") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "Load\\xlsx") } }, }, @@ -2454,11 +2458,11 @@ var Builtins_table = map[string]*env.Builtin{ f := excelize.NewFile() index, err := f.NewSheet(sheetName) if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Unable to create new sheet: %s", err), "file-uri//Save\\xlsx") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Unable to create new sheet: %s", err), "file-uri//Save\\xlsx") } err = f.SetSheetRow(sheetName, "A1", &spr.Cols) if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Unable to set header row: %s", err), "file-uri//Save\\xlsx") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Unable to set header row: %s", err), "file-uri//Save\\xlsx") } for i, row := range spr.Rows { // 1-based and skip header row @@ -2479,25 +2483,25 @@ var Builtins_table = map[string]*env.Builtin{ case float64: vals[j] = val default: - return MakeBuiltinError(ps, fmt.Sprintf("Unable to save table: unsupported type %T", val), "file-uri//Save\\xlsx") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Unable to save table: unsupported type %T", val), "file-uri//Save\\xlsx") } } err = f.SetSheetRow(sheetName, fmt.Sprintf("A%d", rowIndex), &vals) if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Unable to set row %d: %s", rowIndex, err), "file-uri//Save\\xlsx") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Unable to set row %d: %s", rowIndex, err), "file-uri//Save\\xlsx") } } f.SetActiveSheet(index) err = f.SaveAs(file.GetPath()) if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Unable to save table: %s", err), "file-uri//Save\\xlsx") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Unable to save table: %s", err), "file-uri//Save\\xlsx") } return spr default: - return MakeArgError(ps, 2, []env.Type{env.TableType}, "file-uri//Save\\xlsx") + return evaldo.MakeArgError(ps, 2, []env.Type{env.TableType}, "file-uri//Save\\xlsx") } default: - return MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Save\\xlsx") + return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Save\\xlsx") } }, }, @@ -2613,14 +2617,14 @@ var Builtins_table = map[string]*env.Builtin{ case env.String: pt, err := env.NewPersistentTable(cols, dbPath.Value, tableName.Value) if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Failed to create persistent table: %v", err), "persistent-table") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to create persistent table: %v", err), "persistent-table") } return pt default: - return MakeArgError(ps, 3, []env.Type{env.StringType}, "persistent-table") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "persistent-table") } default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "persistent-table") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "persistent-table") } }, }, @@ -2638,11 +2642,11 @@ var Builtins_table = map[string]*env.Builtin{ case *env.PersistentTable: err := pt.Close() if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Failed to close persistent table: %v", err), "close-persistent-table!") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to close persistent table: %v", err), "close-persistent-table!") } return pt default: - return MakeArgError(ps, 1, []env.Type{env.PersistentTableType}, "close-persistent-table!") + return evaldo.MakeArgError(ps, 1, []env.Type{env.PersistentTableType}, "close-persistent-table!") } }, }, @@ -2662,10 +2666,10 @@ var Builtins_table = map[string]*env.Builtin{ csvReader := csv.NewReader(strings.NewReader(csvData.Value)) rows, err := csvReader.ReadAll() if err != nil { - return MakeBuiltinError(ps, "Unable to parse string as CSV: "+err.Error(), "parse\\csv") + return evaldo.MakeBuiltinError(ps, "Unable to parse string as CSV: "+err.Error(), "parse\\csv") } if len(rows) == 0 { - return MakeBuiltinError(ps, "CSV data is empty", "parse\\csv") + return evaldo.MakeBuiltinError(ps, "CSV data is empty", "parse\\csv") } spr := env.NewTable(rows[0]) if len(rows) > 1 { @@ -2679,7 +2683,7 @@ var Builtins_table = map[string]*env.Builtin{ } return *spr default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "parse\\csv") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "parse\\csv") } }, }, @@ -2700,16 +2704,16 @@ var Builtins_table = map[string]*env.Builtin{ switch separator := arg1.(type) { case env.String: if len(separator.Value) != 1 { - return MakeBuiltinError(ps, "Separator must be exactly 1 character long", "parse\\csv\\separator") + return evaldo.MakeBuiltinError(ps, "Separator must be exactly 1 character long", "parse\\csv\\separator") } csvReader := csv.NewReader(strings.NewReader(csvData.Value)) csvReader.Comma = rune(separator.Value[0]) rows, err := csvReader.ReadAll() if err != nil { - return MakeBuiltinError(ps, "Unable to parse string as CSV: "+err.Error(), "parse\\csv\\separator") + return evaldo.MakeBuiltinError(ps, "Unable to parse string as CSV: "+err.Error(), "parse\\csv\\separator") } if len(rows) == 0 { - return MakeBuiltinError(ps, "CSV data is empty", "parse\\csv\\separator") + return evaldo.MakeBuiltinError(ps, "CSV data is empty", "parse\\csv\\separator") } spr := env.NewTable(rows[0]) if len(rows) > 1 { @@ -2723,10 +2727,10 @@ var Builtins_table = map[string]*env.Builtin{ } return *spr default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "parse\\csv\\separator") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "parse\\csv\\separator") } default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "parse\\csv\\separator") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "parse\\csv\\separator") } }, }, @@ -2747,10 +2751,10 @@ var Builtins_table = map[string]*env.Builtin{ csvReader.Comma = '\t' rows, err := csvReader.ReadAll() if err != nil { - return MakeBuiltinError(ps, "Unable to parse string as TSV: "+err.Error(), "parse\\tsv") + return evaldo.MakeBuiltinError(ps, "Unable to parse string as TSV: "+err.Error(), "parse\\tsv") } if len(rows) == 0 { - return MakeBuiltinError(ps, "TSV data is empty", "parse\\tsv") + return evaldo.MakeBuiltinError(ps, "TSV data is empty", "parse\\tsv") } spr := env.NewTable(rows[0]) if len(rows) > 1 { @@ -2764,7 +2768,7 @@ var Builtins_table = map[string]*env.Builtin{ } return *spr default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "parse\\tsv") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "parse\\tsv") } }, }, @@ -2789,7 +2793,7 @@ var Builtins_table = map[string]*env.Builtin{ // Write header err1 := csvWriter.Write(spr.Cols) if err1 != nil { - return MakeBuiltinError(ps, "Unable to write header.", "format\\csv") + return evaldo.MakeBuiltinError(ps, "Unable to write header.", "format\\csv") } // Write data rows @@ -2818,13 +2822,13 @@ var Builtins_table = map[string]*env.Builtin{ } err := csvWriter.Write(strVals) if err != nil { - return MakeBuiltinError(ps, "Unable to write line: "+strconv.Itoa(ir), "format\\csv") + return evaldo.MakeBuiltinError(ps, "Unable to write line: "+strconv.Itoa(ir), "format\\csv") } } csvWriter.Flush() return *env.NewString(buf.String()) default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "format\\csv") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "format\\csv") } }, }, @@ -2850,7 +2854,7 @@ var Builtins_table = map[string]*env.Builtin{ // Write header err1 := csvWriter.Write(spr.Cols) if err1 != nil { - return MakeBuiltinError(ps, "Unable to write header.", "format\\tsv") + return evaldo.MakeBuiltinError(ps, "Unable to write header.", "format\\tsv") } // Write data rows @@ -2879,13 +2883,13 @@ var Builtins_table = map[string]*env.Builtin{ } err := csvWriter.Write(strVals) if err != nil { - return MakeBuiltinError(ps, "Unable to write line: "+strconv.Itoa(ir), "format\\tsv") + return evaldo.MakeBuiltinError(ps, "Unable to write line: "+strconv.Itoa(ir), "format\\tsv") } } csvWriter.Flush() return *env.NewString(buf.String()) default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "format\\tsv") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "format\\tsv") } }, }, @@ -2907,13 +2911,13 @@ var Builtins_table = map[string]*env.Builtin{ case env.Bytes: data = input.Value default: - return MakeArgError(ps, 1, []env.Type{env.StringType, env.BytesType}, "parse\\xlsx") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType, env.BytesType}, "parse\\xlsx") } // Create a temporary file to write the binary data tmpFile, err := os.CreateTemp("", "parse_xlsx_*.xlsx") if err != nil { - return MakeBuiltinError(ps, "Unable to create temporary file: "+err.Error(), "parse\\xlsx") + return evaldo.MakeBuiltinError(ps, "Unable to create temporary file: "+err.Error(), "parse\\xlsx") } defer os.Remove(tmpFile.Name()) defer tmpFile.Close() @@ -2921,40 +2925,40 @@ var Builtins_table = map[string]*env.Builtin{ // Write the binary data to the temporary file _, err = tmpFile.Write(data) if err != nil { - return MakeBuiltinError(ps, "Unable to write to temporary file: "+err.Error(), "parse\\xlsx") + return evaldo.MakeBuiltinError(ps, "Unable to write to temporary file: "+err.Error(), "parse\\xlsx") } tmpFile.Close() // Open and parse the xlsx file f, err := excelize.OpenFile(tmpFile.Name()) if err != nil { - return MakeBuiltinError(ps, "Unable to open xlsx data: "+err.Error(), "parse\\xlsx") + return evaldo.MakeBuiltinError(ps, "Unable to open xlsx data: "+err.Error(), "parse\\xlsx") } defer f.Close() sheetMap := f.GetSheetMap() if len(sheetMap) == 0 { - return MakeBuiltinError(ps, "No sheets found in xlsx data", "parse\\xlsx") + return evaldo.MakeBuiltinError(ps, "No sheets found in xlsx data", "parse\\xlsx") } // sheets map index is 1-based sheetName := sheetMap[1] rows, err := f.Rows(sheetName) if err != nil { - return MakeBuiltinError(ps, "Unable to get rows from sheet: "+err.Error(), "parse\\xlsx") + return evaldo.MakeBuiltinError(ps, "Unable to get rows from sheet: "+err.Error(), "parse\\xlsx") } rows.Next() header, err := rows.Columns() if err != nil { - return MakeBuiltinError(ps, "Unable to get columns from sheet: "+err.Error(), "parse\\xlsx") + return evaldo.MakeBuiltinError(ps, "Unable to get columns from sheet: "+err.Error(), "parse\\xlsx") } if len(header) == 0 { - return MakeBuiltinError(ps, "Header row is empty", "parse\\xlsx") + return evaldo.MakeBuiltinError(ps, "Header row is empty", "parse\\xlsx") } spr := env.NewTable(header) for rows.Next() { row, err := rows.Columns() if err != nil { - return MakeBuiltinError(ps, "Unable to get row: "+err.Error(), "parse\\xlsx") + return evaldo.MakeBuiltinError(ps, "Unable to get row: "+err.Error(), "parse\\xlsx") } anyRow := make([]any, len(header)) for i, v := range row { @@ -2987,11 +2991,11 @@ var Builtins_table = map[string]*env.Builtin{ f := excelize.NewFile() index, err := f.NewSheet(sheetName) if err != nil { - return MakeBuiltinError(ps, "Unable to create new sheet: "+err.Error(), "format\\xlsx") + return evaldo.MakeBuiltinError(ps, "Unable to create new sheet: "+err.Error(), "format\\xlsx") } err = f.SetSheetRow(sheetName, "A1", &spr.Cols) if err != nil { - return MakeBuiltinError(ps, "Unable to set header row: "+err.Error(), "format\\xlsx") + return evaldo.MakeBuiltinError(ps, "Unable to set header row: "+err.Error(), "format\\xlsx") } for i, row := range spr.Rows { // 1-based and skip header row @@ -3012,12 +3016,12 @@ var Builtins_table = map[string]*env.Builtin{ case float64: vals[j] = val default: - return MakeBuiltinError(ps, "Unable to format table: unsupported type "+fmt.Sprintf("%T", val), "format\\xlsx") + return evaldo.MakeBuiltinError(ps, "Unable to format table: unsupported type "+fmt.Sprintf("%T", val), "format\\xlsx") } } err = f.SetSheetRow(sheetName, fmt.Sprintf("A%d", rowIndex), &vals) if err != nil { - return MakeBuiltinError(ps, "Unable to set row "+strconv.Itoa(rowIndex)+": "+err.Error(), "format\\xlsx") + return evaldo.MakeBuiltinError(ps, "Unable to set row "+strconv.Itoa(rowIndex)+": "+err.Error(), "format\\xlsx") } } f.SetActiveSheet(index) @@ -3025,25 +3029,25 @@ var Builtins_table = map[string]*env.Builtin{ // Create temporary file to write xlsx data tmpFile, err := os.CreateTemp("", "format_xlsx_*.xlsx") if err != nil { - return MakeBuiltinError(ps, "Unable to create temporary file: "+err.Error(), "format\\xlsx") + return evaldo.MakeBuiltinError(ps, "Unable to create temporary file: "+err.Error(), "format\\xlsx") } defer os.Remove(tmpFile.Name()) defer tmpFile.Close() err = f.SaveAs(tmpFile.Name()) if err != nil { - return MakeBuiltinError(ps, "Unable to save xlsx data: "+err.Error(), "format\\xlsx") + return evaldo.MakeBuiltinError(ps, "Unable to save xlsx data: "+err.Error(), "format\\xlsx") } // Read the binary data back data, err := os.ReadFile(tmpFile.Name()) if err != nil { - return MakeBuiltinError(ps, "Unable to read xlsx data: "+err.Error(), "format\\xlsx") + return evaldo.MakeBuiltinError(ps, "Unable to read xlsx data: "+err.Error(), "format\\xlsx") } return *env.NewBytes(data) default: - return MakeArgError(ps, 1, []env.Type{env.TableType}, "format\\xlsx") + return evaldo.MakeArgError(ps, 1, []env.Type{env.TableType}, "format\\xlsx") } }, }, @@ -3071,7 +3075,7 @@ func ColNames(ps *env.ProgramState, from env.Object, fnName string) ([]string, e colNames := columns.Series numCols := colNames.Len() if numCols == 0 { - return nil, MakeBuiltinError(ps, "Block of column names is empty", fnName) + return nil, evaldo.MakeBuiltinError(ps, "Block of column names is empty", fnName) } cols := make([]string, numCols) for colNames.Pos() < numCols { @@ -3083,7 +3087,7 @@ func ColNames(ps *env.ProgramState, from env.Object, fnName string) ([]string, e case env.Tagword: cols[i] = ps.Idx.GetWord(k.Index) default: - return nil, MakeBuiltinError(ps, fmt.Sprintf("Expected a string or word instead of %V", k), fnName) + return nil, evaldo.MakeBuiltinError(ps, fmt.Sprintf("Expected a string or word instead of %V", k), fnName) } // TODO: Error here? } @@ -3092,7 +3096,7 @@ func ColNames(ps *env.ProgramState, from env.Object, fnName string) ([]string, e colNames := columns.Data numCols := len(colNames) if numCols == 0 { - return nil, MakeBuiltinError(ps, "Block of column names is empty", fnName) + return nil, evaldo.MakeBuiltinError(ps, "Block of column names is empty", fnName) } cols := make([]string, numCols) for i, k1 := range colNames { @@ -3102,18 +3106,18 @@ func ColNames(ps *env.ProgramState, from env.Object, fnName string) ([]string, e case env.Word: cols[i] = ps.Idx.GetWord(k.Index) default: - return nil, MakeBuiltinError(ps, fmt.Sprintf("Expected a string or word instead of %V", k), fnName) + return nil, evaldo.MakeBuiltinError(ps, fmt.Sprintf("Expected a string or word instead of %V", k), fnName) } // TODO: Error here? } return cols, nil default: - return nil, MakeBuiltinError(ps, fmt.Sprintf("Expected a block or a list instead of %V", from), fnName) + return nil, evaldo.MakeBuiltinError(ps, fmt.Sprintf("Expected a block or a list instead of %V", from), fnName) } } func MakeColError(ps *env.ProgramState, builtinName string, colName string, expectedRowCount int, actualRowCount int) *env.Error { - return MakeBuiltinError( + return evaldo.MakeBuiltinError( ps, fmt.Sprintf("Column %s should have %d rows of data, but has %d instead", colName, @@ -3151,7 +3155,7 @@ func GetNumRowsFrom(ps *env.ProgramState, data any) (int, *env.Error) { case env.List: return len(firstCol.Data), nil default: - return -1, MakeBuiltinError(ps, fmt.Sprintf("Expected a block or a list instead of %V", firstCol), "table\\columns") + return -1, evaldo.MakeBuiltinError(ps, fmt.Sprintf("Expected a block or a list instead of %V", firstCol), "table\\columns") } } @@ -3201,7 +3205,7 @@ func SheetFromColumnsMapData(ps *env.ProgramState, cols []string, arg1 env.Objec } return spr default: - return MakeBuiltinError(ps, fmt.Sprintf("Expected either a Block of a list of data columns, got %v instead", colSet), "table\\columns") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Expected either a Block of a list of data columns, got %v instead", colSet), "table\\columns") } } @@ -3218,7 +3222,7 @@ func TableRowsFromBlockOrList(ps *env.ProgramState, spr *env.Table, numCols int, switch row := arg1.(type) { case env.Block: if len(row.Series.S) != numCols { - return nil, MakeBuiltinError( + return nil, evaldo.MakeBuiltinError( ps, fmt.Sprintf("All rows must have the same number elements as the number of columns (%d)", numCols), "table\\rows", @@ -3232,7 +3236,7 @@ func TableRowsFromBlockOrList(ps *env.ProgramState, spr *env.Table, numCols int, return env.NewTableRow(rowAny, spr), nil case env.List: if len(row.Data) != numCols { - return nil, MakeBuiltinError( + return nil, evaldo.MakeBuiltinError( ps, fmt.Sprintf("All rows must have the same number elements as the number of columns (%d)", numCols), "table\\rows", @@ -3240,7 +3244,7 @@ func TableRowsFromBlockOrList(ps *env.ProgramState, spr *env.Table, numCols int, } return env.NewTableRow(row.Data, spr), nil default: - return nil, MakeBuiltinError(ps, "Rows must be blocks or lists", "table\\rows") + return nil, evaldo.MakeBuiltinError(ps, "Rows must be blocks or lists", "table\\rows") } } @@ -3251,7 +3255,7 @@ func DropColumnBlock(ps *env.ProgramState, s env.Table, names env.Block) env.Obj case env.Word: toDrop = append(toDrop, *env.NewString(ps.Idx.GetWord(word.Index))) default: - return MakeError(ps, "Cannot use a non-word to specify a column to drop") + return evaldo.MakeError(ps, "Cannot use a non-word to specify a column to drop") } } return DropColumns(ps, s, toDrop) @@ -3339,7 +3343,7 @@ func GenerateColumn(ps *env.ProgramState, s env.Table, name env.Word, extractCol } // fmt.Println(val) if er != nil { - return MakeBuiltinError(ps, er.Error(), "gen-column") + return evaldo.MakeBuiltinError(ps, er.Error(), "gen-column") } if firstVal == nil { var ok bool @@ -3358,7 +3362,7 @@ func GenerateColumn(ps *env.ProgramState, s env.Table, name env.Word, extractCol // execute the block of code injected with first value ser := ps.Ser ps.Ser = code.Series - EvalBlockInCtxInj(ps, ctx, firstVal, firstVal != nil) + evaldo.EvalBlockInCtxInj(ps, ctx, firstVal, firstVal != nil) if ps.ErrorFlag { return ps.Res } @@ -3379,7 +3383,7 @@ func GenerateColumnRegexReplace(ps *env.ProgramState, s *env.Table, name env.Wor // get value from current row val, err := s.GetRowValue(ps.Idx.GetWord(fromColName.Index), row) if err != nil { - return MakeError(ps, fmt.Sprintf("Couldn't retrieve value at row %d (%s)", ix, err)) + return evaldo.MakeError(ps, fmt.Sprintf("Couldn't retrieve value at row %d (%s)", ix, err)) } var newVal any @@ -3405,7 +3409,7 @@ func AddIndexes(ps *env.ProgramState, s *env.Table, columns []env.Word) env.Obje for ir, row := range s.Rows { val, err := s.GetRowValue(colstr, row) if err != nil { - return MakeError(ps, "Couldn't retrieve index at row "+strconv.Itoa(ir)) + return evaldo.MakeError(ps, "Couldn't retrieve index at row "+strconv.Itoa(ir)) } if subidx, ok := s.Indexes[colstr][val]; ok { s.Indexes[colstr][val] = append(subidx, ir) @@ -3428,7 +3432,7 @@ func SortByColumn(ps *env.ProgramState, s *env.Table, name string) { if s.Rows[j].Values[idx] == nil { return false } - return greaterThanNew(s.Rows[j].Values[idx].(env.Object), s.Rows[i].Values[idx].(env.Object)) + return evaldo.GreaterThanNew(s.Rows[j].Values[idx].(env.Object), s.Rows[i].Values[idx].(env.Object)) } sort.Slice(s.Rows, compareCol) @@ -3444,7 +3448,7 @@ func SortByColumnDesc(ps *env.ProgramState, s *env.Table, name string) { if s.Rows[i].Values[idx] == nil { return false } - return greaterThanNew(s.Rows[i].Values[idx].(env.Object), s.Rows[j].Values[idx].(env.Object)) + return evaldo.GreaterThanNew(s.Rows[i].Values[idx].(env.Object), s.Rows[j].Values[idx].(env.Object)) } sort.Slice(s.Rows, compareCol) @@ -3453,7 +3457,7 @@ func SortByColumnDesc(ps *env.ProgramState, s *env.Table, name string) { func WhereEquals(ps *env.ProgramState, s *env.Table, name string, val env.Object) env.Object { idx := slices.Index(s.Cols, name) if idx < 0 { - return MakeBuiltinError(ps, "Column not found.", "where-equal") + return evaldo.MakeBuiltinError(ps, "Column not found.", "where-equal") } nspr := env.NewTable(s.Cols) if index, ok := s.Indexes[name]; ok { @@ -3476,7 +3480,7 @@ func WhereEquals(ps *env.ProgramState, s *env.Table, name string, val env.Object func WhereNotEquals(ps *env.ProgramState, s *env.Table, name string, val env.Object) env.Object { idx := slices.Index(s.Cols, name) if idx < 0 { - return MakeBuiltinError(ps, "Column not found.", "where-not-equal") + return evaldo.MakeBuiltinError(ps, "Column not found.", "where-not-equal") } nspr := env.NewTable(s.Cols) for _, row := range s.Rows { @@ -3492,7 +3496,7 @@ func WhereNotEquals(ps *env.ProgramState, s *env.Table, name string, val env.Obj func WhereMatch(ps *env.ProgramState, s *env.Table, name string, r *regexp.Regexp) env.Object { idx := slices.Index(s.Cols, name) if idx < 0 { - return MakeBuiltinError(ps, "Column not found.", "where-match") + return evaldo.MakeBuiltinError(ps, "Column not found.", "where-match") } nspr := env.NewTable(s.Cols) for _, row := range s.Rows { @@ -3510,7 +3514,7 @@ func WhereMatch(ps *env.ProgramState, s *env.Table, name string, r *regexp.Regex func WhereContains(ps *env.ProgramState, s *env.Table, name string, val string, not bool) env.Object { idx := slices.Index(s.Cols, name) if idx < 0 { - return MakeBuiltinError(ps, "Column not found.", "where-contains") + return evaldo.MakeBuiltinError(ps, "Column not found.", "where-contains") } nspr := env.NewTable(s.Cols) for _, row := range s.Rows { @@ -3529,7 +3533,7 @@ func WhereContains(ps *env.ProgramState, s *env.Table, name string, val string, func WhereIn(ps *env.ProgramState, s *env.Table, name string, b []env.Object) env.Object { idx := slices.Index(s.Cols, name) if idx < 0 { - return MakeBuiltinError(ps, "Column not found.", "where-in") + return evaldo.MakeBuiltinError(ps, "Column not found.", "where-in") } nspr := env.NewTable(s.Cols) for _, row := range s.Rows { @@ -3546,7 +3550,7 @@ func WhereIn(ps *env.ProgramState, s *env.Table, name string, b []env.Object) en func WhereNotIn(ps *env.ProgramState, s *env.Table, name string, b []env.Object) env.Object { idx := slices.Index(s.Cols, name) if idx < 0 { - return MakeBuiltinError(ps, "Column not found.", "where-not-in") + return evaldo.MakeBuiltinError(ps, "Column not found.", "where-not-in") } nspr := env.NewTable(s.Cols) for _, row := range s.Rows { @@ -3563,7 +3567,7 @@ func WhereNotIn(ps *env.ProgramState, s *env.Table, name string, b []env.Object) func WhereBlock(ps *env.ProgramState, s *env.Table, name string, block env.Block) env.Object { idx := slices.Index(s.Cols, name) if idx < 0 { - return MakeBuiltinError(ps, "Column not found.", "where") + return evaldo.MakeBuiltinError(ps, "Column not found.", "where") } nspr := env.NewTable(s.Cols) ser := ps.Ser @@ -3571,7 +3575,7 @@ func WhereBlock(ps *env.ProgramState, s *env.Table, name string, block env.Block if len(row.Values) > idx { val := env.ToRyeValue(row.Values[idx]) ps.Ser = block.Series - EvalBlockInj(ps, val, true) + evaldo.EvalBlockInj(ps, val, true) if ps.ErrorFlag { ps.Ser = ser return ps.Res @@ -3589,13 +3593,13 @@ func WhereBlock(ps *env.ProgramState, s *env.Table, name string, block env.Block func WhereBuiltin(ps *env.ProgramState, s *env.Table, name string, builtin env.Builtin) env.Object { idx := slices.Index(s.Cols, name) if idx < 0 { - return MakeBuiltinError(ps, "Column not found.", "where") + return evaldo.MakeBuiltinError(ps, "Column not found.", "where") } nspr := env.NewTable(s.Cols) for _, row := range s.Rows { if len(row.Values) > idx { val := env.ToRyeValue(row.Values[idx]) - res := DirectlyCallBuiltin(ps, builtin, val, nil) + res := evaldo.DirectlyCallBuiltin(ps, builtin, val, nil) if ps.ErrorFlag { return ps.Res } @@ -3610,13 +3614,13 @@ func WhereBuiltin(ps *env.ProgramState, s *env.Table, name string, builtin env.B func WhereFunction(ps *env.ProgramState, s *env.Table, name string, fn env.Function) env.Object { idx := slices.Index(s.Cols, name) if idx < 0 { - return MakeBuiltinError(ps, "Column not found.", "where") + return evaldo.MakeBuiltinError(ps, "Column not found.", "where") } nspr := env.NewTable(s.Cols) for _, row := range s.Rows { if len(row.Values) > idx { val := env.ToRyeValue(row.Values[idx]) - CallFunctionArgsN(fn, ps, ps.Ctx, val) + evaldo.CallFunctionArgsN(fn, ps, ps.Ctx, val) if ps.ErrorFlag { return ps.Res } @@ -3645,12 +3649,12 @@ func WhereBlockMultiCol(ps *env.ProgramState, s *env.Table, cols env.Block, code wordIdx = w.Index default: ps.Ser = ser - return MakeBuiltinError(ps, "Column names block must contain only words.", "where") + return evaldo.MakeBuiltinError(ps, "Column names block must contain only words.", "where") } val, err := s.GetRowValue(ps.Idx.GetWord(wordIdx), row) if err != nil { ps.Ser = ser - return MakeBuiltinError(ps, err.Error(), "where") + return evaldo.MakeBuiltinError(ps, err.Error(), "where") } if val == nil { val = env.NewVoid() @@ -3663,7 +3667,7 @@ func WhereBlockMultiCol(ps *env.ProgramState, s *env.Table, cols env.Block, code } // execute the block of code in context, injected with first value ps.Ser = code.Series - EvalBlockInCtxInj(ps, ctx, firstVal, firstVal != nil) + evaldo.EvalBlockInCtxInj(ps, ctx, firstVal, firstVal != nil) if ps.ErrorFlag { ps.Ser = ser return ps.Res @@ -3683,7 +3687,7 @@ func Distinct(ps *env.ProgramState, s *env.Table, colNames []string) env.Object for i, name := range colNames { idx := slices.Index(s.Cols, name) if idx < 0 { - return MakeBuiltinError(ps, "Column not found: "+name, "distinct") + return evaldo.MakeBuiltinError(ps, "Column not found: "+name, "distinct") } colIdxs[i] = idx } @@ -3718,7 +3722,7 @@ func Distinct(ps *env.ProgramState, s *env.Table, colNames []string) env.Object func FillVoid(ps *env.ProgramState, s *env.Table, colName string, fillValue env.Object) env.Object { idx := slices.Index(s.Cols, colName) if idx < 0 { - return MakeBuiltinError(ps, "Column not found.", "fill-void") + return evaldo.MakeBuiltinError(ps, "Column not found.", "fill-void") } nspr := env.NewTable(s.Cols) @@ -3741,7 +3745,7 @@ func FillVoid(ps *env.ProgramState, s *env.Table, colName string, fillValue env. func CountWhereBlock(ps *env.ProgramState, s *env.Table, name string, block env.Block) env.Object { idx := slices.Index(s.Cols, name) if idx < 0 { - return MakeBuiltinError(ps, "Column not found.", "count-where") + return evaldo.MakeBuiltinError(ps, "Column not found.", "count-where") } count := 0 ser := ps.Ser @@ -3749,7 +3753,7 @@ func CountWhereBlock(ps *env.ProgramState, s *env.Table, name string, block env. if len(row.Values) > idx { val := env.ToRyeValue(row.Values[idx]) ps.Ser = block.Series - EvalBlockInj(ps, val, true) + evaldo.EvalBlockInj(ps, val, true) if ps.ErrorFlag { ps.Ser = ser return ps.Res @@ -3767,13 +3771,13 @@ func CountWhereBlock(ps *env.ProgramState, s *env.Table, name string, block env. func CountWhereBuiltin(ps *env.ProgramState, s *env.Table, name string, builtin env.Builtin) env.Object { idx := slices.Index(s.Cols, name) if idx < 0 { - return MakeBuiltinError(ps, "Column not found.", "count-where") + return evaldo.MakeBuiltinError(ps, "Column not found.", "count-where") } count := 0 for _, row := range s.Rows { if len(row.Values) > idx { val := env.ToRyeValue(row.Values[idx]) - res := DirectlyCallBuiltin(ps, builtin, val, nil) + res := evaldo.DirectlyCallBuiltin(ps, builtin, val, nil) if ps.ErrorFlag { return ps.Res } @@ -3788,13 +3792,13 @@ func CountWhereBuiltin(ps *env.ProgramState, s *env.Table, name string, builtin func CountWhereFunction(ps *env.ProgramState, s *env.Table, name string, fn env.Function) env.Object { idx := slices.Index(s.Cols, name) if idx < 0 { - return MakeBuiltinError(ps, "Column not found.", "count-where") + return evaldo.MakeBuiltinError(ps, "Column not found.", "count-where") } count := 0 for _, row := range s.Rows { if len(row.Values) > idx { val := env.ToRyeValue(row.Values[idx]) - CallFunctionArgsN(fn, ps, ps.Ctx, val) + evaldo.CallFunctionArgsN(fn, ps, ps.Ctx, val) if ps.ErrorFlag { return ps.Res } @@ -3823,12 +3827,12 @@ func CountWhereBlockMultiCol(ps *env.ProgramState, s *env.Table, cols env.Block, wordIdx = w.Index default: ps.Ser = ser - return MakeBuiltinError(ps, "Column names block must contain only words.", "count-where") + return evaldo.MakeBuiltinError(ps, "Column names block must contain only words.", "count-where") } val, err := s.GetRowValue(ps.Idx.GetWord(wordIdx), row) if err != nil { ps.Ser = ser - return MakeBuiltinError(ps, err.Error(), "count-where") + return evaldo.MakeBuiltinError(ps, err.Error(), "count-where") } if val == nil { val = env.NewVoid() @@ -3841,7 +3845,7 @@ func CountWhereBlockMultiCol(ps *env.ProgramState, s *env.Table, cols env.Block, } // execute the block of code in context, injected with first value ps.Ser = code.Series - EvalBlockInCtxInj(ps, ctx, firstVal, firstVal != nil) + evaldo.EvalBlockInCtxInj(ps, ctx, firstVal, firstVal != nil) if ps.ErrorFlag { ps.Ser = ser return ps.Res @@ -3858,13 +3862,13 @@ func CountWhereBlockMultiCol(ps *env.ProgramState, s *env.Table, cols env.Block, func WhereGreater(ps *env.ProgramState, s *env.Table, name string, val env.Object) env.Object { idx := slices.Index(s.Cols, name) if idx < 0 { - return MakeBuiltinError(ps, "Column not found.", "where-greater") + return evaldo.MakeBuiltinError(ps, "Column not found.", "where-greater") } nspr := env.NewTable(s.Cols) for _, row := range s.Rows { if len(row.Values) > idx { rv := env.ToRyeValue(row.Values[idx]) - if greaterThanNew(rv, val) { + if evaldo.GreaterThanNew(rv, val) { nspr.AddRow(row) } } @@ -3875,13 +3879,13 @@ func WhereGreater(ps *env.ProgramState, s *env.Table, name string, val env.Objec func WhereLesser(ps *env.ProgramState, s *env.Table, name string, val env.Object) env.Object { idx := slices.Index(s.Cols, name) if idx < 0 { - return MakeBuiltinError(ps, "Column not found.", "where-lesser") + return evaldo.MakeBuiltinError(ps, "Column not found.", "where-lesser") } nspr := env.NewTable(s.Cols) for _, row := range s.Rows { if len(row.Values) > idx { rv := env.ToRyeValue(row.Values[idx]) - if lesserThanNew(rv, val) { + if evaldo.LesserThanNew(rv, val) { nspr.AddRow(row) } } @@ -3892,18 +3896,18 @@ func WhereLesser(ps *env.ProgramState, s *env.Table, name string, val env.Object func WhereBetween(ps *env.ProgramState, s *env.Table, name string, val1 env.Object, val2 env.Object, inclusiveMode bool) env.Object { idx := slices.Index(s.Cols, name) if idx < 0 { - return MakeBuiltinError(ps, "Column not found.", "where-between") + return evaldo.MakeBuiltinError(ps, "Column not found.", "where-between") } nspr := env.NewTable(s.Cols) for _, row := range s.Rows { if len(row.Values) > idx { rv := env.ToRyeValue(row.Values[idx]) if inclusiveMode { - if !greaterThanNew(rv, val2) && !lesserThanNew(rv, val1) { + if !evaldo.GreaterThanNew(rv, val2) && !evaldo.LesserThanNew(rv, val1) { nspr.AddRow(row) } } else { - if greaterThanNew(rv, val1) && lesserThanNew(rv, val2) { + if evaldo.GreaterThanNew(rv, val1) && evaldo.LesserThanNew(rv, val2) { nspr.AddRow(row) } } @@ -3995,10 +3999,10 @@ func AutoType(ps *env.ProgramState, s *env.Table, percent float64) env.Object { func LeftJoin(ps *env.ProgramState, s1 env.Table, s2 env.Table, col1 string, col2 string, innerJoin bool) env.Object { if !slices.Contains(s1.Cols, col1) { - return MakeBuiltinError(ps, "Column not found in first table.", "left-join") + return evaldo.MakeBuiltinError(ps, "Column not found in first table.", "left-join") } if !slices.Contains(s2.Cols, col2) { - return MakeBuiltinError(ps, "Column not found in second table.", "left-join") + return evaldo.MakeBuiltinError(ps, "Column not found in second table.", "left-join") } combinedCols := make([]string, len(s1.Cols)+len(s2.Cols)) @@ -4014,7 +4018,7 @@ func LeftJoin(ps *env.ProgramState, s1 env.Table, s2 env.Table, col1 string, col for i, row1 := range s1.GetRows() { val1, err := s1.GetRowValue(col1, row1) if err != nil { - return MakeError(ps, fmt.Sprintf("Couldn't retrieve value at row %d (%s)", i, err)) + return evaldo.MakeError(ps, fmt.Sprintf("Couldn't retrieve value at row %d (%s)", i, err)) } // the row ids of the second table which match the values in the current first table row @@ -4028,7 +4032,7 @@ func LeftJoin(ps *env.ProgramState, s1 env.Table, s2 env.Table, col1 string, col for j, row2 := range s2.GetRows() { val2, err := s2.GetRowValue(col2, row2) if err != nil { - return MakeError(ps, fmt.Sprintf("Couldn't retrieve value at row %d (%s)", j, err)) + return evaldo.MakeError(ps, fmt.Sprintf("Couldn't retrieve value at row %d (%s)", j, err)) } val1o, ok := val1.(env.Object) if ok { @@ -4095,7 +4099,7 @@ func GroupBy(ps *env.ProgramState, s env.Table, cols []string, aggregations map[ // Validate that all grouping columns exist for _, col := range cols { if !slices.Contains(s.Cols, col) { - return MakeBuiltinError(ps, fmt.Sprintf("Column '%s' not found.", col), "group-by") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Column '%s' not found.", col), "group-by") } } @@ -4107,7 +4111,7 @@ func GroupBy(ps *env.ProgramState, s env.Table, cols []string, aggregations map[ for j, col := range cols { groupingVal, err := s.GetRowValue(col, row) if err != nil { - return MakeError(ps, fmt.Sprintf("Couldn't retrieve value at row %d (%s)", i, err)) + return evaldo.MakeError(ps, fmt.Sprintf("Couldn't retrieve value at row %d (%s)", i, err)) } var groupValStr string switch val := groupingVal.(type) { @@ -4120,7 +4124,7 @@ func GroupBy(ps *env.ProgramState, s env.Table, cols []string, aggregations map[ case int: groupValStr = strconv.Itoa(val) default: - return MakeBuiltinError(ps, "Grouping column value must be a string or number", "group-by") + return evaldo.MakeBuiltinError(ps, "Grouping column value must be a string or number", "group-by") } groupKeyParts[j] = groupValStr } @@ -4145,14 +4149,14 @@ func GroupBy(ps *env.ProgramState, s env.Table, cols []string, aggregations map[ } } if !isGroupingCol { - return MakeBuiltinError(ps, "Count aggregation can only be applied on the grouping columns", "group-by") + return evaldo.MakeBuiltinError(ps, "Count aggregation can only be applied on the grouping columns", "group-by") } groupAggregates[colAgg]++ continue } valObj, err := s.GetRowValue(aggCol, row) if err != nil { - return MakeError(ps, fmt.Sprintf("Couldn't retrieve value at row %d (%s)", i, err)) + return evaldo.MakeError(ps, fmt.Sprintf("Couldn't retrieve value at row %d (%s)", i, err)) } var val float64 switch valObj := env.ToRyeValue(valObj).(type) { @@ -4161,7 +4165,7 @@ func GroupBy(ps *env.ProgramState, s env.Table, cols []string, aggregations map[ case env.Decimal: val = valObj.Value default: - return MakeBuiltinError(ps, "Aggregation column value must be a number", "group-by") + return evaldo.MakeBuiltinError(ps, "Aggregation column value must be a number", "group-by") } switch fun { case "sum": @@ -4178,7 +4182,7 @@ func GroupBy(ps *env.ProgramState, s env.Table, cols []string, aggregations map[ groupAggregates[colAgg] = val } default: - return MakeBuiltinError(ps, fmt.Sprintf("Unknown aggregation function: %s", fun), "group-by") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Unknown aggregation function: %s", fun), "group-by") } } } diff --git a/batteries/builtins_table_not.go b/batteries/builtins_table_not.go new file mode 100644 index 00000000..267e148c --- /dev/null +++ b/batteries/builtins_table_not.go @@ -0,0 +1,12 @@ +//go:build no_table +// +build no_table + +package batteries + +import ( + "github.com/refaktor/rye/env" +) + +// Builtins_table is empty when the no_table build tag is active. +// This removes the excelize (xlsx) dependency. +var Builtins_table = map[string]*env.Builtin{} diff --git a/evaldo/builtins_telegrambot.go b/batteries/builtins_telegrambot.go old mode 100755 new mode 100644 similarity index 79% rename from evaldo/builtins_telegrambot.go rename to batteries/builtins_telegrambot.go index 9875c658..dbd8d0d7 --- a/evaldo/builtins_telegrambot.go +++ b/batteries/builtins_telegrambot.go @@ -1,13 +1,14 @@ //go:build !no_telegram // +build !no_telegram -package evaldo +package batteries import ( "fmt" "github.com/jinzhu/copier" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" tgm "github.com/go-telegram-bot-api/telegram-bot-api" ) @@ -68,11 +69,11 @@ var Builtins_telegrambot = map[string]*env.Builtin{ case env.String: bot, err := tgm.NewBotAPI(arg.Value) if err != nil { - return MakeBuiltinError(ps, "Error in NewBotAPI function.", "new-telegram-bot") + return evaldo.MakeBuiltinError(ps, "Error in NewBotAPI function.", "new-telegram-bot") } return *env.NewNative(ps.Idx, bot, "telegram-bot") default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "new-telegram-bot") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "new-telegram-bot") } }, }, @@ -94,7 +95,7 @@ var Builtins_telegrambot = map[string]*env.Builtin{ for update := range updates { dict := TelegramUpdateToRyeDict(update) - EvalBlockInj(ps, dict, true) + evaldo.EvalBlockInj(ps, dict, true) if ps.ErrorFlag { ps.Ser = ser return ps.Res @@ -118,17 +119,17 @@ var Builtins_telegrambot = map[string]*env.Builtin{ err := copier.Copy(&psTemp, &ps) if err != nil { fmt.Println(err.Error()) - // TODO return makeError(ps, err.Error()) + // TODO return evaldo.MakeError(ps, err.Error()) } - CallFunctionArgsN(code, ps, nil, dict) + evaldo.CallFunctionArgsN(code, ps, nil, dict) } return env.NewInteger(1) default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "telegram-bot//on-update") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "telegram-bot//on-update") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "telegram-bot//on-update") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "telegram-bot//on-update") } }, }, @@ -143,14 +144,14 @@ var Builtins_telegrambot = map[string]*env.Builtin{ case env.Native: _, err := bot.Value.(*tgm.BotAPI).Send(msg.Value.(*tgm.MessageConfig)) if err != nil { - return makeError(ps, err.Error()) + return evaldo.MakeError(ps, err.Error()) } return arg0 default: - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "telegram-message//send") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "telegram-message//send") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "telegram-message//send") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "telegram-message//send") } }, @@ -168,10 +169,10 @@ var Builtins_telegrambot = map[string]*env.Builtin{ message.ParseMode = mode.Value return msg default: - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "telegram-message//send") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "telegram-message//send") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "telegram-message//send") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "telegram-message//send") } }, @@ -189,10 +190,10 @@ var Builtins_telegrambot = map[string]*env.Builtin{ msg.ParseMode = "HTML" return *env.NewNative(ps.Idx, &msg, "telegram-message") default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "new-telegram-message") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "new-telegram-message") } default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "new-telegram-message") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "new-telegram-message") } }, }, diff --git a/evaldo/builtins_telegrambot_not.go b/batteries/builtins_telegrambot_not.go old mode 100755 new mode 100644 similarity index 88% rename from evaldo/builtins_telegrambot_not.go rename to batteries/builtins_telegrambot_not.go index 5bc0adaf..a6984738 --- a/evaldo/builtins_telegrambot_not.go +++ b/batteries/builtins_telegrambot_not.go @@ -1,7 +1,7 @@ //go:build no_telegram // +build no_telegram -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_term.go b/batteries/builtins_term.go similarity index 95% rename from evaldo/builtins_term.go rename to batteries/builtins_term.go index 937944bc..6b7417f0 100644 --- a/evaldo/builtins_term.go +++ b/batteries/builtins_term.go @@ -1,7 +1,7 @@ //go:build !b_no_term // +build !b_no_term -package evaldo +package batteries import ( "fmt" @@ -13,6 +13,7 @@ import ( "github.com/muesli/reflow/wordwrap" "github.com/muesli/reflow/wrap" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/refaktor/rye/term" goterm "golang.org/x/term" ) @@ -55,7 +56,7 @@ var Builtins_term = map[string]*env.Builtin{ } return *env.NewInteger(1) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "cursor-up") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "cursor-up") } }, }, @@ -77,7 +78,7 @@ var Builtins_term = map[string]*env.Builtin{ } return *env.NewInteger(1) default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "cursor-down") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "cursor-down") } }, }, @@ -155,11 +156,11 @@ var Builtins_term = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { text, ok := arg0.(env.String) if !ok { - return MakeArgError(ps, 1, []env.Type{env.StringType}, "wrap") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "wrap") } wdth, ok := arg1.(env.Integer) if !ok { - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "wrap") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "wrap") } mkd := wrap.String(text.Value, int(wdth.Value)) return *env.NewString(mkd) @@ -179,11 +180,11 @@ var Builtins_term = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { text, ok := arg0.(env.String) if !ok { - return MakeArgError(ps, 1, []env.Type{env.StringType}, "wrap\\words") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "wrap\\words") } wdth, ok := arg1.(env.Integer) if !ok { - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "wrap\\words") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "wrap\\words") } mkd := wordwrap.String(text.Value, int(wdth.Value)) return *env.NewString(mkd) @@ -203,11 +204,11 @@ var Builtins_term = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { text, ok := arg0.(env.String) if !ok { - return MakeArgError(ps, 1, []env.Type{env.StringType}, "indent") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "indent") } wdth, ok := arg1.(env.Integer) if !ok { - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "indent") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "indent") } mkd := indent.String(text.Value, uint(wdth.Value)) return *env.NewString(mkd) @@ -227,7 +228,7 @@ var Builtins_term = map[string]*env.Builtin{ fd := int(os.Stdout.Fd()) width, _, err := goterm.GetSize(fd) if err != nil { - return MakeBuiltinError(ps, err.Error(), "width?") + return evaldo.MakeBuiltinError(ps, err.Error(), "width?") } return env.NewInteger(int64(width)) }, @@ -813,8 +814,8 @@ var Builtins_term = map[string]*env.Builtin{ ps.Ser = bloc.Series ps.BlockFile = bloc.FileName ps.BlockLine = bloc.Line - Eval(ps) - MaybeDisplayFailureOrError(ps, ps.Idx, "spin-it") + evaldo.Eval(ps) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "spin-it") ps.Ser = ser done <- true }() @@ -844,10 +845,10 @@ var Builtins_term = map[string]*env.Builtin{ fmt.Println("") return ps.Res default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "spin-it") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "spin-it") } default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "spin-it") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "spin-it") } }, }, @@ -865,11 +866,11 @@ var Builtins_term = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { title, ok1 := arg0.(env.String) if !ok1 { - return MakeArgError(ps, 1, []env.Type{env.StringType}, "pane") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "pane") } content, ok2 := arg1.(env.String) if !ok2 { - return MakeArgError(ps, 2, []env.Type{env.StringType}, "pane") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "pane") } // Split content into lines diff --git a/evaldo/builtins_termstr.go b/batteries/builtins_termstr.go similarity index 99% rename from evaldo/builtins_termstr.go rename to batteries/builtins_termstr.go index 106ff1a6..6adae096 100644 --- a/evaldo/builtins_termstr.go +++ b/batteries/builtins_termstr.go @@ -1,7 +1,7 @@ //go:build !b_no_term // +build !b_no_term -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/batteries/builtins_tinygo.go b/batteries/builtins_tinygo.go new file mode 100644 index 00000000..62718bcb --- /dev/null +++ b/batteries/builtins_tinygo.go @@ -0,0 +1,29 @@ +//go:build tinygo +// +build tinygo + +package batteries + +import ( + "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" +) + +// RegisterBuiltinsTinyGo is a simplified version of RegisterBuiltins for TinyGo +func RegisterBuiltinsTinyGo(ps *env.ProgramState) { + evaldo.BuiltinNames = make(map[string]int) + + // Register only the base builtins + evaldo.RegisterBuiltins2(builtins, ps, "base") + evaldo.RegisterBuiltins2(builtins_boolean, ps, "base") + evaldo.RegisterBuiltins2(builtins_numbers, ps, "base") + evaldo.RegisterBuiltins2(builtins_string, ps, "base") + evaldo.RegisterBuiltins2(builtins_collection, ps, "base") + evaldo.RegisterBuiltins2(builtins_conditionals, ps, "base") + evaldo.RegisterBuiltins2(builtins_printing, ps, "base") + evaldo.RegisterBuiltins2(builtins_types, ps, "base") + evaldo.RegisterBuiltins2(builtins_functions, ps, "base") + evaldo.RegisterBuiltins2(builtins_apply, ps, "base") + evaldo.RegisterBuiltins2(builtins_iteration, ps, "base") + evaldo.RegisterBuiltins2(builtins_contexts, ps, "base") + evaldo.RegisterBuiltins2(builtins_time, ps, "base") +} diff --git a/evaldo/builtins_trees.go b/batteries/builtins_trees.go similarity index 88% rename from evaldo/builtins_trees.go rename to batteries/builtins_trees.go index 893fb461..24b726d4 100644 --- a/evaldo/builtins_trees.go +++ b/batteries/builtins_trees.go @@ -1,10 +1,11 @@ // builtins_trees.go -package evaldo +package batteries import ( "fmt" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/refaktor/rye/util" ) @@ -56,7 +57,7 @@ var builtins_trees = map[string]*env.Builtin{ // ps.Ser.Reset() fmt.Println(ps) fmt.Println(ps.Ser) - Eval(ps) + evaldo.Eval(ps) if ps.ErrorFlag { fmt.Println("***1") ps.Ser = ser @@ -70,7 +71,7 @@ var builtins_trees = map[string]*env.Builtin{ ser = ps.Ser ps.Ser = bodyBlock.Series ps.Ser.Reset() - Eval(ps) + evaldo.Eval(ps) if ps.ErrorFlag || ps.ReturnFlag { fmt.Println("***2") ps.Ser = ser @@ -84,7 +85,7 @@ var builtins_trees = map[string]*env.Builtin{ res := make([]env.Object, 0) for ps.Ser.Pos() < ps.Ser.Len() { // ps, injnow = EvalExpressionInj(ps, inj, injnow) - EvalExpression_CollectArg(ps, false, false) + evaldo.EvalExpression_CollectArg(ps, false, false) if ps.ReturnFlag || ps.ErrorFlag { return ps.Res } @@ -102,7 +103,7 @@ var builtins_trees = map[string]*env.Builtin{ /* Get child nodes using branch block ps.Ser = branchBlock.Series ps.Ser.Reset() - Eval(ps) + evaldo.Eval(ps) if ps.ErrorFlag { fmt.Println("***3") fmt.Println(ps.Res) @@ -142,16 +143,16 @@ var builtins_trees = map[string]*env.Builtin{ ps.Ser = ser return result default: - return MakeArgError(ps, 4, []env.Type{env.BlockType}, "for-tree") + return evaldo.MakeArgError(ps, 4, []env.Type{env.BlockType}, "for-tree") } default: - return MakeArgError(ps, 3, []env.Type{env.BlockType}, "for-tree") + return evaldo.MakeArgError(ps, 3, []env.Type{env.BlockType}, "for-tree") } default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "for-tree") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "for-tree") } default: - return MakeArgError(ps, 1, []env.Type{env.WordType}, "for-tree") + return evaldo.MakeArgError(ps, 1, []env.Type{env.WordType}, "for-tree") } }, }, @@ -208,14 +209,14 @@ var builtins_trees = map[string]*env.Builtin{ case env.Block: ps.Ser = transformer.Series ps.Ser.Reset() - EvalBlockInj(ps, env.ToRyeValue(v), true) + evaldo.EvalBlockInj(ps, env.ToRyeValue(v), true) if ps.ErrorFlag { return node // Return original on error } newData[k] = ps.Res case env.Builtin: - result := DirectlyCallBuiltin(ps, transformer, env.ToRyeValue(v), nil) - MaybeDisplayFailureOrError(ps, ps.Idx, "tree-transform") + result := evaldo.DirectlyCallBuiltin(ps, transformer, env.ToRyeValue(v), nil) + evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "tree-transform") if ps.ErrorFlag || ps.ReturnFlag { return node // Return original on error } @@ -234,10 +235,10 @@ var builtins_trees = map[string]*env.Builtin{ ps.Ser = ser return result default: - return MakeArgError(ps, 2, []env.Type{env.BlockType, env.BuiltinType}, "tree-map") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType, env.BuiltinType}, "tree-map") } default: - return MakeArgError(ps, 1, []env.Type{env.DictType}, "tree-map") + return evaldo.MakeArgError(ps, 1, []env.Type{env.DictType}, "tree-map") } }, }, @@ -279,7 +280,7 @@ var builtins_trees = map[string]*env.Builtin{ ps.Ctx.Mod(accumWord.Index, acc) ps.Ser = folder.Series ps.Ser.Reset() - EvalBlockInj(ps, env.ToRyeValue(nodeValue), true) + evaldo.EvalBlockInj(ps, env.ToRyeValue(nodeValue), true) if ps.ErrorFlag { return ps.Res } @@ -321,13 +322,13 @@ var builtins_trees = map[string]*env.Builtin{ ps.Ser = ser return result default: - return MakeArgError(ps, 3, []env.Type{env.BlockType}, "tree-fold") + return evaldo.MakeArgError(ps, 3, []env.Type{env.BlockType}, "tree-fold") } default: - return MakeArgError(ps, 1, []env.Type{env.WordType}, "tree-fold") + return evaldo.MakeArgError(ps, 1, []env.Type{env.WordType}, "tree-fold") } default: - return MakeArgError(ps, 1, []env.Type{env.DictType}, "tree-fold") + return evaldo.MakeArgError(ps, 1, []env.Type{env.DictType}, "tree-fold") } }, }, diff --git a/evaldo/builtins_tui.go b/batteries/builtins_tui.go similarity index 91% rename from evaldo/builtins_tui.go rename to batteries/builtins_tui.go index c20e87ff..c9fee78e 100644 --- a/evaldo/builtins_tui.go +++ b/batteries/builtins_tui.go @@ -1,7 +1,7 @@ //go:build !no_tui && !wasm && !js // +build !no_tui,!wasm,!js -package evaldo +package batteries import ( "fmt" @@ -13,6 +13,7 @@ import ( "github.com/mattn/go-runewidth" "github.com/refaktor/keyboard" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/refaktor/rye/term" ) @@ -961,7 +962,7 @@ func (app *TuiApp) Render() { } } - EvalBlockInj(psX, state, true) + evaldo.EvalBlockInj(psX, state, true) if psX.ErrorFlag || psX.FailureFlag { fmt.Println("View error:", psX.Res.Inspect(*psX.Idx)) @@ -1190,7 +1191,7 @@ func (app *TuiApp) handleMessage(msg env.Object) { psX.Ctx = fnCtx psX.PCtx = ps.PCtx psX.Gen = ps.Gen - EvalBlockInj(psX, currentState, true) + evaldo.EvalBlockInj(psX, currentState, true) if psX.ErrorFlag { fmt.Println("Message handler error:", psX.Res.Inspect(*psX.Idx)) @@ -1265,7 +1266,7 @@ func (app *TuiApp) handleKey(key string) { psX.Ctx = fnCtx psX.PCtx = ps.PCtx psX.Gen = ps.Gen - EvalBlockInj(psX, currentState, true) + evaldo.EvalBlockInj(psX, currentState, true) if psX.ErrorFlag { fmt.Println("Key handler error:", psX.Res.Inspect(*psX.Idx)) @@ -1286,7 +1287,7 @@ func (app *TuiApp) handleKey(key string) { psTemp := *ps psTemp.Ser = h.Series psTemp.Ser.Reset() - Eval(&psTemp) + evaldo.Eval(&psTemp) if psTemp.ErrorFlag { fmt.Println("Block handler error:", psTemp.Res.Inspect(*psTemp.Idx)) @@ -1517,7 +1518,7 @@ func (inp *TuiInput) callCallback(callback env.Object, value string) { psX := env.NewProgramStateOLD(fn.Body.Series, psTemp.Idx) psX.Ctx = fnCtx psX.PCtx = psTemp.PCtx - Eval(psX) + evaldo.Eval(psX) } } @@ -1740,7 +1741,7 @@ var Builtins_tui = map[string]*env.Builtin{ psTemp.Ser.Reset() for psTemp.Ser.Pos() < psTemp.Ser.Len() { - EvalExpression(&psTemp, nil, false, false, false, false) + evaldo.EvalExpression(&psTemp, nil, false, false, false, false) if psTemp.ErrorFlag || psTemp.FailureFlag { return psTemp.Res } @@ -1755,7 +1756,7 @@ var Builtins_tui = map[string]*env.Builtin{ childrenBlock := *env.NewBlock(*env.NewTSeries(children)) return tuiMakeWidget(ps, "vbox", *env.NewDict(nil), childrenBlock) default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "vbox") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "vbox") } }, }, @@ -1775,7 +1776,7 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { styles, ok := arg0.(env.Dict) if !ok { - return MakeArgError(ps, 1, []env.Type{env.DictType}, "vbox\\") + return evaldo.MakeArgError(ps, 1, []env.Type{env.DictType}, "vbox\\") } switch block := arg1.(type) { @@ -1788,7 +1789,7 @@ var Builtins_tui = map[string]*env.Builtin{ psTemp.Ser.Reset() for psTemp.Ser.Pos() < psTemp.Ser.Len() { - EvalExpression(&psTemp, nil, false, false, false, false) + evaldo.EvalExpression(&psTemp, nil, false, false, false, false) if psTemp.ErrorFlag || psTemp.FailureFlag { return psTemp.Res } @@ -1802,7 +1803,7 @@ var Builtins_tui = map[string]*env.Builtin{ childrenBlock := *env.NewBlock(*env.NewTSeries(children)) return tuiMakeWidget(ps, "vbox", styles, childrenBlock) default: - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "vbox\\") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "vbox\\") } }, }, @@ -1835,7 +1836,7 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { idx, ok := arg0.(env.Integer) if !ok { - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "select\\selected") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "select\\selected") } styles := env.NewDict(map[string]any{"selected": idx}) return tuiMakeWidget(ps, "select", *styles, arg1) @@ -1870,7 +1871,7 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { idx, ok := arg0.(env.Integer) if !ok { - return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "tabs\\selected") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType}, "tabs\\selected") } styles := env.NewDict(map[string]any{"selected": idx}) return tuiMakeWidget(ps, "tabs", *styles, arg1) @@ -1888,7 +1889,7 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { placeholder, ok := arg0.(env.String) if !ok { - return MakeArgError(ps, 1, []env.Type{env.StringType}, "input") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "input") } inp := NewTuiInput(placeholder.Value) inp.ps = ps @@ -1907,7 +1908,7 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { placeholder, ok := arg0.(env.String) if !ok { - return MakeArgError(ps, 1, []env.Type{env.StringType}, "field") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "field") } content := env.NewDict(map[string]any{ "value": *env.NewString(""), @@ -1925,11 +1926,11 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { value, ok := arg0.(env.String) if !ok { - return MakeArgError(ps, 1, []env.Type{env.StringType}, "field\\value") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "field\\value") } placeholder, ok := arg1.(env.String) if !ok { - return MakeArgError(ps, 2, []env.Type{env.StringType}, "field\\value") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "field\\value") } content := env.NewDict(map[string]any{ "value": value, @@ -1952,9 +1953,9 @@ var Builtins_tui = map[string]*env.Builtin{ tinp.ps = ps return arg0 } - return MakeBuiltinError(ps, "Expected TuiInput", "tui-input//On-submit") + return evaldo.MakeBuiltinError(ps, "Expected TuiInput", "tui-input//On-submit") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-input//On-submit") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-input//On-submit") } }, }, @@ -1971,9 +1972,9 @@ var Builtins_tui = map[string]*env.Builtin{ tinp.ps = ps return arg0 } - return MakeBuiltinError(ps, "Expected TuiInput", "tui-input//On-change") + return evaldo.MakeBuiltinError(ps, "Expected TuiInput", "tui-input//On-change") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-input//On-change") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-input//On-change") } }, }, @@ -1988,9 +1989,9 @@ var Builtins_tui = map[string]*env.Builtin{ if tinp, ok := inp.Value.(*TuiInput); ok { return *env.NewString(tinp.GetValue()) } - return MakeBuiltinError(ps, "Expected TuiInput", "tui-input//Value?") + return evaldo.MakeBuiltinError(ps, "Expected TuiInput", "tui-input//Value?") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-input//Value?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-input//Value?") } }, }, @@ -2007,11 +2008,11 @@ var Builtins_tui = map[string]*env.Builtin{ tinp.SetValue(val.Value) return arg0 } - return MakeArgError(ps, 2, []env.Type{env.StringType}, "tui-input//Set-value") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "tui-input//Set-value") } - return MakeBuiltinError(ps, "Expected TuiInput", "tui-input//Set-value") + return evaldo.MakeBuiltinError(ps, "Expected TuiInput", "tui-input//Set-value") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-input//Set-value") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-input//Set-value") } }, }, @@ -2028,11 +2029,11 @@ var Builtins_tui = map[string]*env.Builtin{ tinp.focused = val.Value != 0 return arg0 } - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "tui-input//Focus") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "tui-input//Focus") } - return MakeBuiltinError(ps, "Expected TuiInput", "tui-input//Focus") + return evaldo.MakeBuiltinError(ps, "Expected TuiInput", "tui-input//Focus") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-input//Focus") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-input//Focus") } }, }, @@ -2049,11 +2050,11 @@ var Builtins_tui = map[string]*env.Builtin{ tinp.width = int(val.Value) return arg0 } - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "tui-input//Width") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "tui-input//Width") } - return MakeBuiltinError(ps, "Expected TuiInput", "tui-input//Width") + return evaldo.MakeBuiltinError(ps, "Expected TuiInput", "tui-input//Width") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-input//Width") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-input//Width") } }, }, @@ -2073,11 +2074,11 @@ var Builtins_tui = map[string]*env.Builtin{ } return *env.NewInteger(0) } - return MakeArgError(ps, 2, []env.Type{env.StringType}, "tui-input//Handle-key") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "tui-input//Handle-key") } - return MakeBuiltinError(ps, "Expected TuiInput", "tui-input//Handle-key") + return evaldo.MakeBuiltinError(ps, "Expected TuiInput", "tui-input//Handle-key") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-input//Handle-key") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-input//Handle-key") } }, }, @@ -2093,9 +2094,9 @@ var Builtins_tui = map[string]*env.Builtin{ tinp.ps = ps // Ensure ps is set for proper widget creation return tinp.Render() } - return MakeBuiltinError(ps, "Expected TuiInput", "tui-input//Widget") + return evaldo.MakeBuiltinError(ps, "Expected TuiInput", "tui-input//Widget") default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-input//Widget") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-input//Widget") } }, }, @@ -2112,7 +2113,7 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { widget, ok := arg0.(env.Block) if !ok { - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "render") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "render") } width := term.GetTerminalColumns() @@ -2143,11 +2144,11 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { theme, ok := arg0.(env.Dict) if !ok { - return MakeArgError(ps, 1, []env.Type{env.DictType}, "render\\theme") + return evaldo.MakeArgError(ps, 1, []env.Type{env.DictType}, "render\\theme") } widget, ok := arg1.(env.Block) if !ok { - return MakeArgError(ps, 2, []env.Type{env.BlockType}, "render\\theme") + return evaldo.MakeArgError(ps, 2, []env.Type{env.BlockType}, "render\\theme") } width := term.GetTerminalColumns() @@ -2177,11 +2178,11 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { widget, ok := arg0.(env.Block) if !ok { - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "render\\to-string") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "render\\to-string") } width, ok := arg1.(env.Integer) if !ok { - return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "render\\to-string") + return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "render\\to-string") } theme := *env.NewDict(nil) @@ -2206,7 +2207,7 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { theme, ok := arg0.(env.Dict) if !ok { - return MakeArgError(ps, 1, []env.Type{env.DictType}, "app") + return evaldo.MakeArgError(ps, 1, []env.Type{env.DictType}, "app") } app := NewTuiApp(theme) return *env.NewNative(ps.Idx, app, "tui-app") @@ -2225,11 +2226,11 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { native, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//View") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//View") } app, ok := native.Value.(*TuiApp) if !ok { - return MakeBuiltinError(ps, "Expected TuiApp", "tui-app//View") + return evaldo.MakeBuiltinError(ps, "Expected TuiApp", "tui-app//View") } app.SetView(arg1) return arg0 @@ -2248,15 +2249,15 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { native, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//State") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//State") } app, ok := native.Value.(*TuiApp) if !ok { - return MakeBuiltinError(ps, "Expected TuiApp", "tui-app//State") + return evaldo.MakeBuiltinError(ps, "Expected TuiApp", "tui-app//State") } state, ok := arg1.(env.Dict) if !ok { - return MakeArgError(ps, 2, []env.Type{env.DictType}, "tui-app//State") + return evaldo.MakeArgError(ps, 2, []env.Type{env.DictType}, "tui-app//State") } app.SetState(state) return arg0 @@ -2274,11 +2275,11 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { native, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//State?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//State?") } app, ok := native.Value.(*TuiApp) if !ok { - return MakeBuiltinError(ps, "Expected TuiApp", "tui-app//State?") + return evaldo.MakeBuiltinError(ps, "Expected TuiApp", "tui-app//State?") } return app.GetState() }, @@ -2296,15 +2297,15 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { native, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//Update") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//Update") } app, ok := native.Value.(*TuiApp) if !ok { - return MakeBuiltinError(ps, "Expected TuiApp", "tui-app//Update") + return evaldo.MakeBuiltinError(ps, "Expected TuiApp", "tui-app//Update") } updates, ok := arg1.(env.Dict) if !ok { - return MakeArgError(ps, 2, []env.Type{env.DictType}, "tui-app//Update") + return evaldo.MakeArgError(ps, 2, []env.Type{env.DictType}, "tui-app//Update") } app.Update(updates) return arg0 @@ -2324,22 +2325,22 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { native, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//On-key") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//On-key") } app, ok := native.Value.(*TuiApp) if !ok { - return MakeBuiltinError(ps, "Expected TuiApp", "tui-app//On-key") + return evaldo.MakeBuiltinError(ps, "Expected TuiApp", "tui-app//On-key") } key, ok := arg1.(env.String) if !ok { - return MakeArgError(ps, 2, []env.Type{env.StringType}, "tui-app//On-key") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "tui-app//On-key") } switch arg2.(type) { case env.Function, env.Block: app.OnKey(key.Value, arg2) return arg0 default: - return MakeArgError(ps, 3, []env.Type{env.FunctionType, env.BlockType}, "tui-app//On-key") + return evaldo.MakeArgError(ps, 3, []env.Type{env.FunctionType, env.BlockType}, "tui-app//On-key") } }, }, @@ -2356,18 +2357,18 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { native, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//On-keys") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//On-keys") } app, ok := native.Value.(*TuiApp) if !ok { - return MakeBuiltinError(ps, "Expected TuiApp", "tui-app//On-keys") + return evaldo.MakeBuiltinError(ps, "Expected TuiApp", "tui-app//On-keys") } switch arg1.(type) { case env.Function, env.Block: app.OnKeys(arg1) return arg0 default: - return MakeArgError(ps, 2, []env.Type{env.FunctionType, env.BlockType}, "tui-app//On-keys") + return evaldo.MakeArgError(ps, 2, []env.Type{env.FunctionType, env.BlockType}, "tui-app//On-keys") } }, }, @@ -2384,11 +2385,11 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { native, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//Focus") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//Focus") } app, ok := native.Value.(*TuiApp) if !ok { - return MakeBuiltinError(ps, "Expected TuiApp", "tui-app//Focus") + return evaldo.MakeBuiltinError(ps, "Expected TuiApp", "tui-app//Focus") } // Allow clearing focus with 0 or none @@ -2401,11 +2402,11 @@ var Builtins_tui = map[string]*env.Builtin{ inputNative, ok := arg1.(env.Native) if !ok { - return MakeArgError(ps, 2, []env.Type{env.NativeType}, "tui-app//Focus") + return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "tui-app//Focus") } inp, ok := inputNative.Value.(*TuiInput) if !ok { - return MakeBuiltinError(ps, "Expected TuiInput", "tui-app//Focus") + return evaldo.MakeBuiltinError(ps, "Expected TuiInput", "tui-app//Focus") } app.mu.Lock() @@ -2428,15 +2429,15 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { native, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//Start") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//Start") } app, ok := native.Value.(*TuiApp) if !ok { - return MakeBuiltinError(ps, "Expected TuiApp", "tui-app//Start") + return evaldo.MakeBuiltinError(ps, "Expected TuiApp", "tui-app//Start") } err := app.Start(ps) if err != nil { - return MakeBuiltinError(ps, err.Error(), "tui-app//Start") + return evaldo.MakeBuiltinError(ps, err.Error(), "tui-app//Start") } return arg0 }, @@ -2453,11 +2454,11 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { native, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//Stop") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//Stop") } app, ok := native.Value.(*TuiApp) if !ok { - return MakeBuiltinError(ps, "Expected TuiApp", "tui-app//Stop") + return evaldo.MakeBuiltinError(ps, "Expected TuiApp", "tui-app//Stop") } app.Stop() return arg0 @@ -2475,11 +2476,11 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { native, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//Wait") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//Wait") } app, ok := native.Value.(*TuiApp) if !ok { - return MakeBuiltinError(ps, "Expected TuiApp", "tui-app//Wait") + return evaldo.MakeBuiltinError(ps, "Expected TuiApp", "tui-app//Wait") } app.Wait() return arg0 @@ -2497,11 +2498,11 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { native, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//Redraw") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//Redraw") } app, ok := native.Value.(*TuiApp) if !ok { - return MakeBuiltinError(ps, "Expected TuiApp", "tui-app//Redraw") + return evaldo.MakeBuiltinError(ps, "Expected TuiApp", "tui-app//Redraw") } // Ensure ps is set for rendering app.mu.Lock() @@ -2526,11 +2527,11 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { native, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//Send") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//Send") } app, ok := native.Value.(*TuiApp) if !ok { - return MakeBuiltinError(ps, "Expected TuiApp", "tui-app//Send") + return evaldo.MakeBuiltinError(ps, "Expected TuiApp", "tui-app//Send") } // Non-blocking send to buffered channel select { @@ -2555,11 +2556,11 @@ var Builtins_tui = map[string]*env.Builtin{ Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { native, ok := arg0.(env.Native) if !ok { - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//On-message") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tui-app//On-message") } app, ok := native.Value.(*TuiApp) if !ok { - return MakeBuiltinError(ps, "Expected TuiApp", "tui-app//On-message") + return evaldo.MakeBuiltinError(ps, "Expected TuiApp", "tui-app//On-message") } switch arg1.(type) { case env.Function: @@ -2568,7 +2569,7 @@ var Builtins_tui = map[string]*env.Builtin{ app.mu.Unlock() return arg0 default: - return MakeArgError(ps, 2, []env.Type{env.FunctionType}, "tui-app//On-message") + return evaldo.MakeArgError(ps, 2, []env.Type{env.FunctionType}, "tui-app//On-message") } }, }, @@ -2613,7 +2614,7 @@ var Builtins_tui = map[string]*env.Builtin{ case env.Dict: return b default: - return MakeArgError(ps, 1, []env.Type{env.BlockType, env.DictType}, "style") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType, env.DictType}, "style") } }, }, @@ -2683,7 +2684,7 @@ var Builtins_tui = map[string]*env.Builtin{ case env.Dict: return b default: - return MakeArgError(ps, 1, []env.Type{env.BlockType, env.DictType}, "theme") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType, env.DictType}, "theme") } }, }, diff --git a/evaldo/builtins_tui_not.go b/batteries/builtins_tui_not.go similarity index 89% rename from evaldo/builtins_tui_not.go rename to batteries/builtins_tui_not.go index 5e655ad5..56820cae 100644 --- a/evaldo/builtins_tui_not.go +++ b/batteries/builtins_tui_not.go @@ -1,7 +1,7 @@ //go:build no_tui || wasm || js // +build no_tui wasm js -package evaldo +package batteries import ( "github.com/refaktor/rye/env" diff --git a/evaldo/builtins_unique.go b/batteries/builtins_unique.go similarity index 88% rename from evaldo/builtins_unique.go rename to batteries/builtins_unique.go index 8b2c1c67..190d24a4 100644 --- a/evaldo/builtins_unique.go +++ b/batteries/builtins_unique.go @@ -1,4 +1,4 @@ -package evaldo +package batteries import ( "crypto/rand" @@ -10,6 +10,7 @@ import ( "time" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" ) // Global counter for process-unique IDs - thread-safe using atomic operations @@ -75,7 +76,7 @@ var builtins_unique = map[string]*env.Builtin{ // arg0 should be Rye context, but we don't need to validate it for this implementation uniqueID, err := generateProcessUniqueID() if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Failed to generate unique ID: %v", err), "Rye-itself//unique-id") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to generate unique ID: %v", err), "Rye-itself//unique-id") } return *env.NewString(uniqueID) }, @@ -95,7 +96,7 @@ var builtins_unique = map[string]*env.Builtin{ // Generate unique ID for directory name uniqueID, err := generateProcessUniqueID() if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Failed to generate unique ID: %v", err), "Rye-itself//unique-temp-dir") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to generate unique ID: %v", err), "Rye-itself//unique-temp-dir") } // Create the full path in system temp directory @@ -105,7 +106,7 @@ var builtins_unique = map[string]*env.Builtin{ // Create the directory err = os.MkdirAll(uniqueDirPath, 0755) if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Failed to create temp directory: %v", err), "Rye-itself//unique-temp-dir") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to create temp directory: %v", err), "Rye-itself//unique-temp-dir") } // Return as file URI @@ -127,7 +128,7 @@ var builtins_unique = map[string]*env.Builtin{ // Generate unique ID for file name uniqueID, err := generateProcessUniqueID() if err != nil { - return MakeBuiltinError(ps, fmt.Sprintf("Failed to generate unique ID: %v", err), "Rye-itself//unique-temp-file") + return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to generate unique ID: %v", err), "Rye-itself//unique-temp-file") } // Create the full path in system temp directory with .tmp extension diff --git a/evaldo/builtins_validation.go b/batteries/builtins_validation.go similarity index 98% rename from evaldo/builtins_validation.go rename to batteries/builtins_validation.go index 3827f662..dd561e66 100644 --- a/evaldo/builtins_validation.go +++ b/batteries/builtins_validation.go @@ -1,7 +1,7 @@ //go:build !no_validation // +build !no_validation -package evaldo +package batteries import ( "fmt" @@ -11,6 +11,7 @@ import ( "time" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/refaktor/rye/util" ) @@ -228,7 +229,7 @@ func evalWord(word env.Word, es *env.ProgramState, val any) (any, env.Object) { case env.Block: ser := es.Ser es.Ser = blk.Series - EvalBlockInj(es, val.(env.Object), true) + evaldo.EvalBlockInj(es, val.(env.Object), true) if es.ErrorFlag { es.Ser = ser return val, es.Res @@ -247,7 +248,7 @@ func evalWord(word env.Word, es *env.ProgramState, val any) (any, env.Object) { case env.Block: ser := es.Ser es.Ser = blk.Series - EvalBlockInj(es, val.(env.Object), true) + evaldo.EvalBlockInj(es, val.(env.Object), true) if es.ErrorFlag { es.Ser = ser return val, es.Res @@ -616,7 +617,7 @@ func BuiValidate(env1 *env.ProgramState, arg0 env.Object, arg1 env.Object) env.O return val } default: - return MakeArgError(env1, 2, []env.Type{env.BlockType}, "validate") + return evaldo.MakeArgError(env1, 2, []env.Type{env.BlockType}, "validate") } } diff --git a/evaldo/builtins_validation_not.go b/batteries/builtins_validation_not.go similarity index 96% rename from evaldo/builtins_validation_not.go rename to batteries/builtins_validation_not.go index 34f1f4c0..2acd0905 100644 --- a/evaldo/builtins_validation_not.go +++ b/batteries/builtins_validation_not.go @@ -1,12 +1,13 @@ //go:build no_validation // +build no_validation -package evaldo +package batteries import ( "fmt" // "net/mail" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" // "github.com/refaktor/rye/util" "strconv" "strings" @@ -73,7 +74,7 @@ func evalWord(word env.Word, es *env.ProgramState, val any) (any, *ValidationErr case env.Block: ser := es.Ser es.Ser = blk.Series - EvalBlockInj(es, val.(env.Object), true) + evaldo.EvalBlockInj(es, val.(env.Object), true) es.Ser = ser if es.Res.(env.Integer).Value > 0 { return val, nil @@ -88,7 +89,7 @@ func evalWord(word env.Word, es *env.ProgramState, val any) (any, *ValidationErr case env.Block: ser := es.Ser es.Ser = blk.Series - EvalBlockInj(es, val.(env.Object), true) + evaldo.EvalBlockInj(es, val.(env.Object), true) es.Ser = ser return es.Res, nil default: diff --git a/evaldo/builtins_vector.go b/batteries/builtins_vector.go old mode 100755 new mode 100644 similarity index 78% rename from evaldo/builtins_vector.go rename to batteries/builtins_vector.go index d0e2a0ba..1ca286e8 --- a/evaldo/builtins_vector.go +++ b/batteries/builtins_vector.go @@ -1,9 +1,13 @@ -package evaldo +//go:build !no_vector +// +build !no_vector + +package batteries import ( "math" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/drewlanenga/govector" ) @@ -48,11 +52,11 @@ var Builtins_vector = map[string]*env.Builtin{ data := ArrayFloat32FromSeries(s.Series) val, err := govector.AsVector(data) if err != nil { - return MakeError(ps, err.Error()) + return evaldo.MakeError(ps, err.Error()) } return *env.NewVector(val) default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "vector") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "vector") } }, }, @@ -71,7 +75,7 @@ var Builtins_vector = map[string]*env.Builtin{ case env.Vector: return *env.NewDecimal(govector.Norm(val.Value, 2.0)) default: - return MakeArgError(ps, 1, []env.Type{env.VectorType}, "normalize") + return evaldo.MakeArgError(ps, 1, []env.Type{env.VectorType}, "normalize") } }, }, @@ -90,7 +94,7 @@ var Builtins_vector = map[string]*env.Builtin{ case env.Vector: return *env.NewDecimal(val.Value.Sd()) default: - return MakeArgError(ps, 1, []env.Type{env.VectorType}, "std-deviation?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.VectorType}, "std-deviation?") } }, }, @@ -113,14 +117,14 @@ var Builtins_vector = map[string]*env.Builtin{ case env.Vector: res, err := govector.Cosine(v1.Value, v2.Value) if err != nil { - return MakeBuiltinError(ps, err.Error(), "cosine-similarity?") + return evaldo.MakeBuiltinError(ps, err.Error(), "cosine-similarity?") } return *env.NewDecimal(res) default: - return MakeArgError(ps, 2, []env.Type{env.VectorType}, "cosine-similarity?") + return evaldo.MakeArgError(ps, 2, []env.Type{env.VectorType}, "cosine-similarity?") } default: - return MakeArgError(ps, 1, []env.Type{env.VectorType}, "cosine-similarity?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.VectorType}, "cosine-similarity?") } }, }, @@ -143,14 +147,14 @@ var Builtins_vector = map[string]*env.Builtin{ case env.Vector: res, err := govector.Cor(v1.Value, v2.Value) if err != nil { - return MakeError(ps, err.Error()) + return evaldo.MakeError(ps, err.Error()) } return *env.NewDecimal(res) default: - return MakeArgError(ps, 2, []env.Type{env.VectorType}, "correlation") + return evaldo.MakeArgError(ps, 2, []env.Type{env.VectorType}, "correlation") } default: - return MakeArgError(ps, 1, []env.Type{env.VectorType}, "correlation") + return evaldo.MakeArgError(ps, 1, []env.Type{env.VectorType}, "correlation") } }, }, @@ -172,14 +176,14 @@ var Builtins_vector = map[string]*env.Builtin{ case env.Vector: res, err := govector.DotProduct(v1.Value, v2.Value) if err != nil { - return MakeError(ps, err.Error()) + return evaldo.MakeError(ps, err.Error()) } return *env.NewDecimal(res) default: - return MakeArgError(ps, 2, []env.Type{env.VectorType}, "dot-product") + return evaldo.MakeArgError(ps, 2, []env.Type{env.VectorType}, "dot-product") } default: - return MakeArgError(ps, 1, []env.Type{env.VectorType}, "dot-product") + return evaldo.MakeArgError(ps, 1, []env.Type{env.VectorType}, "dot-product") } }, }, @@ -205,7 +209,7 @@ var Builtins_vector = map[string]*env.Builtin{ switch v2 := arg1.(type) { case env.Vector: if len(v1.Value) != len(v2.Value) { - return MakeBuiltinError(ps, "Vectors must have the same length", "euclidean-distance") + return evaldo.MakeBuiltinError(ps, "Vectors must have the same length", "euclidean-distance") } var sum float64 for i := 0; i < len(v1.Value); i++ { @@ -214,10 +218,10 @@ var Builtins_vector = map[string]*env.Builtin{ } return *env.NewDecimal(sqrtFloat64(sum)) default: - return MakeArgError(ps, 2, []env.Type{env.VectorType}, "euclidean-distance") + return evaldo.MakeArgError(ps, 2, []env.Type{env.VectorType}, "euclidean-distance") } default: - return MakeArgError(ps, 1, []env.Type{env.VectorType}, "euclidean-distance") + return evaldo.MakeArgError(ps, 1, []env.Type{env.VectorType}, "euclidean-distance") } }, }, @@ -235,13 +239,13 @@ var Builtins_vector = map[string]*env.Builtin{ switch block := arg0.(type) { case env.Block: if block.Series.Len() == 0 { - return MakeBuiltinError(ps, "Block must contain at least one vector", "mean-vectors") + return evaldo.MakeBuiltinError(ps, "Block must contain at least one vector", "mean-vectors") } // Get first vector to determine length first := block.Series.Get(0) firstVec, ok := first.(env.Vector) if !ok { - return MakeBuiltinError(ps, "Block must contain only vectors", "mean-vectors") + return evaldo.MakeBuiltinError(ps, "Block must contain only vectors", "mean-vectors") } vecLen := len(firstVec.Value) result := make(govector.Vector, vecLen) @@ -250,10 +254,10 @@ var Builtins_vector = map[string]*env.Builtin{ item := block.Series.Get(i) vec, ok := item.(env.Vector) if !ok { - return MakeBuiltinError(ps, "Block must contain only vectors", "mean-vectors") + return evaldo.MakeBuiltinError(ps, "Block must contain only vectors", "mean-vectors") } if len(vec.Value) != vecLen { - return MakeBuiltinError(ps, "All vectors must have the same length", "mean-vectors") + return evaldo.MakeBuiltinError(ps, "All vectors must have the same length", "mean-vectors") } for j := 0; j < vecLen; j++ { result[j] += vec.Value[j] @@ -266,7 +270,7 @@ var Builtins_vector = map[string]*env.Builtin{ } return *env.NewVector(result) default: - return MakeArgError(ps, 1, []env.Type{env.BlockType}, "mean-vectors") + return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType}, "mean-vectors") } }, }, @@ -289,7 +293,7 @@ var Builtins_vector = map[string]*env.Builtin{ case env.Vector: norm := govector.Norm(v.Value, 2.0) if norm == 0 { - return MakeBuiltinError(ps, "Cannot normalize zero vector", "Vector//unit") + return evaldo.MakeBuiltinError(ps, "Cannot normalize zero vector", "Vector//unit") } result := make(govector.Vector, len(v.Value)) for i := 0; i < len(v.Value); i++ { @@ -297,7 +301,7 @@ var Builtins_vector = map[string]*env.Builtin{ } return *env.NewVector(result) default: - return MakeArgError(ps, 1, []env.Type{env.VectorType}, "Vector//unit") + return evaldo.MakeArgError(ps, 1, []env.Type{env.VectorType}, "Vector//unit") } }, }, @@ -318,19 +322,19 @@ var Builtins_vector = map[string]*env.Builtin{ switch v2 := arg1.(type) { case env.Vector: if len(v1.Value) != len(v2.Value) { - return MakeBuiltinError(ps, "Vectors must have the same length", "Vector//project") + return evaldo.MakeBuiltinError(ps, "Vectors must have the same length", "Vector//project") } // project(a, b) = (a·b / b·b) * b dotAB, err := govector.DotProduct(v1.Value, v2.Value) if err != nil { - return MakeBuiltinError(ps, err.Error(), "Vector//project") + return evaldo.MakeBuiltinError(ps, err.Error(), "Vector//project") } dotBB, err := govector.DotProduct(v2.Value, v2.Value) if err != nil { - return MakeBuiltinError(ps, err.Error(), "Vector//project") + return evaldo.MakeBuiltinError(ps, err.Error(), "Vector//project") } if dotBB == 0 { - return MakeBuiltinError(ps, "Cannot project onto zero vector", "Vector//project") + return evaldo.MakeBuiltinError(ps, "Cannot project onto zero vector", "Vector//project") } scalar := dotAB / dotBB result := make(govector.Vector, len(v2.Value)) @@ -339,10 +343,10 @@ var Builtins_vector = map[string]*env.Builtin{ } return *env.NewVector(result) default: - return MakeArgError(ps, 2, []env.Type{env.VectorType}, "Vector//project") + return evaldo.MakeArgError(ps, 2, []env.Type{env.VectorType}, "Vector//project") } default: - return MakeArgError(ps, 1, []env.Type{env.VectorType}, "Vector//project") + return evaldo.MakeArgError(ps, 1, []env.Type{env.VectorType}, "Vector//project") } }, }, @@ -363,17 +367,17 @@ var Builtins_vector = map[string]*env.Builtin{ switch v2 := arg1.(type) { case env.Vector: if len(v1.Value) != len(v2.Value) { - return MakeBuiltinError(ps, "Vectors must have the same length", "Vector//reject") + return evaldo.MakeBuiltinError(ps, "Vectors must have the same length", "Vector//reject") } // reject(a, b) = a - project(a, b) // project(a, b) = (a·b / b·b) * b dotAB, err := govector.DotProduct(v1.Value, v2.Value) if err != nil { - return MakeBuiltinError(ps, err.Error(), "Vector//reject") + return evaldo.MakeBuiltinError(ps, err.Error(), "Vector//reject") } dotBB, err := govector.DotProduct(v2.Value, v2.Value) if err != nil { - return MakeBuiltinError(ps, err.Error(), "Vector//reject") + return evaldo.MakeBuiltinError(ps, err.Error(), "Vector//reject") } if dotBB == 0 { // If b is zero vector, rejection is just the original vector @@ -386,10 +390,10 @@ var Builtins_vector = map[string]*env.Builtin{ } return *env.NewVector(result) default: - return MakeArgError(ps, 2, []env.Type{env.VectorType}, "Vector//reject") + return evaldo.MakeArgError(ps, 2, []env.Type{env.VectorType}, "Vector//reject") } default: - return MakeArgError(ps, 1, []env.Type{env.VectorType}, "Vector//reject") + return evaldo.MakeArgError(ps, 1, []env.Type{env.VectorType}, "Vector//reject") } }, }, diff --git a/batteries/builtins_vector_not.go b/batteries/builtins_vector_not.go new file mode 100644 index 00000000..c2fe118d --- /dev/null +++ b/batteries/builtins_vector_not.go @@ -0,0 +1,10 @@ +//go:build no_vector +// +build no_vector + +package batteries + +import "github.com/refaktor/rye/env" + +// Builtins_vector is empty when the no_vector build tag is active. +// This removes the govector dependency. +var Builtins_vector = map[string]*env.Builtin{} diff --git a/evaldo/builtins_web.go b/batteries/builtins_web.go old mode 100755 new mode 100644 similarity index 85% rename from evaldo/builtins_web.go rename to batteries/builtins_web.go index 9da03bc3..d45d9507 --- a/evaldo/builtins_web.go +++ b/batteries/builtins_web.go @@ -1,7 +1,7 @@ //go:build b_echo // +build b_echo -package evaldo +package batteries import "C" @@ -10,6 +10,7 @@ import ( "strconv" "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" "github.com/gorilla/sessions" "github.com/labstack/echo" @@ -63,7 +64,7 @@ var Builtins_web = map[string]*env.Builtin{ OutBuffer += strconv.FormatInt(ps.Res.(env.Integer).Value, 10) return str default: - return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.StringType}, "echo") + return evaldo.MakeArgError(ps, 1, []env.Type{env.IntegerType, env.StringType}, "echo") } }, @@ -86,10 +87,10 @@ var Builtins_web = map[string]*env.Builtin{ case env.String: return env.String{"<" + wrp.Value + ">" + str.Value + ""} default: - return MakeArgError(ps, 1, []env.Type{env.StringType}, "tag") + return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "tag") } default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "tag") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "tag") } }, @@ -112,10 +113,10 @@ var Builtins_web = map[string]*env.Builtin{ case env.String: return env.String{ctx.Value.(echo.Context).FormValue(key.Value)} default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "form?") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "form?") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "form?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "form?") } }, }, @@ -140,10 +141,10 @@ var Builtins_web = map[string]*env.Builtin{ //return env.NewError("XOSADOSADOA SDAS DO" + key.Value) return env.String{ctx.Value.(echo.Context).QueryParam(key.Value)} default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "query?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "query?") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "query?") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "query?") } }, }, @@ -172,15 +173,15 @@ var Builtins_web = map[string]*env.Builtin{ ctx.Value.(*sessions.Session).Values[key.Value] = val.Value return val default: - return MakeArgError(ps, 3, []env.Type{env.StringType}, "Rye-echo-session//set") + return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "Rye-echo-session//set") } //return env.NewError("XOSADOSADOA SDAS DO" + key.Value) return env.String{ctx.Value.(echo.Context).QueryParam(key.Value)} default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Rye-echo-session//set") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Rye-echo-session//set") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-echo-session//set") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-echo-session//set") } }, }, @@ -212,17 +213,17 @@ var Builtins_web = map[string]*env.Builtin{ case env.Object: return val2 default: - return MakeBuiltinError(ps, "No matching type found.", "Rye-echo-session//get") + return evaldo.MakeBuiltinError(ps, "No matching type found.", "Rye-echo-session//get") } //return env.NewError("XOSADOSADOA SDAS DO" + key.Value) } else { return env.String{"NO VALUE"} } default: - return MakeArgError(ps, 2, []env.Type{env.StringType}, "Rye-echo-session//get") + return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Rye-echo-session//get") } default: - return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-echo-session//get") + return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-echo-session//get") } }, }, diff --git a/evaldo/builtins_web_not.go b/batteries/builtins_web_not.go similarity index 95% rename from evaldo/builtins_web_not.go rename to batteries/builtins_web_not.go index 111086ef..ade119df 100644 --- a/evaldo/builtins_web_not.go +++ b/batteries/builtins_web_not.go @@ -1,7 +1,7 @@ //go:build !b_echo // +build !b_echo -package evaldo +package batteries // import "C" diff --git a/batteries/register.go b/batteries/register.go new file mode 100644 index 00000000..9da4b29a --- /dev/null +++ b/batteries/register.go @@ -0,0 +1,100 @@ +package batteries + +import ( + "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" +) + +// registerHooks wires battery functions into the hook variables in evaldo, +// so that base evaldo code can call battery functionality without an import cycle. +func registerHooks() { + evaldo.BatteryValidateHook = func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object) env.Object { + return BuiValidate(ps, arg0, arg1) + } + evaldo.BatteryConvertHook = func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object) env.Object { + return BuiConvert(ps, arg0, arg1) + } + evaldo.BatteryMarkdownDisplayHook = func(source string) []interface{} { + return convertMarkdownDisplayItems(markdownDisplayItems(source)) + } + evaldo.BatteryEyrEvalBlockInsideHook = func(ps *env.ProgramState, inj env.Object, injnow bool) { + Eyr_EvalBlockInside(ps, inj, injnow) + } + evaldo.BatteryEyrEvalBlockHook = func(ps *env.ProgramState, full bool) { + Eyr_EvalBlock(ps, full) + } + evaldo.BatteryDialectMathHook = func(ps *env.ProgramState, arg0 env.Object) env.Object { + return DialectMath(ps, arg0) + } + evaldo.BatteryEvalInPersistentCtxHook = func(ps *env.ProgramState, ctx evaldo.PersistentCtxInterface) { + if pctx, ok := ctx.(*PersistentCtx); ok { + EvalBlockInPersistentCtx(ps, pctx) + } + } +} + +// RegisterBatteries registers all battery (non-base) builtins into the program state. +// Call this after evaldo.RegisterBuiltins to get the full standard set of Rye builtins. +func RegisterBatteries(ps *env.ProgramState) { + registerHooks() + evaldo.RegisterBuiltins2(Builtins_error_creation, ps, "error-creation") + evaldo.RegisterBuiltins2(Builtins_error_inspection, ps, "error-inspection") + evaldo.RegisterBuiltins2(Builtins_error_handling, ps, "error-handling") + evaldo.RegisterBuiltins2(Builtins_match, ps, "match") + evaldo.RegisterBuiltins2(Builtins_table, ps, "table") + evaldo.RegisterBuiltins2(Builtins_vector, ps, "vector") + evaldo.RegisterBuiltins2(Builtins_matrix, ps, "matrix") + evaldo.RegisterBuiltins2(Builtins_io, ps, "io") + evaldo.RegisterBuiltins2(Builtins_cmd, ps, "cmd") + evaldo.RegisterBuiltins2(Builtins_regexp, ps, "regexp") + evaldo.RegisterBuiltins2(Builtins_validation, ps, "validation") + evaldo.RegisterBuiltins2(Builtins_cli, ps, "cli") + evaldo.RegisterBuiltins2(Builtins_conversion, ps, "conversion") + evaldo.RegisterBuiltins2(Builtins_web, ps, "web") + evaldo.RegisterBuiltins2(Builtins_markdown, ps, "markdown") + evaldo.RegisterBuiltins2(Builtins_sxml, ps, "sxml") + evaldo.RegisterBuiltins2(Builtins_html, ps, "html") + evaldo.RegisterBuiltins2(Builtins_json, ps, "json") + evaldo.RegisterBuiltins2(Builtins_bson, ps, "bson") + evaldo.RegisterBuiltins2(Builtins_stackless, ps, "stackless") + evaldo.RegisterBuiltins2(Builtins_eyr, ps, "eyr") + evaldo.RegisterBuiltins2(Builtins_goroutines, ps, "goroutines") + evaldo.RegisterBuiltins2(Builtins_msgdispatcher, ps, "msgdispatcher") + evaldo.RegisterBuiltins2(Builtins_http, ps, "http") + evaldo.RegisterBuiltins2(Builtins_sqlite, ps, "sqlite") + evaldo.RegisterBuiltins2(Builtins_psql, ps, "psql") + evaldo.RegisterBuiltins2(Builtins_mysql, ps, "mysql") + evaldo.RegisterBuiltins2(Builtins_email, ps, "email") + evaldo.RegisterBuiltins2(Builtins_imap, ps, "imap") + evaldo.RegisterBuiltins2(Builtins_structures, ps, "structs") + evaldo.RegisterBuiltins2(Builtins_smtpd, ps, "smtpd") + evaldo.RegisterBuiltins2(Builtins_mail, ps, "mail") + evaldo.RegisterBuiltins2(Builtins_ssh, ps, "ssh") + evaldo.RegisterBuiltins2(Builtins_bcrypt, ps, "bcrypt") + evaldo.RegisterBuiltins2(Builtins_console, ps, "console") + evaldo.RegisterBuiltinsInContext(Builtins_crypto, ps, "crypto") + evaldo.RegisterBuiltinsInContext(Builtins_encoding, ps, "encoding") + evaldo.RegisterBuiltinsInContext(Builtins_math, ps, "math") + evaldo.RegisterBuiltinsInContext(Builtins_os, ps, "os") + evaldo.RegisterBuiltinsInContext(Builtins_pipes, ps, "pipes") + evaldo.RegisterBuiltinsInContext(Builtins_term, ps, "term") + evaldo.RegisterBuiltinsInContext(Builtins_termstr, ps, "termstr") + evaldo.RegisterBuiltinsInContext(Builtins_tui, ps, "tui") + evaldo.RegisterBuiltinsInContext(Builtins_telegrambot, ps, "telegram") + evaldo.RegisterBuiltinsInContext(Builtins_mcp, ps, "mcp") + evaldo.RegisterBuiltins2(Builtins_mqtt, ps, "mqtt") + evaldo.RegisterBuiltins2(Builtins_chitosocket, ps, "chitosocket") + evaldo.RegisterBuiltins2(builtins_trees, ps, "trees") + // evaldo.RegisterBuiltinsInContext(Builtins_git, ps, "git") + // temporarily removed: evaldo.RegisterBuiltinsInContext(Builtins_docker, ps, "docker") + evaldo.RegisterBuiltinsInContext(Builtins_prometheus, ps, "prometheus") + evaldo.RegisterBuiltinsInContext(Builtins_echarts, ps, "echarts") + evaldo.RegisterBuiltinsInContext(Builtins_flui, ps, "flui") + evaldo.RegisterBuiltins2(Builtins_js_interop, ps, "jsinterop") + // evaldo.RegisterBuiltinsInContext(Builtins_flui_v2, ps, "flui2") + // ## Archived / contrib modules (not included in batteries): + // evaldo.RegisterBuiltins2(Builtins_gtk, ps, "gtk") + // evaldo.RegisterBuiltins2(Builtins_nats, ps, "nats") + // evaldo.RegisterBuiltins2(Builtins_qframe, ps, "qframe") + // evaldo.RegisterBuiltins2(Builtins_raylib, ps, "raylib") +} diff --git a/embed/example/main.go b/embed/example/main.go new file mode 100644 index 00000000..3d6f47f5 --- /dev/null +++ b/embed/example/main.go @@ -0,0 +1,117 @@ +//go:build ignore +// +build ignore + +// Example program showing how to embed Rye in a Go application using the +// minimal embed sub-module. +// +// Build & run: +// +// cd embed/example +// go run -tags "no_persistent no_table no_vector" main.go +package main + +import ( + "fmt" + "os" + + "github.com/refaktor/rye/embed" + "github.com/refaktor/rye/env" +) + +// --------------------------------------------------------------------------- +// 1. Register a simple Go function as a Rye builtin +// --------------------------------------------------------------------------- + +func multiply(ps *env.ProgramState, a0, a1, a2, a3, a4 env.Object) env.Object { + if a0.Type() != env.IntegerType || a1.Type() != env.IntegerType { + return *env.NewError("multiply: expected two integers") + } + x := a0.(env.Integer).Value + y := a1.(env.Integer).Value + return *env.NewInteger(x * y) +} + +func greet(ps *env.ProgramState, a0, a1, a2, a3, a4 env.Object) env.Object { + if a0.Type() != env.StringType { + return *env.NewError("greet: expected a string") + } + name := a0.(env.String).Value + return *env.NewString("Hello, " + name + "!") +} + +func main() { + // --------------------------------------------------------------------------- + // 2. Create an engine and register builtins + // --------------------------------------------------------------------------- + engine := embed.New() + + engine.RegisterBuiltinDoc("multiply", 2, "multiply a b — returns a × b", multiply) + engine.RegisterBuiltinDoc("greet", 1, "greet name — returns a greeting string", greet) + + // --------------------------------------------------------------------------- + // 3. Inject a Go value as a Rye word + // --------------------------------------------------------------------------- + engine.SetWord("app-name", *env.NewString("MyApp")) + + // --------------------------------------------------------------------------- + // 4. Evaluate Rye code and read back results + // --------------------------------------------------------------------------- + ryeCode := ` + ; use the injected word + greeting: greet app-name + + ; arithmetic + a: 6 + b: 7 + product: multiply a b + + ; native Rye arithmetic + total: a + b + product + + ; return a block so we can inspect values + total + ` + + result, err := engine.Eval(ryeCode) + if err != nil { + fmt.Fprintf(os.Stderr, "Rye error: %v\n", err) + os.Exit(1) + } + fmt.Println("total =", result) // 55 + + // Read the greeting back as a typed Go string + greeting, err := engine.EvalString(`greet "World"`) + if err != nil { + fmt.Fprintf(os.Stderr, "Rye error: %v\n", err) + os.Exit(1) + } + fmt.Println(greeting) // Hello, World! + + // Read an integer result + n, err := engine.EvalInteger("42") + if err != nil { + fmt.Fprintf(os.Stderr, "Rye error: %v\n", err) + os.Exit(1) + } + fmt.Println("integer =", n) // 42 + + // --------------------------------------------------------------------------- + // 5. Low-level: work with env.Object directly + // --------------------------------------------------------------------------- + obj, err := engine.EvalGetObject(`{ 1 2 3 }`) + if err != nil { + fmt.Fprintf(os.Stderr, "Rye error: %v\n", err) + os.Exit(1) + } + fmt.Printf("block type: %T\n", obj) // env.Block + + // --------------------------------------------------------------------------- + // 6. Use GetWord to read back a word that was set inside a script + // --------------------------------------------------------------------------- + engine.Eval(`answer: 21 + 21`) + if val, ok := engine.GetWord("answer"); ok { + fmt.Println("answer =", val.Print(*engine.ProgramState().Idx)) // 42 + } + + fmt.Println("Done.") +} diff --git a/embed/go.mod b/embed/go.mod new file mode 100644 index 00000000..104b627f --- /dev/null +++ b/embed/go.mod @@ -0,0 +1,35 @@ +module github.com/refaktor/rye/embed + +go 1.26.1 + +// Replace directive points to the parent rye module in the repository. +// When used by external projects, remove this replace and reference a +// specific version: github.com/refaktor/rye/embed v0.x.y +replace github.com/refaktor/rye => ../ + +require github.com/refaktor/rye v0.0.0-00010101000000-000000000000 + +require ( + github.com/clipperhouse/uax29/v2 v2.7.0 // indirect + github.com/drewlanenga/govector v0.0.0-20220726163947-b958ac08bc93 // indirect + github.com/elastic/go-seccomp-bpf v1.6.0 // indirect + github.com/fsnotify/fsnotify v1.10.1 // indirect + github.com/kopoli/go-terminal-size v0.0.0-20170219200355-5c97524c8b54 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/landlock-lsm/go-landlock v0.8.1 // indirect + github.com/mattn/go-isatty v0.0.22 // indirect + github.com/mattn/go-runewidth v0.0.24 // indirect + github.com/pkg/term v1.2.0-beta.2.0.20211217091447-1a4a3b719465 // indirect + github.com/refaktor/keyboard v0.0.0-20260517095250-755a59d30156 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect + github.com/stretchr/testify v1.11.1 // indirect + golang.org/x/crypto v0.52.0 // indirect + golang.org/x/net v0.55.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/sys v0.45.0 // indirect + golang.org/x/term v0.43.0 // indirect + golang.org/x/text v0.37.0 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + kernel.org/pub/linux/libs/security/libcap/psx v1.2.77 // indirect +) diff --git a/embed/go.sum b/embed/go.sum new file mode 100644 index 00000000..b3ff6471 --- /dev/null +++ b/embed/go.sum @@ -0,0 +1,60 @@ +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk= +github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/drewlanenga/govector v0.0.0-20220726163947-b958ac08bc93 h1:2VXZHsypUG1HaQcj/+nQc5TbZ4qZ5FSl7KN4s1BjFQY= +github.com/drewlanenga/govector v0.0.0-20220726163947-b958ac08bc93/go.mod h1:AbP/uRrjZFATEwl0P2DHePteIMZRWHEJBWBmMmLdCkk= +github.com/elastic/go-seccomp-bpf v1.6.0 h1:NYduiYxRJ0ZkIyQVwlSskcqPPSg6ynu5pK0/d7SQATs= +github.com/elastic/go-seccomp-bpf v1.6.0/go.mod h1:5tFsTvH4NtWGfpjsOQD53H8HdVQ+zSZFRUDSGevC0Kc= +github.com/fsnotify/fsnotify v1.10.1 h1:b0/UzAf9yR5rhf3RPm9gf3ehBPpf0oZKIjtpKrx59Ho= +github.com/fsnotify/fsnotify v1.10.1/go.mod h1:TLheqan6HD6GBK6PrDWyDPBaEV8LspOxvPSjC+bVfgo= +github.com/kopoli/go-terminal-size v0.0.0-20170219200355-5c97524c8b54 h1:0SMHxjkLKNawqUjjnMlCtEdj6uWZjv0+qDZ3F6GOADI= +github.com/kopoli/go-terminal-size v0.0.0-20170219200355-5c97524c8b54/go.mod h1:bm7MVZZvHQBfqHG5X59jrRE/3ak6HvK+/Zb6aZhLR2s= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +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/landlock-lsm/go-landlock v0.8.1 h1:Krs1co16IzN7bQcFYIdtNF+BKwZem3geRBkVsZtlCKU= +github.com/landlock-lsm/go-landlock v0.8.1/go.mod h1:mn5GSi81Jf7yMs5WSi+SUi4sUeNLUGVdbT4Id6wXNQw= +github.com/mattn/go-isatty v0.0.22 h1:j8l17JJ9i6VGPUFUYoTUKPSgKe/83EYU2zBC7YNKMw4= +github.com/mattn/go-isatty v0.0.22/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= +github.com/mattn/go-runewidth v0.0.24 h1:cpokDiIn0MGnhdHwuWnJBITySJ20QyNGnY2kR/ay2DU= +github.com/mattn/go-runewidth v0.0.24/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/pkg/term v1.2.0-beta.2.0.20211217091447-1a4a3b719465 h1:J1AQza02ffZ4VP77HnZ5kRyzf6ak1LkjYQutOCdvckI= +github.com/pkg/term v1.2.0-beta.2.0.20211217091447-1a4a3b719465/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/refaktor/keyboard v0.0.0-20260517095250-755a59d30156 h1:65WdY1ncb72bv7BDabW9iiCnUtgCddiP2qCA++bhTMo= +github.com/refaktor/keyboard v0.0.0-20260517095250-755a59d30156/go.mod h1:GwFCpZSiID9sqQ9Zm0tCmw8eeI9hThLQ7pv1wcTp0I0= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988= +golang.org/x/crypto v0.52.0/go.mod h1:1QgfPxDqh0T2M/elOJtp9RvuR95kVjir0e6/BvEmGbc= +golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= +golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= +golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4= +golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +kernel.org/pub/linux/libs/security/libcap/psx v1.2.77 h1:Z06sMOzc0GNCwp6efaVrIrz4ywGJ1v+DP0pjVkOfDuA= +kernel.org/pub/linux/libs/security/libcap/psx v1.2.77/go.mod h1:+l6Ee2F59XiJ2I6WR5ObpC1utCQJZ/VLsEbQCD8RG24= diff --git a/embed/rye.go b/embed/rye.go new file mode 100644 index 00000000..417a43cb --- /dev/null +++ b/embed/rye.go @@ -0,0 +1,252 @@ +// Package embed provides a lightweight, dependency-minimal API for embedding +// the Rye scripting language in Go applications. +// +// # Build tags +// +// This sub-module is always built with the three tags below, which exclude +// optional heavy batteries from the dependency graph: +// +// no_persistent – exclude badger-backed persistent contexts +// no_table – exclude excelize-backed spreadsheet tables +// no_vector – exclude govector / primes math extensions +// +// The only external dependencies added to a consuming project are: +// +// golang.org/x/term – terminal state queries +// golang.org/x/sync – errgroup (used in builtins_base_printing) +// golang.org/x/text – unicode case-folding (used in builtins_base_strings) +// golang.org/x/crypto – PBKDF2 (used in util/securesave) +// golang.org/x/sys – indirect (required by term and crypto) +// +// # Quick start +// +// engine := embed.New() +// +// engine.RegisterBuiltin("double", 1, func(ps *env.ProgramState, a0, _, _, _, _ env.Object) env.Object { +// return *env.NewInteger(a0.(env.Integer).Value * 2) +// }) +// +// result, err := engine.Eval(`double 21`) +// fmt.Println(result) // 42 +package embed + +import ( + "errors" + "fmt" + + "github.com/refaktor/rye/env" + "github.com/refaktor/rye/evaldo" + "github.com/refaktor/rye/loader" +) + +// BuiltinFn is the Go function signature required by Rye builtins. +// ps is the running program state; a0–a4 are positional arguments. +// Unused argument slots receive env.Void{}. +type BuiltinFn = env.BuiltinFunction + +// Engine is a single Rye interpreter instance with its own word index and +// execution context. Create one with [New] or [NewBlank]. +type Engine struct { + ps *env.ProgramState +} + +// New creates an Engine pre-loaded with all base Rye builtins +// (arithmetic, strings, collections, control flow, I/O, …). +// Register additional Go functions with [Engine.RegisterBuiltin]. +func New() *Engine { + block, idxs := loader.LoadStringNoPEG("", false) + ps := env.NewProgramStateOLD(block.(env.Block).Series, idxs) + evaldo.RegisterBuiltins(ps) + return &Engine{ps: ps} +} + +// NewBlank creates an Engine with NO pre-registered builtins. +// Useful when you want complete control over the available vocabulary. +func NewBlank() *Engine { + block, idxs := loader.LoadStringNoPEG("", false) + ps := env.NewProgramStateOLD(block.(env.Block).Series, idxs) + return &Engine{ps: ps} +} + +// ProgramState returns the underlying *env.ProgramState for advanced +// integration (e.g. reading back Rye values, inspecting the word index, +// registering context-aware builtins manually). +func (e *Engine) ProgramState() *env.ProgramState { + return e.ps +} + +// --------------------------------------------------------------------------- +// Builtin registration +// --------------------------------------------------------------------------- + +// RegisterBuiltin registers a Go function as a Rye builtin word. +// +// - name – the Rye word (e.g. "greet", "db-query") +// - argCount – number of arguments the function accepts (0–5) +// - fn – the Go implementation (signature: BuiltinFn) +func (e *Engine) RegisterBuiltin(name string, argCount int, fn BuiltinFn) { + idx := e.ps.Idx.IndexWord(name) + b := env.NewBuiltin(fn, argCount, false, false, "") + e.ps.Ctx.Set(idx, *b) +} + +// RegisterBuiltinDoc is like [Engine.RegisterBuiltin] but also attaches a +// documentation string visible via the Rye `doc` word. +func (e *Engine) RegisterBuiltinDoc(name string, argCount int, doc string, fn BuiltinFn) { + idx := e.ps.Idx.IndexWord(name) + b := env.NewBuiltin(fn, argCount, false, false, doc) + e.ps.Ctx.Set(idx, *b) +} + +// --------------------------------------------------------------------------- +// Setting and getting Rye words from Go +// --------------------------------------------------------------------------- + +// SetWord injects a Rye word into the current context. +// This is convenient for passing Go values to a script before evaluation. +// +// Example: +// +// engine.SetWord("port", *env.NewInteger(8080)) +// engine.Eval(`print "listening on port" + to-string port`) +func (e *Engine) SetWord(name string, val env.Object) { + idx := e.ps.Idx.IndexWord(name) + e.ps.Ctx.Set(idx, val) +} + +// GetWord retrieves the value of a Rye word from the current context. +// Returns (nil, false) if the word has not been set. +func (e *Engine) GetWord(name string) (env.Object, bool) { + idx, found := e.ps.Idx.GetIndex(name) + if !found { + return nil, false + } + obj, exists := e.ps.Ctx.Get(idx) + if !exists { + return nil, false + } + return obj, true +} + +// --------------------------------------------------------------------------- +// Evaluation +// --------------------------------------------------------------------------- + +// Eval parses and evaluates Rye source code. +// Returns the result serialised as a human-readable string, or an error if +// parsing or evaluation fails. +func (e *Engine) Eval(code string) (string, error) { + obj, err := e.EvalGetObject(code) + if err != nil { + return "", err + } + if obj == nil { + return "", nil + } + return obj.Print(*e.ps.Idx), nil +} + +// EvalGetObject parses and evaluates Rye source code and returns the raw +// env.Object result. Callers can type-assert to env.Integer, env.String, +// env.Block, etc. +func (e *Engine) EvalGetObject(code string) (env.Object, error) { + block := loader.LoadString(code, false, e.ps) + if errObj, ok := block.(env.Error); ok { + return nil, fmt.Errorf("parse error: %s", errObj.Message) + } + // Update the series on the existing program state, preserving ctx & idx. + e.ps.SetBlock(block.(env.Block)) + e.ps.ErrorFlag = false + e.ps.ReturnFlag = false + e.ps.FailureFlag = false + evaldo.Eval(e.ps) + if e.ps.ErrorFlag { + return nil, fmt.Errorf("eval error: %s", e.ps.Res.Print(*e.ps.Idx)) + } + return e.ps.Res, nil +} + +// EvalBytes is a convenience wrapper that evaluates a []byte source. +// Useful when the script is read from a file: +// +// src, _ := os.ReadFile("config.rye") +// result, err := engine.EvalBytes(src) +func (e *Engine) EvalBytes(src []byte) (string, error) { + return e.Eval(string(src)) +} + +// --------------------------------------------------------------------------- +// Typed result helpers +// --------------------------------------------------------------------------- + +// EvalString evaluates code and returns the result as a Go string. +// Returns an error if the result is not a Rye String. +func (e *Engine) EvalString(code string) (string, error) { + obj, err := e.EvalGetObject(code) + if err != nil { + return "", err + } + s, ok := obj.(env.String) + if !ok { + return "", errors.New("result is not a string: " + obj.Print(*e.ps.Idx)) + } + return s.Value, nil +} + +// EvalInteger evaluates code and returns the result as a Go int64. +// Returns an error if the result is not a Rye Integer. +func (e *Engine) EvalInteger(code string) (int64, error) { + obj, err := e.EvalGetObject(code) + if err != nil { + return 0, err + } + i, ok := obj.(env.Integer) + if !ok { + return 0, errors.New("result is not an integer: " + obj.Print(*e.ps.Idx)) + } + return i.Value, nil +} + +// EvalDecimal evaluates code and returns the result as a Go float64. +// Returns an error if the result is not a Rye Decimal. +func (e *Engine) EvalDecimal(code string) (float64, error) { + obj, err := e.EvalGetObject(code) + if err != nil { + return 0, err + } + d, ok := obj.(env.Decimal) + if !ok { + return 0, errors.New("result is not a decimal: " + obj.Print(*e.ps.Idx)) + } + return d.Value, nil +} + +// EvalBool evaluates code and returns the result as a Go bool. +// Returns an error if the result is not a Rye Integer with value 0 or 1 +// (Rye's boolean representation). +func (e *Engine) EvalBool(code string) (bool, error) { + obj, err := e.EvalGetObject(code) + if err != nil { + return false, err + } + switch v := obj.(type) { + case env.Integer: + return v.Value != 0, nil + default: + return false, errors.New("result is not a boolean (integer): " + obj.Print(*e.ps.Idx)) + } +} + +// --------------------------------------------------------------------------- +// Lifecycle +// --------------------------------------------------------------------------- + +// Reset re-initialises the engine with a fresh context and re-registers all +// base Rye builtins. Custom builtins registered with RegisterBuiltin are +// removed — call RegisterBuiltin again to re-add them, or use [New] to +// create a fresh engine. +func (e *Engine) Reset() { + block, idxs := loader.LoadStringNoPEG("", false) + e.ps = env.NewProgramStateOLD(block.(env.Block).Series, idxs) + evaldo.RegisterBuiltins(e.ps) +} diff --git a/env/object.go b/env/object.go index 3217f110..3d413678 100644 --- a/env/object.go +++ b/env/object.go @@ -9,7 +9,6 @@ import ( "strings" "time" - "github.com/drewlanenga/govector" ) type Type int @@ -3072,109 +3071,6 @@ func (i Time) Dump(e Idxs) string { return fmt.Sprintf("datetime \"%s\"", i.Value.Format("2006-01-02T15:04:05")) } -// -// VECTOR -// - -// Vector -- feture vector (uses govector) -type Vector struct { - Value govector.Vector - Kind Word -} - -func NewVector(vec govector.Vector) *Vector { - //vec, err := govector.AsVector(data) - //if err != nil { - // return MakeError(env1, err.Error()) - //} - return &Vector{vec, Word{0, false}} -} - -func ArrayFloat32FromSeries(block TSeries) []float32 { - data := make([]float32, block.Len()) - for block.Pos() < block.Len() { - i := block.Pos() - k1 := block.Pop() - switch k := k1.(type) { - case Integer: - data[i] = float32(k.Value) - case Decimal: - data[i] = float32(k.Value) - } - } - return data -} - -func NewVectorFromSeries(block TSeries) *Vector { - data := ArrayFloat32FromSeries(block) - vec, err := govector.AsVector(data) - if err != nil { - return nil - } - return &Vector{vec, Word{0, false}} -} - -func (i Vector) Type() Type { - return VectorType -} - -func (i Vector) Inspect(idxs Idxs) string { - var bu strings.Builder - bu.WriteString("[Vector:") //(" + i.Kind.Print(idxs) + "):") - bu.WriteString(" Len " + strconv.Itoa(i.Value.Len())) - bu.WriteString(" Norm " + fmt.Sprintf("%.2f", govector.Norm(i.Value, 2.0))) - bu.WriteString(" Mean " + fmt.Sprintf("%.2f", i.Value.Mean())) - bu.WriteString("]") - return bu.String() -} - -func (i Vector) Print(idxs Idxs) string { - var bu strings.Builder - bu.WriteString("V[") - bu.WriteString("Len " + strconv.Itoa(i.Value.Len())) - bu.WriteString(" Norm " + fmt.Sprintf("%.2f", govector.Norm(i.Value, 2.0))) - bu.WriteString(" Mean " + fmt.Sprintf("%.2f", i.Value.Mean())) - bu.WriteString("]") - return bu.String() -} - -func (i Vector) Trace(msg string) { - fmt.Print(msg + "(Vector): ") -} - -func (i Vector) GetKind() int { - return int(VectorType) -} - -func (i Vector) Equal(o Object) bool { - if i.Type() != o.Type() { - return false - } - oVector := o.(Vector) - if !i.Kind.Equal(oVector.Kind) { - return false - } - if i.Value.Len() != oVector.Value.Len() { - return false - } - for j := 0; j < i.Value.Len(); j++ { - if i.Value[j] != oVector.Value[j] { - return false - } - } - return true -} - -func (i Vector) Dump(e Idxs) string { - var b strings.Builder - b.WriteString("vector { ") - for _, v := range i.Value { - b.WriteString(fmt.Sprintf("%f ", v)) - } - b.WriteString("}") - return b.String() -} - // // MATRIX // diff --git a/env/persistent_table.go b/env/persistent_table.go deleted file mode 100644 index 82e7df4c..00000000 --- a/env/persistent_table.go +++ /dev/null @@ -1,484 +0,0 @@ -package env - -import ( - "encoding/json" - "fmt" - "slices" - "strconv" - "strings" - "sync" - - "github.com/dgraph-io/badger/v4" -) - -// PersistentTable implements TableInterface with BadgerDB persistence -type PersistentTable struct { - Cols []string - Kind Word - Indexes map[string]map[any][]int - db *badger.DB - tableName string - mu sync.RWMutex - rowCount int64 -} - -// SerializableRow represents a row that can be serialized to JSON -type SerializableRow struct { - Values []interface{} `json:"values"` - ID int64 `json:"id"` -} - -// NewPersistentTable creates a new persistent table with BadgerDB backend -func NewPersistentTable(cols []string, dbPath string, tableName string) (*PersistentTable, error) { - opts := badger.DefaultOptions(dbPath) - opts.Logger = nil // Disable logging - - db, err := badger.Open(opts) - if err != nil { - return nil, fmt.Errorf("failed to open BadgerDB: %v", err) - } - - pt := &PersistentTable{ - Cols: cols, - Indexes: make(map[string]map[any][]int), - db: db, - tableName: tableName, - rowCount: 0, - } - - // Load existing metadata - err = pt.loadMetadata() - if err != nil { - return nil, fmt.Errorf("failed to load metadata: %v", err) - } - - return pt, nil -} - -// Close closes the database connection -func (pt *PersistentTable) Close() error { - return pt.db.Close() -} - -// loadMetadata loads table metadata from the database -func (pt *PersistentTable) loadMetadata() error { - return pt.db.View(func(txn *badger.Txn) error { - // Load column information - colKey := fmt.Sprintf("%s:cols", pt.tableName) - item, err := txn.Get([]byte(colKey)) - if err == badger.ErrKeyNotFound { - // First time setup - save columns - return pt.saveMetadata() - } - if err != nil { - return err - } - - err = item.Value(func(val []byte) error { - return json.Unmarshal(val, &pt.Cols) - }) - if err != nil { - return err - } - - // Load row count - countKey := fmt.Sprintf("%s:count", pt.tableName) - item, err = txn.Get([]byte(countKey)) - if err == badger.ErrKeyNotFound { - pt.rowCount = 0 - return nil - } - if err != nil { - return err - } - - return item.Value(func(val []byte) error { - return json.Unmarshal(val, &pt.rowCount) - }) - }) -} - -// saveMetadata saves table metadata to the database -func (pt *PersistentTable) saveMetadata() error { - return pt.db.Update(func(txn *badger.Txn) error { - // Save columns - colKey := fmt.Sprintf("%s:cols", pt.tableName) - colData, err := json.Marshal(pt.Cols) - if err != nil { - return err - } - err = txn.Set([]byte(colKey), colData) - if err != nil { - return err - } - - // Save row count - countKey := fmt.Sprintf("%s:count", pt.tableName) - countData, err := json.Marshal(pt.rowCount) - if err != nil { - return err - } - return txn.Set([]byte(countKey), countData) - }) -} - -// AddRow adds a row to the persistent table -func (pt *PersistentTable) AddRow(row TableRow) { - pt.mu.Lock() - defer pt.mu.Unlock() - - pt.rowCount++ - rowID := pt.rowCount - - serRow := SerializableRow{ - Values: row.Values, - ID: rowID, - } - - err := pt.db.Update(func(txn *badger.Txn) error { - key := fmt.Sprintf("%s:row:%d", pt.tableName, rowID) - data, err := json.Marshal(serRow) - if err != nil { - return err - } - return txn.Set([]byte(key), data) - }) - - if err != nil { - fmt.Printf("Error adding row: %v\n", err) - pt.rowCount-- // Rollback count on error - return - } - - // Update metadata - pt.saveMetadata() -} - -// GetRows retrieves all rows from the persistent table -func (pt *PersistentTable) GetRows() []TableRow { - pt.mu.RLock() - defer pt.mu.RUnlock() - - var rows []TableRow - - pt.db.View(func(txn *badger.Txn) error { - prefix := fmt.Sprintf("%s:row:", pt.tableName) - it := txn.NewIterator(badger.DefaultIteratorOptions) - defer it.Close() - - for it.Seek([]byte(prefix)); it.ValidForPrefix([]byte(prefix)); it.Next() { - item := it.Item() - err := item.Value(func(val []byte) error { - var serRow SerializableRow - err := json.Unmarshal(val, &serRow) - if err != nil { - return err - } - - row := TableRow{ - Values: serRow.Values, - Uplink: pt, - } - rows = append(rows, row) - return nil - }) - if err != nil { - fmt.Printf("Error reading row: %v\n", err) - } - } - return nil - }) - - return rows -} - -// GetRow retrieves a specific row by index -func (pt *PersistentTable) GetRow(ps *ProgramState, index int) TableRow { - pt.mu.RLock() - defer pt.mu.RUnlock() - - var row TableRow - rowID := int64(index + 1) // Convert 0-based index to 1-based ID - - err := pt.db.View(func(txn *badger.Txn) error { - key := fmt.Sprintf("%s:row:%d", pt.tableName, rowID) - item, err := txn.Get([]byte(key)) - if err != nil { - return err - } - - return item.Value(func(val []byte) error { - var serRow SerializableRow - err := json.Unmarshal(val, &serRow) - if err != nil { - return err - } - - row = TableRow{ - Values: serRow.Values, - Uplink: pt, - } - return nil - }) - }) - - if err != nil { - fmt.Printf("Error getting row %d: %v\n", index, err) - return TableRow{Values: make([]any, len(pt.Cols)), Uplink: pt} - } - - return row -} - -// RemoveRowByIndex removes a row by index -func (pt *PersistentTable) RemoveRowByIndex(index int64) { - pt.mu.Lock() - defer pt.mu.Unlock() - - rowID := index + 1 // Convert 0-based index to 1-based ID - - err := pt.db.Update(func(txn *badger.Txn) error { - key := fmt.Sprintf("%s:row:%d", pt.tableName, rowID) - return txn.Delete([]byte(key)) - }) - - if err != nil { - fmt.Printf("Error removing row %d: %v\n", index, err) - } -} - -// GetColumn retrieves a specific column -func (pt *PersistentTable) GetColumn(name string) Object { - rows := pt.GetRows() - col1 := make([]Object, len(rows)) - idx := slices.Index[[]string](pt.Cols, name) - if idx > -1 { - for i, row := range rows { - col1[i] = ToRyeValue(row.Values[idx]) - } - return *NewBlock(*NewTSeries(col1)) - } else { - return NewError("Column not found") - } -} - -// GetColumns returns the list of column names -func (pt *PersistentTable) GetColumns() List { - lst := make([]any, len(pt.Cols)) - for i, v := range pt.Cols { - lst[i] = v - } - return *NewList(lst) -} - -// GetColumnIndex returns the index of a column -func (pt *PersistentTable) GetColumnIndex(column string) int { - index := -1 - for i, v := range pt.Cols { - if v == column { - index = i - break - } - } - return index -} - -// GetColumnNames returns the column names -func (pt *PersistentTable) GetColumnNames() []string { - return pt.Cols -} - -// SetCols sets the column names -func (pt *PersistentTable) SetCols(vals []string) { - pt.mu.Lock() - defer pt.mu.Unlock() - pt.Cols = vals - pt.saveMetadata() -} - -// GetRowValue gets a value from a row by column name -func (pt *PersistentTable) GetRowValue(column string, rrow TableRow) (any, error) { - index := -1 - for i, v := range pt.Cols { - if v == column { - index = i - break - } - } - if index < 0 { - return "", fmt.Errorf("column %s not found", column) - } - return rrow.Values[index], nil -} - -// Columns returns a new table with only the specified columns -func (pt *PersistentTable) Columns(ps *ProgramState, names []string) Object { - idxs := make([]int, len(names)) - for name := range names { - idx := slices.Index[[]string](pt.Cols, names[name]) - if idx == -1 { - return makeError(ps, "Col not found") - } - idxs[name] = idx - } - - // Create a new in-memory table for the result - nspr := NewTable(names) - rows := pt.GetRows() - - for _, row := range rows { - row2 := make([]any, len(names)) - for col := range idxs { - if len(row.Values) > col { - row2[col] = row.Values[idxs[col]] - } - } - nspr.AddRow(TableRow{row2, nspr}) - } - return *nspr -} - -// Length returns the number of rows -func (pt *PersistentTable) Length() int { - pt.mu.RLock() - defer pt.mu.RUnlock() - return int(pt.rowCount) -} - -// NRows returns the number of rows -func (pt *PersistentTable) NRows() int { - return pt.Length() -} - -// Type returns the type -func (pt *PersistentTable) Type() Type { - return PersistentTableType -} - -// GetKind returns the kind -func (pt *PersistentTable) GetKind() int { - return int(PersistentTableType) -} - -// Equal compares two persistent tables -func (pt *PersistentTable) Equal(o Object) bool { - if pt.Type() != o.Type() { - return false - } - other, ok := o.(*PersistentTable) - if !ok { - return false - } - - if len(pt.Cols) != len(other.Cols) { - return false - } - - for i, col := range pt.Cols { - if col != other.Cols[i] { - return false - } - } - - return pt.tableName == other.tableName -} - -// Inspect returns a string representation -func (pt *PersistentTable) Inspect(e Idxs) string { - rows := strconv.Itoa(pt.Length()) - var kindStr string - if pt.GetKind() != int(PersistentTableType) { - kindStr = " of kind " + pt.Kind.Print(e) - } - return "[PersistentTable(" + strconv.Itoa(len(pt.Cols)) + " " + rows + ")" + kindStr + "]" -} - -// Print returns a text representation -func (pt *PersistentTable) Print(e Idxs) string { - return pt.ToTxt() -} - -// ToHtml returns HTML representation -func (pt *PersistentTable) ToHtml() string { - var bu strings.Builder - bu.WriteString("") - rows := pt.GetRows() - for _, row := range rows { - bu.WriteString("") - for _, val := range row.Values { - bu.WriteString("") - } - bu.WriteString("") - } - bu.WriteString("
") - bu.WriteString(fmt.Sprint(val)) - bu.WriteString("
") - return bu.String() -} - -// ToTxt returns text representation -func (pt *PersistentTable) ToTxt() string { - var bu strings.Builder - for _, name := range pt.Cols { - bu.WriteString(fmt.Sprint(name)) - bu.WriteString("\t|") - } - bu.WriteString("\n") - rows := pt.GetRows() - for _, row := range rows { - for _, val := range row.Values { - bu.WriteString(fmt.Sprint(val)) - bu.WriteString("\t|") - } - bu.WriteString("\n") - } - return bu.String() -} - -// Dump returns a dump representation -func (pt *PersistentTable) Dump(e Idxs) string { - var sb strings.Builder - sb.WriteString("persistent-table {") - - for _, col := range pt.Cols { - sb.WriteString(" ") - sb.WriteString("\"") - sb.WriteString(col) - sb.WriteString("\"") - } - sb.WriteString(" } [") - - rows := pt.GetRows() - for _, row := range rows { - for _, val := range row.Values { - sb.WriteString(" ") - ryeVal := ToRyeValue(val) - if ryeVal != nil { - sb.WriteString(ryeVal.Dump(e)) - } else { - sb.WriteString("_") - } - } - // Fill in missing columns (if they exist) with void (_) - for i := len(row.Values); i < len(pt.Cols); i++ { - sb.WriteString(" _") - } - } - sb.WriteString(" ]") - return sb.String() -} - -// Trace prints trace information -func (pt *PersistentTable) Trace(msg string) { - fmt.Print(msg + " (persistent-table): ") -} - -// Get returns a row by index (for Collections interface) -func (pt *PersistentTable) Get(i int) Object { - return pt.GetRow(nil, i) -} - -// MakeNew creates a new collection (for Collections interface) -func (pt *PersistentTable) MakeNew(data []Object) Object { - return *NewBlock(*NewTSeries(data)) -} diff --git a/evaldo/builtins.go b/evaldo/builtins.go index a3eef478..97811372 100644 --- a/evaldo/builtins.go +++ b/evaldo/builtins.go @@ -1274,7 +1274,7 @@ var builtins = map[string]*env.Builtin{ case env.Kind: switch dict := arg1.(type) { case env.Dict: - obj := BuiValidate(ps, dict, spec.Spec) + obj := BatteryValidateHook(ps, dict, spec.Spec) switch obj1 := obj.(type) { case env.Dict: ctx := util.Dict2Context(ps, obj1) @@ -1285,7 +1285,7 @@ var builtins = map[string]*env.Builtin{ } case *env.RyeCtx: if spec.HasConverter(dict.Kind.Index) { - obj := BuiConvert(ps, dict, spec.Converters[dict.Kind.Index]) + obj := BatteryConvertHook(ps, dict, spec.Converters[dict.Kind.Index]) switch ctx := obj.(type) { case *env.RyeCtx: ctx.Kind = spec.Kind @@ -2080,13 +2080,13 @@ var builtins = map[string]*env.Builtin{ ps.ErrorFlag = true return MakeArgError(ps, 2, []env.Type{env.BlockType}, "do\\inside") } - case *PersistentCtx: + case PersistentCtxInterface: switch bloc := arg1.(type) { case env.Block: ser := ps.Ser ps.Ser = bloc.Series // Use a special evaluation function for PersistentCtx - EvalBlockInPersistentCtx(ps, ctx) + BatteryEvalInPersistentCtxHook(ps, ctx) MaybeDisplayFailureOrError(ps, ps.Idx, "do\\inside") ps.Ser = ser return ps.Res @@ -3088,13 +3088,14 @@ func isTruthy(arg env.Object) env.Object { } */ +// RegisterBuiltins registers the base (core language) builtins only. +// For the full standard set including batteries, also call batteries.RegisterBatteries(ps). func RegisterBuiltins(ps *env.ProgramState) { BuiltinNames = make(map[string]int) RegisterBuiltins2(builtins, ps, "base") RegisterBuiltins2(builtins_boolean, ps, "base") RegisterBuiltins2(builtins_numbers, ps, "base") RegisterBuiltins2(builtins_mth, ps, "base") - RegisterBuiltins2(builtins_complex, ps, "base") RegisterBuiltins2(builtins_time, ps, "base") RegisterBuiltins2(builtins_string, ps, "base") RegisterBuiltins2(builtins_collection, ps, "base") @@ -3104,74 +3105,9 @@ func RegisterBuiltins(ps *env.ProgramState) { RegisterBuiltins2(builtins_types, ps, "base") RegisterBuiltins2(builtins_iteration, ps, "base") RegisterBuiltins2(builtins_contexts, ps, "base") - RegisterBuiltins2(builtins_persistent_contexts, ps, "base") RegisterBuiltins2(builtins_functions, ps, "base") - RegisterBuiltins2(builtins_unique, ps, "base") - // already in base_functions RegisterBuiltins2(builtins_apply, ps, "base") - RegisterBuiltins2(Builtins_error_creation, ps, "error-creation") - RegisterBuiltins2(Builtins_error_inspection, ps, "error-inspection") - RegisterBuiltins2(Builtins_error_handling, ps, "error-handling") - RegisterBuiltins2(Builtins_match, ps, "match") - RegisterBuiltins2(Builtins_table, ps, "table") - RegisterBuiltins2(Builtins_vector, ps, "vector") - RegisterBuiltins2(Builtins_matrix, ps, "matrix") - RegisterBuiltins2(Builtins_io, ps, "io") - RegisterBuiltins2(Builtins_cmd, ps, "cmd") - RegisterBuiltins2(Builtins_regexp, ps, "regexp") - RegisterBuiltins2(Builtins_validation, ps, "validation") - RegisterBuiltins2(Builtins_cli, ps, "cli") - RegisterBuiltins2(Builtins_conversion, ps, "conversion") - RegisterBuiltins2(Builtins_web, ps, "web") - RegisterBuiltins2(Builtins_markdown, ps, "markdown") - RegisterBuiltins2(Builtins_sxml, ps, "sxml") - RegisterBuiltins2(Builtins_html, ps, "html") - RegisterBuiltins2(Builtins_json, ps, "json") - RegisterBuiltins2(Builtins_bson, ps, "bson") - RegisterBuiltins2(Builtins_stackless, ps, "stackless") - RegisterBuiltins2(Builtins_eyr, ps, "eyr") - RegisterBuiltins2(Builtins_goroutines, ps, "goroutines") - RegisterBuiltins2(Builtins_msgdispatcher, ps, "msgdispatcher") - RegisterBuiltins2(Builtins_http, ps, "http") - RegisterBuiltins2(Builtins_sqlite, ps, "sqlite") - RegisterBuiltins2(Builtins_psql, ps, "psql") - RegisterBuiltins2(Builtins_mysql, ps, "mysql") - RegisterBuiltins2(Builtins_email, ps, "email") - RegisterBuiltins2(Builtins_imap, ps, "imap") - RegisterBuiltins2(Builtins_structures, ps, "structs") - RegisterBuiltins2(Builtins_smtpd, ps, "smtpd") - RegisterBuiltins2(Builtins_mail, ps, "mail") - RegisterBuiltins2(Builtins_ssh, ps, "ssh") - RegisterBuiltins2(Builtins_bcrypt, ps, "bcrypt") - RegisterBuiltins2(Builtins_console, ps, "console") - RegisterBuiltinsInContext(Builtins_crypto, ps, "crypto") - RegisterBuiltinsInContext(Builtins_encoding, ps, "encoding") - RegisterBuiltinsInContext(Builtins_math, ps, "math") - RegisterBuiltinsInContext(Builtins_os, ps, "os") - RegisterBuiltinsInContext(Builtins_pipes, ps, "pipes") - RegisterBuiltinsInContext(Builtins_term, ps, "term") - RegisterBuiltinsInContext(Builtins_termstr, ps, "termstr") - RegisterBuiltinsInContext(Builtins_tui, ps, "tui") - RegisterBuiltinsInContext(Builtins_telegrambot, ps, "telegram") - RegisterBuiltinsInContext(Builtins_mcp, ps, "mcp") - RegisterBuiltins2(Builtins_mqtt, ps, "mqtt") - RegisterBuiltins2(Builtins_chitosocket, ps, "chitosocket") - RegisterBuiltins2(builtins_trees, ps, "trees") - // RegisterBuiltinsInContext(Builtins_git, ps, "git") - // temporarily removed RegisterBuiltinsInContext(Builtins_docker, ps, "docker") - RegisterBuiltinsInContext(Builtins_prometheus, ps, "prometheus") - RegisterBuiltinsInContext(Builtins_echarts, ps, "echarts") - RegisterBuiltinsInContext(Builtins_flui, ps, "flui") - RegisterBuiltins2(Builtins_js_interop, ps, "jsinterop") - // RegisterBuiltinsInContext(Builtins_flui_v2, ps, "flui2") - // ## Archived modules - // RegisterBuiltins2(Builtins_gtk, ps, "gtk") - // RegisterBuiltins2(Builtins_nats, ps, "nats") - // RegisterBuiltins2(Builtins_qframe, ps, "qframe") - // RegisterBuiltins2(Builtins_nng, ps, "nng") - // RegisterBuiltins2(Builtins_raylib, ps, "raylib") - // RegisterBuiltins2(Builtins_cayley, ps, "cayley") - - // Execute initialization code after everything is loaded but before any custom code is evaluated + + // Execute initialization code after base builtins are loaded executeInitializationCode(ps) } @@ -3343,7 +3279,6 @@ var allBuiltinGroups = []builtinGroup{ {"base", builtins_boolean, false}, {"base", builtins_numbers, false}, {"base", builtins_mth, false}, - {"base", builtins_complex, false}, {"base", builtins_time, false}, {"base", builtins_string, false}, {"base", builtins_collection, false}, @@ -3353,64 +3288,9 @@ var allBuiltinGroups = []builtinGroup{ {"base", builtins_types, false}, {"base", builtins_iteration, false}, {"base", builtins_contexts, false}, - {"base", builtins_persistent_contexts, false}, {"base", builtins_functions, false}, - // Error handling - {"error-creation", Builtins_error_creation, false}, - {"error-inspection", Builtins_error_inspection, false}, - {"error-handling", Builtins_error_handling, false}, - // Module builtins – flat - {"match", Builtins_match, false}, - {"table", Builtins_table, false}, - {"vector", Builtins_vector, false}, - {"matrix", Builtins_matrix, false}, - {"io", Builtins_io, false}, - {"cmd", Builtins_cmd, false}, - {"regexp", Builtins_regexp, false}, - {"validation", Builtins_validation, false}, - {"cli", Builtins_cli, false}, - {"conversion", Builtins_conversion, false}, - {"web", Builtins_web, false}, - {"markdown", Builtins_markdown, false}, - {"sxml", Builtins_sxml, false}, - {"html", Builtins_html, false}, - {"json", Builtins_json, false}, - {"bson", Builtins_bson, false}, - {"stackless", Builtins_stackless, false}, - {"eyr", Builtins_eyr, false}, - {"goroutines", Builtins_goroutines, false}, - {"msgdispatcher", Builtins_msgdispatcher, false}, - {"http", Builtins_http, false}, - {"sqlite", Builtins_sqlite, false}, - {"psql", Builtins_psql, false}, - {"mysql", Builtins_mysql, false}, - {"email", Builtins_email, false}, - {"imap", Builtins_imap, false}, - {"structs", Builtins_structures, false}, - {"smtpd", Builtins_smtpd, false}, - {"mail", Builtins_mail, false}, - {"ssh", Builtins_ssh, false}, - {"bcrypt", Builtins_bcrypt, false}, - {"console", Builtins_console, false}, - {"mqtt", Builtins_mqtt, false}, - {"chitosocket", Builtins_chitosocket, false}, - // Module builtins – in named child context - {"crypto", Builtins_crypto, true}, - {"encoding", Builtins_encoding, true}, - {"math", Builtins_math, true}, - {"os", Builtins_os, true}, - {"pipes", Builtins_pipes, true}, - {"term", Builtins_term, true}, - {"termstr", Builtins_termstr, true}, - {"tui", Builtins_tui, true}, - {"telegram", Builtins_telegrambot, true}, - {"mcp", Builtins_mcp, true}, - // {"git", Builtins_git, true}, - // {"docker", Builtins_docker, true}, - {"prometheus", Builtins_prometheus, true}, - {"echarts", Builtins_echarts, true}, - {"flui", Builtins_flui, true}, - {"js", Builtins_js_interop, true}, + // NOTE: Battery groups (match, io, http, sqlite, etc.) are registered via + // batteries.RegisterBatteries(ps) — see the batteries/ package. } // RegisterBuiltinGroups registers all builtins belonging to the named groups. diff --git a/evaldo/builtins_base_printing.go b/evaldo/builtins_base_printing.go index 60f1576b..9e07b6ce 100644 --- a/evaldo/builtins_base_printing.go +++ b/evaldo/builtins_base_printing.go @@ -63,22 +63,20 @@ func displayRyeValue(ps *env.ProgramState, arg0 env.Object, interactive bool) (e return obj, "" } case env.Markdown: - items := markdownDisplayItems(bloc.Value) + items := BatteryMarkdownDisplayHook(bloc.Value) if len(items) == 0 { return bloc, "" } - convertedItems := convertMarkdownDisplayItems(items) - obj, esc := term.DisplayMarkdownItems(convertedItems, ps.Idx) + obj, esc := term.DisplayMarkdownItems(items, ps.Idx) if !esc { return obj, "" } case *env.Markdown: - items := markdownDisplayItems(bloc.Value) + items := BatteryMarkdownDisplayHook(bloc.Value) if len(items) == 0 { return bloc, "" } - convertedItems := convertMarkdownDisplayItems(items) - obj, esc := term.DisplayMarkdownItems(convertedItems, ps.Idx) + obj, esc := term.DisplayMarkdownItems(items, ps.Idx) if !esc { return obj, "" } diff --git a/evaldo/builtins_base_types.go b/evaldo/builtins_base_types.go index 4566c16a..d183e29c 100644 --- a/evaldo/builtins_base_types.go +++ b/evaldo/builtins_base_types.go @@ -477,7 +477,7 @@ var builtins_types = map[string]*env.Builtin{ case env.Kind: switch dict := arg0.(type) { case env.Dict: - obj := BuiValidate(ps, dict, spec.Spec) + obj := BatteryValidateHook(ps, dict, spec.Spec) switch obj1 := obj.(type) { case env.Dict: ctx := util.Dict2Context(ps, obj1) @@ -660,7 +660,7 @@ var builtins_types = map[string]*env.Builtin{ case env.Kind: switch dict := arg0.(type) { case env.Dict: - obj := BuiValidate(ps, dict, spec.Spec) + obj := BatteryValidateHook(ps, dict, spec.Spec) switch obj1 := obj.(type) { case env.Dict: ctx := util.Dict2Context(ps, obj1) @@ -671,7 +671,7 @@ var builtins_types = map[string]*env.Builtin{ } case *env.RyeCtx: if spec.HasConverter(dict.Kind.Index) { - obj := BuiConvert(ps, dict, spec.Converters[dict.Kind.Index]) + obj := BatteryConvertHook(ps, dict, spec.Converters[dict.Kind.Index]) switch ctx := obj.(type) { case *env.RyeCtx: ctx.Kind = spec.Kind diff --git a/evaldo/evaldo.go b/evaldo/evaldo.go index 4a8af3f8..94585c8a 100644 --- a/evaldo/evaldo.go +++ b/evaldo/evaldo.go @@ -47,7 +47,7 @@ func EvalBlockInj(ps *env.ProgramState, inj env.Object, injnow bool) { case env.Rye2Dialect: EvalBlockInj_Rye2(ps, inj, injnow) case env.EyrDialect: - Eyr_EvalBlockInside(ps, inj, injnow) // TODO ps.Stack is already in ps ... refactor + BatteryEyrEvalBlockInsideHook(ps, inj, injnow) // TODO ps.Stack is already in ps ... refactor case env.Rye0Dialect: Rye0_EvalBlockInj(ps, inj, injnow) // TODO ps.Stack is already in ps ... refactor case env.Rye00Dialect: diff --git a/evaldo/evalspruce.go_LATER b/evaldo/evalspruce.go_LATER deleted file mode 100755 index 561498ef..00000000 --- a/evaldo/evalspruce.go_LATER +++ /dev/null @@ -1,135 +0,0 @@ -package evaldo - -import ( - "Rejy_go_v1/env" - // "Rejy_go_v1/loader" - "fmt" - //"fmt" - //"strconv" -) - -// Eval SPRUCE dialect works like this: -// We have a spruce tree (SprNode root) -// `give -// me -// five -// { 5 } -// ` -// and Rye block -// spruce { give me five } -// we iterate over block -// first if current item is word we try to find matching level 0 node on spruce tree -// if we find it we store it an look into next word -// if next word is found as a child of current node we loop one line back -// -- isn't found we return an error with child options -// on the path we execute any code blocks we find -// return value of the last code block is returned an result of expression -// when we reach the end of the branch we return this result and with next word start looking at the 0 level nodes -// -// expression inside an expression (if we can't find the next word in our branch, we look at top again and follow that -// when we reach the end of that like we return result, try to match it with previous brach node and continue. If it doesn't -// match we return error, saying that the scentence "xx yy zz" returned type X while "aa bb _ expected one of options [ tt ff ] - -func EvalSpruceBlock(root *env.SprNode, node *env.SprNode, ps *env.ProgramState) *env.ProgramState { - // while not end of spruce user code do - for ps.Ser.Pos() < ps.Ser.Len() { - //fmt.Println("EVALBLOCK: " + strconv.FormatInt(int64(es.Ser.Pos()), 10)) - //fmt.Println("EVALBLOCK N: " + strconv.FormatInt(int64(es.Ser.Len()), 10)) - // TODO --- look at JS code for eval .. what state we carry around - // TODO --- probably block, position, env ... pack all this into one struct - // --- that could be passed in and returned from eval functions (I think) - ps = EvalSpruceExpression(root, node, ps) - //MaybeAcceptComma(es) - //es.Res.Trace("After eval expression") - } - return ps -} - -func EvalSpruceExpression(root *env.SprNode, node *env.SprNode, ps *env.ProgramState) *env.ProgramState { - object := ps.Ser.Pop() - switch object.Type() { - case env.IntegerType: - ps.Res = object - case env.StringType: - ps.Res = object - case env.BlockType: - ps.Res = object - case env.VoidType: - ps.Res = object - case env.TagwordType: - ps.Res = object - case env.WordType: - return EvalSpruceWord(root, node, ps) //, object.(env.Word), nil, false) - // case env.GenwordType: - // return EvalGenword(es, object.(env.Genword), nil, false) - // case env.SetwordType: - // return EvalSpruceSetword(es, object.(env.Setword)) - // case env.GetwordType: - // return EvalGetword(es, object.(env.Getword), nil, false) - // case env.CommaType: - // es.Res = env.NewError("ERROR: expression guard inside expression!") - // default: - // es.Res = env.NewError("Not known type") - } - return ps -} - -func EvalSpruceWord(root *env.SprNode, node *env.SprNode, ps *env.ProgramState) *env.ProgramState { - //fmt.Println("BEFORE BLOCK ***") - //var num = 0 - ////block.Series.Reset() - - // if we don't find the current series word in our we try looking for another toplevel - // node to match and if it does we try to execute that expression. If not we try further - // and if none are left we return an error. But is it error of the first kind or error - // in some subexpression that started matching. We return all posibilities ... all branches, - // that did march, but stopped to match at some point. - - //var ret = env.Object(nil) - //var node = *root - //for block.Series.Pos() < block.Series.Len() { - // fmt.Println("EVALING") - // var obj = block.Series.Pop() - // if obj.Type() == env.WordType { - // LAST var child = node.FindChild(obj.(env.Word).Index) - // LAST if child != nil { - // LAST ret = MaybeDoCode(child) - // LAST node = *child - // LAST fmt.Println(node) - // } else { - // return env.NewError("no path") - // } - // } else if obj.Type() == env.BlockType { - // fmt.Println("EvalBlock()") - // } else { - // fmt.Println("Other type:") - // fmt.Println(obj) - // } - //num += 1 - // LAST } - return ps -} - -func MaybeDoCode(n *env.SprNode, ps env.ProgramState) env.ProgramState { - var ret = env.Object(nil) - for _, child := range n.Children { - if child.Value.Type() == env.BlockType { - //fmt.Println("Block:") - //fmt.Println(child.Value) - //es := env.NewProgramState(child.Value.(env.Block).Series, loader.GetIdxs()) - //RegisterBuiltins(es) - ps = EvalBlock(ps) - //fmt.Println("After eval:") - //fmt.Println(es) - //ret = es.Res - } else if child.Value.Type() == env.ArgwordType { - fmt.Println("Argword:") - fmt.Println(child.Value) - // MAKE THIS FUNCTION es1 := EvalSpruceExpression(es) - idx := word.Index - es1.Env.Set(idx, es1.Res) - return es1 - } - } - return ps -} diff --git a/evaldo/evalspruce_test.go_LATER b/evaldo/evalspruce_test.go_LATER deleted file mode 100755 index 9125e0bc..00000000 --- a/evaldo/evalspruce_test.go_LATER +++ /dev/null @@ -1,121 +0,0 @@ -package evaldo - -import ( - "Rejy_go_v1/env" - "Rejy_go_v1/loader" - "fmt" - "testing" -) - -// -// Literal values -// - -func __TestEvalSpruce_first_sample(t *testing.T) { - builder := `give - me - five - { add 2 3 } -` - // TODO -- genv (Idxs) is now implicitly passed in both Load*String ... that is weird - // make it a normal object we create when we need it and pass around where needed - - builder1, genv := loader.LoadSpruceString(builder) - - user := "{ give me five }" - - user1, genv := loader.LoadString(user) - - ps := env.NewProgramState(user1, genv) - - var result = EvalSpruceBlock(builder1, ps) - - fmt.Println(builder1) - fmt.Println(genv) - fmt.Println(result) - - if result.Type() != env.IntegerType { - t.Error("Expected result type integer") - } - if result.(env.Integer).Value != 5 { - t.Error("Expected result is 5") - } -} - -func TestEvalSpruce_second_sample(t *testing.T) { - builder := `give - me - five - { add 2 3 } - six - { 6 } - your - name - { join "Spru" "ce" } -` - - builder1, genv := loader.LoadSpruceString(builder) - - builder1.Probe(0, *genv) - - user := "{ give me five }" - - user1, genv := loader.LoadString(user) - - var result = EvalSpruceBlock(builder1, &user1) - - fmt.Println("AFTER FIRST RUN:") - fmt.Println(builder1) - fmt.Println(genv) - fmt.Println(result) - - if result.Type() != env.IntegerType { - t.Error("Expected result type integer") - } - if result.(env.Integer).Value != 5 { - t.Error("Expected result is 5") - } - - user = "{ give me six }" - - user1, genv = loader.LoadString(user) - - fmt.Println("BEFORE SECOND RUN:") - fmt.Println(user1) - fmt.Println(builder1) - - result = EvalSpruceBlock(builder1, &user1) - - fmt.Println(builder1) - fmt.Println(genv) - fmt.Println(result) - - if result.Type() != env.IntegerType { - t.Error("Expected result type integer") - } - if result.(env.Integer).Value != 6 { - t.Error("Expected result is 6") - } - - user = "{ give me your name }" - - user1, genv = loader.LoadString(user) - - fmt.Println("BEFORE THIRD RUN:") - fmt.Println(user1) - fmt.Println(builder1) - - result = EvalSpruceBlock(builder1, &user1) - - fmt.Println(builder1) - fmt.Println(genv) - fmt.Println(result) - - if result.Type() != env.StringType { - t.Error("Expected result type String") - } - if result.(env.String).Value != "Spruce" { - t.Error("Expected result is Spruce") - } - -} diff --git a/evaldo/repl.go b/evaldo/repl.go index 67ba2aa3..825051f7 100644 --- a/evaldo/repl.go +++ b/evaldo/repl.go @@ -335,7 +335,7 @@ func (r *Repl) evalLine(es *env.ProgramState, code string) string { es.InErrHandler = false } else if r.dialect == "eyr" { es.Dialect = env.EyrDialect - Eyr_EvalBlock(es, true) + BatteryEyrEvalBlockHook(es, true) } else if r.dialect == "math" { idxx, _ := es.Idx.GetIndex("math") s1, ok := es.Ctx.Get(idxx) @@ -346,14 +346,14 @@ func (r *Repl) evalLine(es *env.ProgramState, code string) string { // return s1 } } - res := DialectMath(es, block1) + res := BatteryDialectMathHook(es, block1) switch block := res.(type) { case env.Block: //stack := env.NewEyrStack() es.ResetStack() ser := es.Ser es.Ser = block.Series - Eyr_EvalBlock(es, false) + BatteryEyrEvalBlockHook(es, false) es.Ser = ser } } else { diff --git a/evaldo/repl_dual.go b/evaldo/repl_dual.go deleted file mode 100644 index fd5aadc4..00000000 --- a/evaldo/repl_dual.go +++ /dev/null @@ -1,772 +0,0 @@ -//go:build !b_norepl && !wasm && !js - -package evaldo - -import ( - "bytes" - "context" - "fmt" - "io" - "log" - "os" - "strconv" - "strings" - "sync" - "time" - "unicode/utf8" - - tcell "github.com/gdamore/tcell/v2" - "github.com/refaktor/rye/env" - "github.com/refaktor/rye/term" -) - -// DualReplState represents the state of the dual REPL -type DualReplState struct { - leftRepl *Repl - rightRepl *Repl - screen tcell.Screen - leftPos int - rightPos int - active int // 0 for left, 1 for right - quit bool - mutex sync.Mutex - leftBuffer string // Input buffer for left REPL - rightBuffer string // Input buffer for right REPL - leftCursor int // Cursor position for left REPL - rightCursor int // Cursor position for right REPL - leftInputCh chan string // Channel for sending input to left REPL - rightInputCh chan string // Channel for sending input to right REPL - leftHistory []string // Command history for left REPL - rightHistory []string // Command history for right REPL - leftOutput string // Current output from left REPL - rightOutput string // Current output from right REPL - leftLog []string // Log of inputs and outputs for left REPL - rightLog []string // Log of inputs and outputs for right REPL -} - -// Custom message handler for the dual REPL that writes to the tcell screen -func (d *DualReplState) leftReceiveMessage(message string) { - d.mutex.Lock() - defer d.mutex.Unlock() - - log.Println("Left Message: " + message) - - // Check for special control sequences - if strings.HasPrefix(message, "\r") { - // Carriage return - move cursor to start of line - d.leftCursor = 0 - return - } - - // Handle ANSI escape sequences - if strings.HasPrefix(message, "\033") || strings.HasPrefix(message, "\x1b") { - // Check for clear line sequences - if strings.Contains(message, "\033[K") || strings.Contains(message, "\x1b[K") || - strings.Contains(message, "\033[2K") || strings.Contains(message, "\x1b[2K") { - // Clear line - d.leftBuffer = "" - d.leftCursor = 0 - // Also clear the output buffer to prevent text accumulation - d.leftOutput = "" - return - } - - // Check for cursor movement - if strings.HasPrefix(message, "\033[") && strings.Contains(message, "C") { - // Move cursor right - parts := strings.Split(message, "\033[") - for _, part := range parts { - if strings.HasSuffix(part, "C") { - numStr := strings.TrimSuffix(part, "C") - if num, err := strconv.Atoi(numStr); err == nil { - d.leftCursor += num - if d.leftCursor > len(d.leftBuffer) { - d.leftCursor = len(d.leftBuffer) - } - } - } - } - return - } - - // For other ANSI sequences, store them in the output buffer - d.leftOutput += message - return - } - - // Regular text - insert at cursor position - if d.leftCursor == len(d.leftBuffer) { - d.leftBuffer += message - } else { - d.leftBuffer = d.leftBuffer[:d.leftCursor] + message + d.leftBuffer[d.leftCursor:] - } - d.leftCursor += len(message) -} - -func (d *DualReplState) rightReceiveMessage(message string) { - d.mutex.Lock() - defer d.mutex.Unlock() - - log.Println("Right Message: " + message) - - // Check for special control sequences - if strings.HasPrefix(message, "\r") { - // Carriage return - move cursor to start of line - d.rightCursor = 0 - return - } - - // Handle ANSI escape sequences - if strings.HasPrefix(message, "\033") || strings.HasPrefix(message, "\x1b") { - // Check for clear line sequences - if strings.Contains(message, "\033[K") || strings.Contains(message, "\x1b[K") || - strings.Contains(message, "\033[2K") || strings.Contains(message, "\x1b[2K") { - // Clear line - d.rightBuffer = "" - d.rightCursor = 0 - // Also clear the output buffer to prevent text accumulation - d.rightOutput = "" - return - } - - // Check for cursor movement - if strings.HasPrefix(message, "\033[") && strings.Contains(message, "C") { - // Move cursor right - parts := strings.Split(message, "\033[") - for _, part := range parts { - if strings.HasSuffix(part, "C") { - numStr := strings.TrimSuffix(part, "C") - if num, err := strconv.Atoi(numStr); err == nil { - d.rightCursor += num - if d.rightCursor > len(d.rightBuffer) { - d.rightCursor = len(d.rightBuffer) - } - } - } - } - return - } - - // For other ANSI sequences, store them in the output buffer - d.rightOutput += message - return - } - - // Regular text - insert at cursor position - if d.rightCursor == len(d.rightBuffer) { - d.rightBuffer += message - } else { - d.rightBuffer = d.rightBuffer[:d.rightCursor] + message + d.rightBuffer[d.rightCursor:] - } - d.rightCursor += len(message) -} - -// NewDualReplState creates a new dual REPL state -func NewDualReplState(leftPs, rightPs *env.ProgramState, dialect string, showResults bool, leftChan chan term.KeyEvent, rightChan chan term.KeyEvent) (*DualReplState, error) { - // Initialize tcell screen - screen, err := tcell.NewScreen() - if err != nil { - return nil, fmt.Errorf("error creating screen: %v", err) - } - - if err := screen.Init(); err != nil { - return nil, fmt.Errorf("error initializing screen: %v", err) - } - - log.Print("New Dual REPL State") - - // Create the dual state first so we can use its methods as callbacks - dualState := &DualReplState{ - screen: screen, - active: 0, // Start with left panel active - leftBuffer: "", - rightBuffer: "", - leftCursor: 0, - rightCursor: 0, - leftHistory: make([]string, 0), - rightHistory: make([]string, 0), - leftOutput: "Left REPL ready", - rightOutput: "Right REPL ready", - leftLog: make([]string, 0), - rightLog: make([]string, 0), - } - - leftRepl := &Repl{ - ps: leftPs, - dialect: dialect, - showResults: false, - stack: env.NewEyrStack(), - captureStdout: true, - } - // Create a callback function to handle the output from receiveLine - leftReceiveLineCallback := func(line string) string { - output := leftRepl.recieveLine(line) - // Add the output to the log - if output != "" { - dualState.mutex.Lock() - dualState.leftLog = append(dualState.leftLog, output) - dualState.leftOutput = output - dualState.mutex.Unlock() - } - return output - } - mlL := term.NewMicroLiner(leftChan, dualState.leftReceiveMessage, leftReceiveLineCallback) - leftRepl.ml = mlL - - rightRepl := &Repl{ - ps: rightPs, - dialect: dialect, - showResults: false, - stack: env.NewEyrStack(), - captureStdout: true, - } - // Create a callback function to handle the output from receiveLine - rightReceiveLineCallback := func(line string) string { - output := rightRepl.recieveLine(line) - // Add the output to the log - if output != "" { - dualState.mutex.Lock() - dualState.rightLog = append(dualState.rightLog, output) - dualState.rightOutput = output - dualState.mutex.Unlock() - } - return output - } - mlR := term.NewMicroLiner(rightChan, dualState.rightReceiveMessage, rightReceiveLineCallback) - rightRepl.ml = mlR - - dualState.leftRepl = leftRepl - dualState.rightRepl = rightRepl - - // Create input channels - leftInputCh := make(chan string, 10) - rightInputCh := make(chan string, 10) - - dualState.leftInputCh = leftInputCh - dualState.rightInputCh = rightInputCh - - go func() { - // Create context with timeout to prevent potential deadlocks - ctx, cancel := context.WithTimeout(context.Background(), 24*time.Hour) - defer cancel() - // Run the REPL with improved error handling - _, err = mlL.MicroPrompt("x> ", "", 0, ctx) - if err != nil { - log.Printf("MicroPrompt error: %v", err) - } - }() - - go func() { - // Create context with timeout to prevent potential deadlocks - ctx, cancel := context.WithTimeout(context.Background(), 24*time.Hour) - defer cancel() - // Run the REPL with improved error handling - _, err = mlR.MicroPrompt("x> ", "", 0, ctx) - if err != nil { - log.Printf("MicroPrompt error: %v", err) - } - }() - - return dualState, nil -} - -// Draw draws the dual REPL UI -func (d *DualReplState) Draw() { - d.mutex.Lock() - defer d.mutex.Unlock() - - // Clear the screen - d.screen.Clear() - - // Get screen dimensions - width, height := d.screen.Size() - halfWidth := width / 2 - - // Draw divider line - for y := 0; y < height; y++ { - d.screen.SetContent(halfWidth, y, '│', nil, tcell.StyleDefault) - } - - // Draw header - drawText(d.screen, 2, 0, halfWidth-4, "Left REPL", tcell.StyleDefault.Foreground(tcell.ColorWhite)) - drawText(d.screen, halfWidth+2, 0, halfWidth-4, "Right REPL", tcell.StyleDefault.Foreground(tcell.ColorWhite)) - - // Highlight active panel - if d.active == 0 { - drawText(d.screen, 0, 0, 2, "▶ ", tcell.StyleDefault.Foreground(tcell.ColorGreen)) - } else { - drawText(d.screen, halfWidth, 0, 2, "▶ ", tcell.StyleDefault.Foreground(tcell.ColorGreen)) - } - - // Draw REPL history and output area - outputStyle := tcell.StyleDefault.Foreground(tcell.ColorYellow) - inputStyle := tcell.StyleDefault.Foreground(tcell.ColorWhite) - promptStyle := tcell.StyleDefault.Foreground(tcell.ColorBlue) - - // Calculate available space for history - historyHeight := height - 5 // Reserve space for header, input line, and status - - // Draw left panel history and current output - if len(d.leftLog) > 0 { - // Display as many log entries as will fit, starting from the most recent - startIdx := len(d.leftLog) - if startIdx > historyHeight { - startIdx = len(d.leftLog) - historyHeight - } else { - startIdx = 0 - } - - // Draw the log entries - for i := startIdx; i < len(d.leftLog); i++ { - y := 2 + (i - startIdx) - entry := d.leftLog[i] - - // Determine style based on whether it's an input or output - style := outputStyle - if strings.HasPrefix(entry, "×>") { - style = promptStyle - } - - drawText(d.screen, 2, y, halfWidth-4, entry, style) - } - } else if d.leftOutput != "" { - // If no log entries yet, just show the current output - drawText(d.screen, 2, height-5, halfWidth-4, d.leftOutput, outputStyle) - } - - // Draw right panel history and current output - if len(d.rightLog) > 0 { - // Display as many log entries as will fit, starting from the most recent - startIdx := len(d.rightLog) - if startIdx > historyHeight { - startIdx = len(d.rightLog) - historyHeight - } else { - startIdx = 0 - } - - // Draw the log entries - for i := startIdx; i < len(d.rightLog); i++ { - y := 2 + (i - startIdx) - entry := d.rightLog[i] - - // Determine style based on whether it's an input or output - style := outputStyle - if strings.HasPrefix(entry, "×>") { - style = promptStyle - } - - drawText(d.screen, halfWidth+2, y, halfWidth-4, entry, style) - } - } else if d.rightOutput != "" { - // If no log entries yet, just show the current output - drawText(d.screen, halfWidth+2, height-5, halfWidth-4, d.rightOutput, outputStyle) - } - - // Draw input prompts - drawText(d.screen, 2, height-3, 2, "×> ", promptStyle) - drawText(d.screen, halfWidth+2, height-3, 2, "×> ", promptStyle) - - // Draw input buffers - drawText(d.screen, 5, height-3, halfWidth-7, d.leftBuffer, inputStyle) - drawText(d.screen, halfWidth+5, height-3, halfWidth-7, d.rightBuffer, inputStyle) - - // Draw cursors - if d.active == 0 { - // Position cursor for left panel - d.screen.ShowCursor(5+d.leftCursor, height-3) - } else { - // Position cursor for right panel - d.screen.ShowCursor(halfWidth+5+d.rightCursor, height-3) - } - - // Draw status line at the bottom - statusText := "Tab: Switch panels | Enter: Execute | Ctrl+C: Quit" - drawText(d.screen, 0, height-1, width, statusText, tcell.StyleDefault.Foreground(tcell.ColorYellow)) - - // Show the screen - d.screen.Show() -} - -// tcellEventToTermKeyEvent converts a tcell.EventKey to a term.KeyEvent -func tcellEventToTermKeyEvent(ev *tcell.EventKey) term.KeyEvent { - // Map tcell key codes to term.KeyEvent fields - var key string - var code int - var ctrl, alt, shift bool - - // Set modifiers - mods := ev.Modifiers() - ctrl = mods&tcell.ModCtrl != 0 - alt = mods&tcell.ModAlt != 0 - shift = mods&tcell.ModShift != 0 - - // Handle key mapping - switch ev.Key() { - case tcell.KeyRune: - key = string(ev.Rune()) - code = int(ev.Rune()) - case tcell.KeyEnter: - code = 13 - case tcell.KeyTab: - code = 9 - case tcell.KeyBackspace, tcell.KeyBackspace2: - code = 8 - key = "backspace" - case tcell.KeyDelete: - code = 46 - case tcell.KeyRight: - code = 39 - case tcell.KeyLeft: - code = 37 - case tcell.KeyUp: - code = 38 - case tcell.KeyDown: - code = 40 - case tcell.KeyHome: - code = 36 - case tcell.KeyEnd: - code = 35 - case tcell.KeyEscape: - code = 27 - case tcell.KeyCtrlA: - key = "a" - ctrl = true - case tcell.KeyCtrlB: - key = "b" - ctrl = true - case tcell.KeyCtrlC: - key = "c" - ctrl = true - case tcell.KeyCtrlD: - key = "d" - ctrl = true - case tcell.KeyCtrlE: - key = "e" - ctrl = true - case tcell.KeyCtrlF: - key = "f" - ctrl = true - case tcell.KeyCtrlK: - key = "k" - ctrl = true - case tcell.KeyCtrlL: - key = "l" - ctrl = true - case tcell.KeyCtrlN: - key = "n" - ctrl = true - case tcell.KeyCtrlP: - key = "p" - ctrl = true - case tcell.KeyCtrlU: - key = "u" - ctrl = true - } - - return term.NewKeyEvent(key, code, ctrl, alt, shift) -} - -// HandleInput handles keyboard input for the dual REPL -func (d *DualReplState) HandleInput(ev *tcell.EventKey) bool { - d.mutex.Lock() - defer d.mutex.Unlock() - - log.Println("HANDLE INPUT 1") - - // Handle global keys - switch ev.Key() { - case tcell.KeyTab: - // Switch active panel - d.active = 1 - d.active - return true - case tcell.KeyCtrlC: - // Quit - d.quit = true - return false - } - - log.Println("EV->KEYEVENT") - log.Println(ev) - // Convert tcell event to term.KeyEvent - keyEvent := tcellEventToTermKeyEvent(ev) - - log.Println(keyEvent) - - // Send the key event to the appropriate microliner - if d.active == 0 { - // Send to left REPL - select { - case leftChan <- keyEvent: - // Successfully sent - default: - // Channel full, could log an error here - } - } else { - // Send to right REPL - select { - case rightChan <- keyEvent: - // Successfully sent - default: - // Channel full, could log an error here - } - } - - return true -} - -// Global channels for key events -var leftChan chan term.KeyEvent -var rightChan chan term.KeyEvent - -// RunDualRepl runs the dual REPL -func RunDualRepl(leftPs, rightPs *env.ProgramState, dialect string, showResults bool) { - - // Create left and right REPLs - leftChan = make(chan term.KeyEvent) - rightChan = make(chan term.KeyEvent) - - // Create dual REPL state - dualState, err := NewDualReplState(leftPs, rightPs, dialect, showResults, leftChan, rightChan) - if err != nil { - log.Fatalf("Failed to create dual REPL: %v", err) - } - - // Ensure screen is closed when function exits - defer dualState.screen.Fini() - - // Create channels for communication between goroutines - leftResultCh := make(chan string) - rightResultCh := make(chan string) - quitCh := make(chan struct{}) - - // Create context with cancel for goroutines - //ctx, cancel := context.WithCancel(context.Background()) - // defer cancel() - - // Start goroutines for each REPL - // go runReplInGoroutine(ctx, dualState.leftRepl, dualState.leftInputCh, leftResultCh, "Left") - // go runReplInGoroutine(ctx, dualState.rightRepl, dualState.rightInputCh, rightResultCh, "Right") - - // Draw initial UI - dualState.Draw() - - // Main event loop - go func() { - // Set up a ticker to redraw the screen periodically - ticker := time.NewTicker(100 * time.Millisecond) - defer ticker.Stop() - - for { - select { - case result := <-leftResultCh: - dualState.mutex.Lock() - // Add the result to the log - if len(dualState.leftBuffer) > 0 { - // Add the input to the log first - inputEntry := fmt.Sprintf("×> %s", dualState.leftBuffer) - dualState.leftLog = append(dualState.leftLog, inputEntry) - // Then add the result - dualState.leftLog = append(dualState.leftLog, result) - // Clear the input buffer - dualState.leftBuffer = "" - dualState.leftCursor = 0 - } - dualState.leftOutput = result - dualState.mutex.Unlock() - dualState.Draw() - case result := <-rightResultCh: - dualState.mutex.Lock() - // Add the result to the log - if len(dualState.rightBuffer) > 0 { - // Add the input to the log first - inputEntry := fmt.Sprintf("×> %s", dualState.rightBuffer) - dualState.rightLog = append(dualState.rightLog, inputEntry) - // Then add the result - dualState.rightLog = append(dualState.rightLog, result) - // Clear the input buffer - dualState.rightBuffer = "" - dualState.rightCursor = 0 - } - dualState.rightOutput = result - dualState.mutex.Unlock() - dualState.Draw() - case <-ticker.C: - // Redraw the screen periodically to ensure updates are visible - dualState.Draw() - default: - // Poll for UI events - ev := dualState.screen.PollEvent() - switch ev := ev.(type) { - case *tcell.EventKey: - if !dualState.HandleInput(ev) { - close(quitCh) - return - } - // Force a redraw after each key press - dualState.Draw() - case *tcell.EventResize: - dualState.screen.Sync() - dualState.Draw() - } - } - } - }() - - // Wait for quit signal - <-quitCh -} - -// runReplInGoroutine runs a REPL in a goroutine -func runReplInGoroutine(ctx context.Context, repl *Repl, inputCh chan string, resultCh chan string, name string) { - // Set up a ticker to periodically check for input - ticker := time.NewTicker(100 * time.Millisecond) - defer ticker.Stop() - - for { - select { - case <-ctx.Done(): - return - case input := <-inputCh: - log.Println("INPUT CH") - // Process input from UI - if len(input) > 0 { - // STDIO CAPTURE START - // Define variables outside the if block - var r1, w *os.File - var err error - var oldStdout *os.File - - // Create a pipe to capture stdout - r1, w, err = os.Pipe() - if err != nil { - log.Printf("Failed to create pipe: %v", err) - resultCh <- "Error: Failed to capture output" - continue - } - - // Save the original stdout - oldStdout = os.Stdout - // Replace stdout with our pipe writer - os.Stdout = w - - // Create a channel for the captured output - stdoutCh := make(chan string) - - // Start a goroutine to read from the pipe - go func() { - var buf bytes.Buffer - _, err := io.Copy(&buf, r1) - if err != nil { - log.Printf("Error reading from pipe: %v", err) - } - stdoutCh <- buf.String() - }() - - // Call evalLine which will now write to our pipe - result := repl.evalLine(repl.ps, input) - - // Close the pipe writer to signal EOF to the reader - w.Close() - - // Restore the original stdout - os.Stdout = oldStdout - - // Get the captured stdout - capturedOutput := <-stdoutCh - - log.Println("CAPTURED STDOUT") - log.Println(capturedOutput) - - // Close the pipe reader - r1.Close() - - // Send both the result and captured stdout to the result channel - if capturedOutput != "" { - // If we have captured output, send it along with the result - resultCh <- capturedOutput + result - } else { - // If no captured output, just send the result - resultCh <- result - } - } - case <-ticker.C: - // Periodic check (could be used for other tasks) - } - } -} - -// Helper function to draw text on the screen -func drawText(s tcell.Screen, x, y, maxWidth int, text string, style tcell.Style) { - // Parse ANSI escape sequences and convert to tcell styles - currentStyle := style - i := 0 // Position in the output - - for j := 0; j < len(text); { - if j+1 < len(text) && (text[j] == '\033' || text[j] == '\x1b') { - // Found an escape sequence - if j+2 < len(text) && text[j+1] == '[' { - // ANSI escape sequence - end := j + 2 - for end < len(text) && ((text[end] >= '0' && text[end] <= '9') || text[end] == ';' || text[end] == '[' || text[end] == '?') { - end++ - } - - if end < len(text) { - // Process the escape sequence - escapeCode := text[j+2 : end] - command := text[end] - - switch command { - case 'm': // SGR (Select Graphic Rendition) - // Handle color and style codes - codes := strings.Split(escapeCode, ";") - for _, code := range codes { - if code == "" { - continue - } - - codeNum, err := strconv.Atoi(code) - if err != nil { - continue - } - - switch { - case codeNum == 0: // Reset - currentStyle = style - case codeNum == 1: // Bold/Bright - currentStyle = currentStyle.Bold(true) - case codeNum == 2: // Dim - currentStyle = currentStyle.Dim(true) - case codeNum >= 30 && codeNum <= 37: // Foreground color - color := tcell.Color(codeNum - 30) - currentStyle = currentStyle.Foreground(color) - case codeNum >= 40 && codeNum <= 47: // Background color - color := tcell.Color(codeNum - 40) - currentStyle = currentStyle.Background(color) - } - } - } - - // Skip the escape sequence - j = end + 1 - continue - } - } - } - - // Regular character - if i < maxWidth { - r, size := utf8.DecodeRuneInString(text[j:]) - s.SetContent(x+i, y, r, nil, currentStyle) - i++ - j += size - } else { - break - } - } -} - -// DoRyeDualRepl is the entry point for the dual REPL mode -func DoRyeDualRepl(leftPs, rightPs *env.ProgramState, dialect string, showResults bool) { - RunDualRepl(leftPs, rightPs, dialect, showResults) -} diff --git a/main_wasm.go b/main_wasm.go index 53eb3112..47342319 100755 --- a/main_wasm.go +++ b/main_wasm.go @@ -11,6 +11,7 @@ import ( "strings" "syscall/js" + "github.com/refaktor/rye/batteries" "github.com/refaktor/rye/contrib" "github.com/refaktor/rye/env" "github.com/refaktor/rye/evaldo" @@ -262,6 +263,7 @@ func InitRyeShell(this js.Value, args []js.Value) any { // fmt.Println("INITIALIZATION") ps := env.NewProgramState() evaldo.RegisterBuiltins(ps) + batteries.RegisterBatteries(ps) contrib.RegisterBuiltins(ps, &evaldo.BuiltinNames) /* bu := env.NewBuiltin(func(ps env.ProgramState, a1 env.Object, a2 env.Object, a3 env.Object, a4 env.Object, a5 env.Object) { @@ -375,6 +377,7 @@ func RyeEvalString(this js.Value, args []js.Value) any { case env.Block: es := env.NewProgramStateOLD(val.Series, genv) evaldo.RegisterBuiltins(es) + batteries.RegisterBatteries(es) contrib.RegisterBuiltins(es, &evaldo.BuiltinNames) if subc { diff --git a/runner/runner.go b/runner/runner.go index 421c358c..d29a2069 100644 --- a/runner/runner.go +++ b/runner/runner.go @@ -23,6 +23,7 @@ import ( "golang.org/x/term" "github.com/refaktor/rye/contrib" + "github.com/refaktor/rye/batteries" "github.com/refaktor/rye/env" "github.com/refaktor/rye/evaldo" "github.com/refaktor/rye/loader" @@ -489,6 +490,7 @@ func main_ryk() { //block, genv := loader.LoadString("{ }", false) es := env.NewProgramStateOLD(block.(env.Block).Series, genv) evaldo.RegisterBuiltins(es) + batteries.RegisterBatteries(es) contrib.RegisterBuiltins(es, &evaldo.BuiltinNames) evaldo.Eval(es) @@ -670,6 +672,7 @@ func main_rye_http_repl(port string, file string, code string, lang string, regf ps.WorkingPath = workingPath evaldo.RegisterBuiltins(ps) + batteries.RegisterBatteries(ps) evaldo.RegisterVarBuiltins(ps) contrib.RegisterBuiltins(ps, &evaldo.BuiltinNames) if err := regfn(ps); err != nil { @@ -705,6 +708,7 @@ func main_rye_http_repl(port string, file string, code string, lang string, regf block, genv := loader.LoadStringNoPEG(code, false) es = env.NewProgramStateOLD(block.(env.Block).Series, genv) evaldo.RegisterBuiltins(es) + batteries.RegisterBatteries(es) evaldo.RegisterVarBuiltins(es) contrib.RegisterBuiltins(es, &evaldo.BuiltinNames) if err := regfn(es); err != nil { @@ -1035,6 +1039,7 @@ func main_rye_file(file string, sig bool, subc bool, here bool, interactive bool ps.WorkingPath = workingPath evaldo.RegisterBuiltins(ps) + batteries.RegisterBatteries(ps) evaldo.RegisterVarBuiltins(ps) contrib.RegisterBuiltins(ps, &evaldo.BuiltinNames) if err := regfn(ps); err != nil { @@ -1135,6 +1140,7 @@ func main_cgi_file(file string, sig bool) { block, genv := loader.LoadStringNoPEG(input, false) es := env.NewProgramStateOLD(block.(env.Block).Series, genv) evaldo.RegisterBuiltins(es) + batteries.RegisterBatteries(es) contrib.RegisterBuiltins(es, &evaldo.BuiltinNames) evaldo.Eval(es) @@ -1155,6 +1161,7 @@ func main_cgi_file(file string, sig bool) { case env.Block: es = env.AddToProgramStateNEWWithLocation(es, block.(env.Block), genv) evaldo.RegisterBuiltins(es) + batteries.RegisterBatteries(es) contrib.RegisterBuiltins(es, &evaldo.BuiltinNames) evaldo.Eval(es) @@ -1219,6 +1226,7 @@ func main_rye_repl(_ io.Reader, _ io.Writer, subc bool, here bool, lang string, block, genv := loader.LoadStringNoPEG("", false) es := env.NewProgramStateOLD(block.(env.Block).Series, genv) evaldo.RegisterBuiltins(es) + batteries.RegisterBatteries(es) evaldo.RegisterVarBuiltins(es) contrib.RegisterBuiltins(es, &evaldo.BuiltinNames) if err := regfn(es); err != nil { @@ -1284,6 +1292,7 @@ func main_rye_repl(_ io.Reader, _ io.Writer, subc bool, here bool, lang string, // Create a second program state for the right panel rightEs := env.NewProgramStateOLD(block.(env.Block).Series, genv) evaldo.RegisterBuiltins(rightEs) + batteries.RegisterBatteries(rightEs) contrib.RegisterBuiltins(rightEs, &evaldo.BuiltinNames) if err := regfn(rightEs); err != nil { fmt.Println(err.Error()) @@ -1501,6 +1510,7 @@ func processTemplate(file string, regfn func(*env.ProgramState) error) { // Register builtins evaldo.RegisterBuiltins(ps) + batteries.RegisterBatteries(ps) evaldo.RegisterVarBuiltins(ps) contrib.RegisterBuiltins(ps, &evaldo.BuiltinNames) if err := regfn(ps); err != nil { From 997c9a87ba8dbce7c4a71663536d59e8ab8095bd Mon Sep 17 00:00:00 2001 From: refaktor Date: Wed, 15 Jul 2026 02:39:26 +0200 Subject: [PATCH 02/12] moved repl to it's own package from evaldo --- batteries/builtins_console.go | 3 +- evaldo/builtins_base_collections.go | 18 +- evaldo/builtins_base_printing.go | 7 +- evaldo/builtins_html_copy_go.bk | 397 ---------- evaldo/builtins_spreadsheet_test.go | 44 -- evaldo/builtins_test.go | 931 ----------------------- evaldo/debug_options.go | 224 ------ evaldo/debug_options.wasm.go | 39 - evaldo/evaldo.go | 9 +- evaldo/repl.go | 1058 --------------------------- evaldo/repl_not.go | 105 --- runner/runner.go | 7 +- 12 files changed, 26 insertions(+), 2816 deletions(-) delete mode 100644 evaldo/builtins_html_copy_go.bk delete mode 100644 evaldo/builtins_spreadsheet_test.go delete mode 100644 evaldo/builtins_test.go delete mode 100644 evaldo/debug_options.go delete mode 100644 evaldo/debug_options.wasm.go delete mode 100644 evaldo/repl.go delete mode 100644 evaldo/repl_not.go diff --git a/batteries/builtins_console.go b/batteries/builtins_console.go index 84fa29fe..0be5d0e0 100644 --- a/batteries/builtins_console.go +++ b/batteries/builtins_console.go @@ -5,6 +5,7 @@ package batteries import ( "fmt" + "github.com/refaktor/rye/console" "github.com/refaktor/rye/env" "github.com/refaktor/rye/evaldo" ) @@ -56,7 +57,7 @@ var Builtins_console = map[string]*env.Builtin{ } } */ - evaldo.DoRyeRepl(ps, "rye", evaldo.ShowResults, false, "") + console.DoRyeRepl(ps, "rye", evaldo.ShowResults, false, "") fmt.Println("-------------------------------------------------------------") ps.Ser = ser return ps.Res diff --git a/evaldo/builtins_base_collections.go b/evaldo/builtins_base_collections.go index 948e799b..fce4e88e 100644 --- a/evaldo/builtins_base_collections.go +++ b/evaldo/builtins_base_collections.go @@ -2619,15 +2619,15 @@ var builtins_collection = map[string]*env.Builtin{ return *env.NewBoolean(len(s1.Rows) == 0) case *env.Table: return *env.NewBoolean(len(s1.Rows) == 0) - case *env.PersistentTable: - return *env.NewBoolean(s1.Length() == 0) + // case *env.PersistentTable: // TODO: PersistentTable removed temporarily + // return *env.NewBoolean(s1.Length() == 0) case *env.RyeCtx: return *env.NewBoolean(s1.GetWords(*ps.Idx).Series.Len() == 0) case env.Vector: return *env.NewBoolean(s1.Value.Len() == 0) default: // fmt.Println(s1) - return MakeArgError(ps, 2, []env.Type{env.StringType, env.DictType, env.ListType, env.BlockType, env.TableType, env.PersistentTableType, env.VectorType}, "is-empty") + return MakeArgError(ps, 2, []env.Type{env.StringType, env.DictType, env.ListType, env.BlockType, env.TableType, /*env.PersistentTableType,*/ env.VectorType}, "is-empty") } }, }, @@ -2660,8 +2660,8 @@ var builtins_collection = map[string]*env.Builtin{ return *env.NewInteger(int64(len(s1.Rows))) case *env.Table: return *env.NewInteger(int64(len(s1.Rows))) - case *env.PersistentTable: - return *env.NewInteger(int64(s1.Length())) + // case *env.PersistentTable: // TODO: PersistentTable removed temporarily + // return *env.NewInteger(int64(s1.Length())) case *env.RyeCtx: return *env.NewInteger(int64(s1.GetWords(*ps.Idx).Series.Len())) case env.Vector: @@ -2670,7 +2670,7 @@ var builtins_collection = map[string]*env.Builtin{ return *env.NewInteger(int64(len(s1.Value))) default: // fmt.Println(s1) - return MakeArgError(ps, 2, []env.Type{env.StringType, env.DictType, env.ListType, env.BlockType, env.TableType, env.PersistentTableType, env.VectorType, env.BytesType}, "length?") + return MakeArgError(ps, 2, []env.Type{env.StringType, env.DictType, env.ListType, env.BlockType, env.TableType, /*env.PersistentTableType,*/ env.VectorType, env.BytesType}, "length?") } }, }, @@ -2700,15 +2700,15 @@ var builtins_collection = map[string]*env.Builtin{ return *env.NewInteger(int64(len(s1.Rows) - 1)) case *env.Table: return *env.NewInteger(int64(len(s1.Rows) - 1)) - case *env.PersistentTable: - return *env.NewInteger(int64(s1.Length() - 1)) + // case *env.PersistentTable: // TODO: PersistentTable removed temporarily + // return *env.NewInteger(int64(s1.Length() - 1)) case *env.RyeCtx: return *env.NewInteger(int64(s1.GetWords(*ps.Idx).Series.Len() - 1)) case env.Vector: return *env.NewInteger(int64(s1.Value.Len() - 1)) default: // fmt.Println(s1) - return MakeArgError(ps, 2, []env.Type{env.StringType, env.DictType, env.ListType, env.BlockType, env.TableType, env.PersistentTableType, env.VectorType}, "length?") + return MakeArgError(ps, 2, []env.Type{env.StringType, env.DictType, env.ListType, env.BlockType, env.TableType, /*env.PersistentTableType,*/ env.VectorType}, "length?") } }, }, diff --git a/evaldo/builtins_base_printing.go b/evaldo/builtins_base_printing.go index 9e07b6ce..7098a307 100644 --- a/evaldo/builtins_base_printing.go +++ b/evaldo/builtins_base_printing.go @@ -16,8 +16,9 @@ import ( "github.com/refaktor/rye/util" ) -// displayRyeValue handles the display of Rye values, supporting both interactive and non-interactive modes -func displayRyeValue(ps *env.ProgramState, arg0 env.Object, interactive bool) (env.Object, string) { +// DisplayRyeValue handles the display of Rye values, supporting both interactive and non-interactive modes. +// Exported so the console package can reference it via evaldo.DisplayRyeValue. +func DisplayRyeValue(ps *env.ProgramState, arg0 env.Object, interactive bool) (env.Object, string) { if interactive { // Full interactive mode - use terminal display functions for navigation term.SaveCurPos() @@ -678,7 +679,7 @@ var builtins_printing = map[string]*env.Builtin{ Argsn: 1, Doc: "Interactively displays a value (Block, Dict, Table, TableRow, or Markdown) in the terminal with navigation capabilities.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { - result, _ := displayRyeValue(ps, arg0, true) + result, _ := DisplayRyeValue(ps, arg0, true) return result }, }, diff --git a/evaldo/builtins_html_copy_go.bk b/evaldo/builtins_html_copy_go.bk deleted file mode 100644 index eecb8c45..00000000 --- a/evaldo/builtins_html_copy_go.bk +++ /dev/null @@ -1,397 +0,0 @@ -//__ +build b_html - -package evaldo - -import ( - "fmt" - "rye/env" - - "golang.org/x/net/html" - - //"fmt" - "io" - // "strings" - // "bufio" - // "io" - // "os" - // "strconv" - // "strings" -) - -// {
.menu { .content .print } } -// {
.menu , .footer { .content .print } } -// {
.menu [ .content .print ]