Documentation
¶
Overview ¶
Package baseio provides the OS-level I/O builtins for Rye (file access, shell commands, stdin, os.Args, os.Exit), HTTP and the interactive terminal display builtins (display, explore, _.., explore\custom, print\ssv, print\csv).
This package is separate from evaldo so that the embed module does not pull in heavy OS/terminal dependencies. Call baseio.Register(ps) after evaldo.RegisterBuiltins(ps) to get the full CLI runner feature set.
Index ¶
Constants ¶
This section is empty.
Variables ¶
var Builtins_cmd = map[string]*env.Builtin{ "cmd": { Argsn: 1, Doc: "Create a command.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { var args []string var pipe []*exec.Cmd switch input := arg0.(type) { case env.List: newArgs, err := listToCmdArgs(ps, input.Data...) if err != nil { return err } args = append(args, newArgs...) case env.Block: for _, c := range input.Series.S { switch it := c.(type) { case env.Word: args = append(args, it.Print(*ps.Idx)) case env.Pipeword: word := it.ToWord().Print(*ps.Idx) if len(args) == 0 { return evaldo.MakeBuiltinError(ps, "missing command before pipe", "cmd") } pipecmd := exec.Command(args[0], args[1:]...) pipecmd.Stdin = os.Stdin pipecmd.Stderr = os.Stderr pipe = append(pipe, pipecmd) args = []string{word} case env.Getword: evaldo.EvalGetword(ps, it, nil, false) if ps.ErrorFlag { return ps.Res } newArgs, err := listToCmdArgs(ps, ps.Res) if err != nil { return err } args = append(args, newArgs...) case env.Block: ser := ps.Ser ps.Ser = it.Series ps.BlockFile = it.FileName ps.BlockLine = it.Line evaldo.Eval(ps) evaldo.MaybeDisplayFailureOrError(ps, ps.Idx, "cmd") if ps.ErrorFlag { ps.Ser = ser return ps.Res } ps.Ser = ser newArgs, err := listToCmdArgs(ps, ps.Res) if err != nil { return err } args = append(args, newArgs...) default: newArgs, err := listToCmdArgs(ps, it) if err != nil { return err } args = append(args, newArgs...) } } default: return evaldo.MakeArgError(ps, 1, []env.Type{env.BlockType, env.ListType}, "cmd") } if len(args) == 0 { return evaldo.MakeBuiltinError(ps, "missing command", "cmd") } cmd := exec.Command(args[0], args[1:]...) cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr return *env.NewNative(ps.Idx, &command{cmd: cmd, pipe: pipe}, "command") }, }, "command//Dir!": { Argsn: 2, Doc: "Change the working directory of a command.", Fn: commandFn("Dir!", func(ps *env.ProgramState, c *command, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg1.(type) { case env.Uri: c.cmd.Dir = s.Path return arg0 default: return evaldo.MakeArgError(ps, 2, []env.Type{env.UriType}, "Dir!") } }), }, "command//Stdin!": { Argsn: 2, Doc: "Change the standard input of a command.", Fn: commandFn("Stdin!", func(ps *env.ProgramState, c *command, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { out, ret := commandInputFd(ps, c, arg1) if ret != nil { return ret } c.cmd.Stdin = out return arg0 }), }, "command//Stdout!": { Argsn: 2, Doc: "Change the standard output of a command.", Fn: commandFn("Stdout!", func(ps *env.ProgramState, c *command, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { out, ret := commandOutputFd(ps, c, arg1) if ret != nil { return ret } c.cmd.Stdout = out return arg0 }), }, "command//Stderr!": { Argsn: 2, Doc: "Change the standard error of a command.", Fn: commandFn("Stderr!", func(ps *env.ProgramState, c *command, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { out, ret := commandOutputFd(ps, c, arg1) if ret != nil { return ret } c.cmd.Stderr = out return arg0 }), }, "command//Pipe": { Argsn: 2, Doc: "Pipe the output of the first command to the input of the second command.", Fn: commandFn("Pipe", func(ps *env.ProgramState, c *command, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch it := arg1.(type) { case env.Native: if c2, ok := it.Value.(*command); ok { return *env.NewNative(ps.Idx, pipeCommands(c, c2), "command") } else { return evaldo.MakeBuiltinError(ps, "arg1 must be of kind command", "Pipe!") } default: return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "Pipe") } }), }, "command//Run": { Argsn: 1, Doc: "Start a command and wait for it to finish.", Fn: commandFn("Run", func(ps *env.ProgramState, c *command, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { defer c.Close() err := c.StartPipe() if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "Run") } err = c.cmd.Run() if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "Run") } return *env.NewBoolean(true) }), }, "command//Start": { Argsn: 1, Doc: "Start a command (and any piped commands) without waiting.", Fn: commandFn("Start", func(ps *env.ProgramState, c *command, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { if c.started { return arg0 } if err := c.StartPipe(); err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "Start") } if err := c.cmd.Start(); err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "Start") } c.started = true return arg0 }), }, "command//Kill": { Argsn: 1, Doc: "Kill a started command (and any started piped commands).", Fn: commandFn("Kill", func(ps *env.ProgramState, c *command, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { var firstErr error if c.cmd != nil && c.cmd.Process != nil { if err := c.cmd.Process.Kill(); err != nil && firstErr == nil { firstErr = err } } for _, pc := range c.pipe { if pc != nil && pc.Process != nil { if err := pc.Process.Kill(); err != nil && firstErr == nil { firstErr = err } } } _ = c.Close() c.closed = true if firstErr != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, firstErr.Error(), "Kill") } return *env.NewBoolean(true) }), }, "command//Pid": { Argsn: 1, Doc: "Return the process id of the main command (or -1 if not started).", Fn: commandFn("Pid", func(ps *env.ProgramState, c *command, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { if c.cmd == nil || c.cmd.Process == nil { return *env.NewInteger(-1) } return *env.NewInteger(int64(c.cmd.Process.Pid)) }), }, "command//Wait": { Argsn: 1, Doc: "Wait for a started command to finish and return its exit status.", Fn: commandFn("Wait", func(ps *env.ProgramState, c *command, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { if !c.started { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "command not started", "Wait") } err := c.cmd.Wait() _ = c.Close() c.closed = true status := c.cmd.ProcessState.ExitCode() if err != nil && status == -1 { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "Wait") } if len(c.pipe) > 0 { var statusList []any for _, pc := range c.pipe { statusList = append(statusList, *env.NewInteger(int64(pc.ProcessState.ExitCode()))) } statusList = append(statusList, *env.NewInteger(int64(status))) return *env.NewList(statusList) } return *env.NewInteger(int64(status)) }), }, "command//Status": { Argsn: 1, Doc: "Start a command, wait for it to finish, and return its exit status.", Fn: commandFn("Status", func(ps *env.ProgramState, c *command, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { err := c.StartPipe() if err != nil { c.Close() ps.FailureFlag = true 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 evaldo.MakeBuiltinError(ps, err.Error(), "Status") } if len(c.pipe) > 0 { var statusList []any for _, cmd := range c.pipe { statusList = append(statusList, *env.NewInteger(int64(cmd.ProcessState.ExitCode()))) } statusList = append(statusList, *env.NewInteger(int64(status))) return *env.NewList(statusList) } return *env.NewInteger(int64(status)) }), }, "command//Output": { Argsn: 1, Doc: "Start a command, wait for it to finish, and return its standard output", Fn: commandFn("Output", func(ps *env.ProgramState, c *command, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { defer c.Close() err := c.StartPipe() if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "Output") } c.cmd.Stdout = nil out, err := c.cmd.Output() if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "Output") } return *env.NewString(string(out)) }), }, "command//CombinedOutput": { Argsn: 1, Doc: "Start a command, wait for it to finish, and return its combined standard output and error", Fn: commandFn("CombinedOutput", func(ps *env.ProgramState, c *command, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { defer c.Close() err := c.StartPipe() if err != nil { ps.FailureFlag = true 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 evaldo.MakeBuiltinError(ps, err.Error(), "CombinedOutput") } return *env.NewString(string(out)) }), }, "command//Detach!": { Argsn: 1, Doc: "Redirect stdin, stdout, and stderr of a command to /dev/null.", Fn: commandFn("Detach!", func(ps *env.ProgramState, c *command, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { f, err := os.OpenFile("/dev/null", os.O_RDWR, 0) if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "Detach!") } c.files = append(c.files, f) c.cmd.Stdin = f c.cmd.Stdout = f c.cmd.Stderr = f return arg0 }), }, }
var Builtins_http = map[string]*env.Builtin{ "http-server": { Argsn: 1, Doc: "Creates a new HTTP server that listens on the specified address with a 10-second read header timeout.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch addr := arg0.(type) { case env.String: server := &http.Server{Addr: addr.Value, ReadHeaderTimeout: 10 * time.Second} return *env.NewNative(ps.Idx, server, "Go-server") default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "http-server") } }, }, "Go-server//Serve": { Argsn: 1, Doc: "Starts the HTTP server listening and serving requests on the configured address (blocking call).", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch server := arg0.(type) { case env.Native: err := server.Value.(*http.Server).ListenAndServe() if err != nil { return evaldo.MakeError(ps, err.Error()) } return arg0 default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server//Serve") } }, }, "Go-server//Handle": { Argsn: 3, Doc: "Registers an HTTP handler for a specific path pattern on the server, accepting string responses, Rye functions, or native Go handlers.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch path := arg1.(type) { case env.String: switch handler := arg2.(type) { case env.String: http.HandleFunc(path.Value, func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "%s", handler.Value) }) return arg0 case env.Function: http.HandleFunc(path.Value, func(w http.ResponseWriter, r *http.Request) { ps.FailureFlag = false ps.ErrorFlag = false ps.ReturnFlag = false psTemp := env.ProgramState{} err := copier.Copy(&psTemp, &ps) if err != nil { fmt.Println(err.Error()) } evaldo.CallFunctionArgs2(handler, ps, *env.NewNative(ps.Idx, w, "Go-server-response-writer"), *env.NewNative(ps.Idx, r, "Go-server-request"), nil) if ps.FailureFlag || ps.ErrorFlag { fmt.Println("Error in HTTP handler: " + ps.Res.Inspect(*ps.Idx)) } }) return arg0 case env.CurriedCaller: http.HandleFunc(path.Value, func(w http.ResponseWriter, r *http.Request) { ps.FailureFlag = false ps.ErrorFlag = false ps.ReturnFlag = false psTemp := env.ProgramState{} err := copier.Copy(&psTemp, &ps) if err != nil { fmt.Println(err.Error()) } evaldo.CallCurriedCallerArgsN(handler, ps, *env.NewNative(ps.Idx, w, "Go-server-response-writer"), *env.NewNative(ps.Idx, r, "Go-server-request")) if ps.FailureFlag || ps.ErrorFlag { fmt.Println("Error in HTTP handler: " + ps.Res.Inspect(*ps.Idx)) } }) return arg0 case env.Native: http.Handle(path.Value, handler.Value.(http.Handler)) return arg0 default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType, env.FunctionType, env.NativeType}, "Go-server//Handle") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server//Handle") } }, }, "Go-server-response-writer//Write": { Argsn: 2, Doc: "Writes string content to the HTTP response body, used within HTTP request handlers to send response data to clients.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch path := arg0.(type) { case env.Native: switch handler := arg1.(type) { case env.String: fmt.Fprintf(path.Value.(http.ResponseWriter), "%s", handler.Value) return arg0 default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-response-writer//Write") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-response-writer//Write") } }, }, "Go-server-response-writer//Set-content-type": { Argsn: 2, Doc: "Sets the Content-Type header for the HTTP response, determining how the browser interprets the response data.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch path := arg0.(type) { case env.Native: switch handler := arg1.(type) { case env.String: path.Value.(http.ResponseWriter).Header().Set("Content-Type", handler.Value) return arg0 default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-response-writer//Set-content-type") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-response-writer//Set-content-type") } }, }, "Go-server-response-writer//Set-header": { Argsn: 3, Doc: "Sets a custom HTTP header in the response, allowing control over caching, security, and other HTTP behaviors.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch writer := arg0.(type) { case env.Native: switch name := arg1.(type) { case env.Word: name_ := ps.Idx.GetWord(name.Index) switch value := arg2.(type) { case env.String: writer.Value.(http.ResponseWriter).Header().Set(name_, value.Value) return arg0 default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "Go-server-response-writer//Set-header") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType}, "Go-server-response-writer//Set-header") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-response-writer//Set-header") } }, }, "Go-server-response-writer//Add-header": { Argsn: 3, Doc: "Adds a custom HTTP header value in the response, preserving existing values for multi-value headers.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch writer := arg0.(type) { case env.Native: switch name := arg1.(type) { case env.Word: name_ := ps.Idx.GetWord(name.Index) switch value := arg2.(type) { case env.String: writer.Value.(http.ResponseWriter).Header().Add(name_, value.Value) return arg0 default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "Go-server-response-writer//Add-header") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType}, "Go-server-response-writer//Add-header") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-response-writer//Add-header") } }, }, "Go-server-response-writer//Write-header": { Argsn: 2, Doc: "Sets the HTTP status code for the response (must be called before writing response body).", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch w := arg0.(type) { case env.Native: switch code := arg1.(type) { case env.Integer: w.Value.(http.ResponseWriter).WriteHeader(int(code.Value)) return arg0 default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.IntegerType}, "Go-server-response-writer//Write-header") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-response-writer//Write-header") } }, }, "Go-server//Handle-ws": { Argsn: 3, Doc: "Registers a WebSocket handler for a specific path pattern on the server, upgrading HTTP connections to WebSocket protocol.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch path := arg1.(type) { case env.String: switch handler := arg2.(type) { case env.Function: http.HandleFunc(path.Value, func(w http.ResponseWriter, r *http.Request) { conn, _, _, err := ws.UpgradeHTTP(r, w) if err != nil { return } go func() { defer conn.Close() ps.FailureFlag = false ps.ErrorFlag = false ps.ReturnFlag = false psTemp := env.ProgramState{} err := copier.Copy(&psTemp, &ps) if err != nil { return } 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 evaldo.MakeArgError(ps, 3, []env.Type{env.FunctionType}, "Go-server//Handle-ws") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server//Handle-ws") } }, }, "Go-server-websocket//Read": { Argsn: 1, Doc: "Reads a message from a WebSocket connection, blocking until data is available or an error occurs.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch conn := arg0.(type) { case env.Native: msg, _, err := wsutil.ReadClientData(conn.Value.(io.ReadWriter)) if err != nil { ps.ReturnFlag = true ps.FailureFlag = true ps.ErrorFlag = true return evaldo.MakeBuiltinError(ps, "Error in reading client data.", "Go-server-websocket//Read") } return env.NewString(string(msg)) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-websocket//Read") } }, }, "Go-server-websocket//Write": { Argsn: 2, Doc: "Writes a message to a WebSocket connection, sending data to the connected client.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch sock := arg0.(type) { case env.Native: switch message := arg1.(type) { case env.String: err := wsutil.WriteServerMessage(sock.Value.(io.Writer), ws.OpText, []byte(message.Value)) if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Failed to write server message.", "Go-server-websocket//Write") } return arg1 default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-websocket//Write") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-websocket//Write") } }, }, "Go-server-request//Query?": { Argsn: 2, Doc: "Retrieves a query parameter value from the HTTP request URL (e.g., from ?name=value&other=data).", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch req := arg0.(type) { case env.Native: switch key := arg1.(type) { case env.String: vals, ok := req.Value.(*http.Request).URL.Query()[key.Value] if !ok || len(vals[0]) < 1 { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Key is missing.", "Go-server-request//query?") } return *env.NewString(vals[0]) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-request//query?") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//query?") } }, }, "Go-server-request//Header?": { Argsn: 2, Doc: "Gets a header value from the HTTP request by name.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch req := arg0.(type) { case env.Native: switch name := arg1.(type) { case env.String: val := req.Value.(*http.Request).Header.Get(name.Value) return *env.NewString(val) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-request//header?") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//header?") } }, }, "Go-server-request//Basic-auth?": { Argsn: 1, Doc: "Gets HTTP Basic Authentication credentials from the request as [username password].", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch req := arg0.(type) { case env.Native: username, password, ok := req.Value.(*http.Request).BasicAuth() if !ok { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Basic auth credentials are missing.", "Go-server-request//basic-auth?") } pair := make([]env.Object, 2) pair[0] = *env.NewString(username) pair[1] = *env.NewString(password) return *env.NewBlock(*env.NewTSeries(pair)) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//basic-auth?") } }, }, "Go-server-request//Method?": { Argsn: 1, Doc: "Gets the HTTP request method.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch req := arg0.(type) { case env.Native: return *env.NewString(req.Value.(*http.Request).Method) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//method?") } }, }, "Go-server-request//Read-body": { Argsn: 1, Doc: "Reads the HTTP request body as a string.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch req := arg0.(type) { case env.Native: data, err := io.ReadAll(req.Value.(*http.Request).Body) if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "Go-server-request//read-body") } return *env.NewString(string(data)) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//read-body") } }, }, "Go-server-request//Headers?": { Argsn: 1, Doc: "Gets all HTTP request headers as a dictionary.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch req := arg0.(type) { case env.Native: headers := make(map[string]any) for key, values := range req.Value.(*http.Request).Header { if len(values) == 0 { headers[key] = "" } else if len(values) == 1 { headers[key] = values[0] } else { vals := make([]env.Object, len(values)) for i, v := range values { vals[i] = *env.NewString(v) } headers[key] = *env.NewBlock(*env.NewTSeries(vals)) } } return *env.NewDict(headers) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//headers?") } }, }, "Go-server-request//Url?": { Argsn: 1, Doc: "Extracts the URL object from an HTTP request, providing access to path, query parameters, and other URL components.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch req := arg0.(type) { case env.Native: vals := req.Value.(*http.Request).URL return *env.NewNative(ps.Idx, vals, "Go-server-url") default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//url?") } }, }, "Go-server-url//Path?": { Argsn: 1, Doc: "Extracts the path component from a URL object (the part after the domain and before query parameters).", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch req := arg0.(type) { case env.Native: val := req.Value.(*url.URL).Path return *env.NewString(val) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-url//path?") } }, }, "Go-server-request//Cookie-val?": { Argsn: 2, Doc: "Get cookie value from server request.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch req := arg0.(type) { case env.Native: switch key := arg1.(type) { case env.String: cookie, err := req.Value.(*http.Request).Cookie(key.Value) if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Cookie key is missing.", "Go-server-request//cookie-val?") } return *env.NewString(cookie.Value) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-request//cookie-val?") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//cookie-val?") } }, }, "Go-server-request//Form?": { Argsn: 2, Doc: "Get form field from server request.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch req := arg0.(type) { case env.Native: switch key := arg1.(type) { case env.String: r := req.Value.(*http.Request) err := r.ParseForm() if err != nil { return evaldo.MakeError(ps, err.Error()) } val := r.FormValue(key.Value) if len(val) < 1 { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Value is missing.", "Go-server-request//form?") } return *env.NewString(val) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-request//form?") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//form?") } }, }, "Go-server-request//Full-form?": { Argsn: 1, Doc: "Get full form data as Dict from server request.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch req := arg0.(type) { case env.Native: r := req.Value.(*http.Request) err := r.ParseForm() if err != nil { return evaldo.MakeError(ps, err.Error()) } dict := make(map[string]any) for key, val := range r.Form { dict[key] = val[0] } return *env.NewDict(dict) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//full-form?") } }, }, "Go-server-request//Parse-multipart-form!": { Argsn: 1, Doc: "Parse multipart form from server request.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch req := arg0.(type) { case env.Native: r := req.Value.(*http.Request) err := r.ParseMultipartForm(10 << 20) if err != nil { return evaldo.MakeError(ps, err.Error()) } return arg0 default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//parse-multipart-form!") } }, }, "Go-server-request//Form-file?": { Argsn: 2, Doc: "Get form file from server request as block with reader and multipart header.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch req := arg0.(type) { case env.Native: switch key := arg1.(type) { case env.String: r := req.Value.(*http.Request) file, handler, err := r.FormFile(key.Value) if err != nil { ps.FailureFlag = true 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") pair[1] = *env.NewNative(ps.Idx, handler, "rye-multipart-header") return *env.NewBlock(*env.NewTSeries(pair)) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-request//form-file?") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//form-file?") } }, }, "rye-multipart-header//Filename?": { Argsn: 1, Doc: "Get filename from multipart header.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch req := arg0.(type) { case env.Native: r := req.Value.(*multipart.FileHeader) return *env.NewString(r.Filename) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-multipart-header//filename?") } }, }, "cookie-store": { Argsn: 1, Doc: "Create new cookie store.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch addr := arg0.(type) { case env.String: return *env.NewNative(ps.Idx, sessions.NewCookieStore([]byte(addr.Value)), "Http-cookie-store") default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "new-cookie-store") } }, }, "Http-cookie-store//Get": { Argsn: 3, Doc: "Get http cookie store.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch store := arg0.(type) { case env.Native: switch r := arg1.(type) { case env.Native: switch name := arg2.(type) { case env.String: session, err := store.Value.(*sessions.CookieStore).Get(r.Value.(*http.Request), name.Value) if err != nil { ps.FailureFlag = true errMsg := fmt.Sprintf("Can't get session: %v", err.Error()) return evaldo.MakeBuiltinError(ps, errMsg, "Http-cookie-store//get") } return *env.NewNative(ps.Idx, session, "Http-session") default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "Http-cookie-store//get") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "Http-cookie-store//get") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Http-cookie-store//get") } }, }, "Http-session//Set": { Argsn: 3, Doc: "Set http session.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch session := arg0.(type) { case env.Native: switch key := arg1.(type) { case env.String: switch val := arg2.(type) { case env.String: session.Value.(*sessions.Session).Values[key.Value] = val.Value return arg0 case env.Integer: session.Value.(*sessions.Session).Values[key.Value] = int(val.Value) return arg0 default: return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType, env.IntegerType}, "Http-session//set") } default: return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Http-session//set") } default: return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Http-session//set") } }, }, "Http-session//Get": { Argsn: 2, Doc: "Get http session.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch session := arg0.(type) { case env.Native: switch key := arg1.(type) { case env.String: val := session.Value.(*sessions.Session).Values[key.Value] if val != nil { switch val2 := val.(type) { case int: return env.NewInteger(int64(val2)) case string: return env.NewString(val2) case env.Object: return val2 default: ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Unknown type.", "Http-session//get") } } else { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Value is empty.", "Http-session//get") } default: return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Http-session//get") } default: return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Http-session//get") } }, }, "Http-session//Save": { Argsn: 3, Doc: "Save http session.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch session := arg0.(type) { case env.Native: switch r := arg1.(type) { case env.Native: switch w := arg2.(type) { case env.Native: err := session.Value.(*sessions.Session).Save(r.Value.(*http.Request), w.Value.(http.ResponseWriter)) if err != nil { ps.FailureFlag = true errMsg := fmt.Sprintf("Can't save: %v", err.Error()) return evaldo.MakeBuiltinError(ps, errMsg, "Http-session//save") } return *env.NewInteger(1) default: return evaldo.MakeArgError(ps, 3, []env.Type{env.NativeType}, "Http-session//save") } default: return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "Http-session//save") } default: return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Http-session//save") } }, }, "http-dir": { Argsn: 1, Doc: "Create new http directory.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch addr := arg0.(type) { case env.Uri: return *env.NewNative(ps.Idx, http.Dir(addr.Path), "Go-http-dir") default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "http-dir") } }, }, "new-static-handler": { Argsn: 1, Doc: "Create new static handler.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch addr := arg0.(type) { case env.Uri: return *env.NewNative(ps.Idx, http.FileServer(http.Dir(addr.Path)), "Http-handler") default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "new-static-handler") } }, }, "Http-handler//Strip-prefix": { Argsn: 2, Doc: "Wraps an HTTP handler to strip a URL prefix from requests, useful for serving static files from a subdirectory.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch prefix := arg1.(type) { case env.String: switch servr := arg0.(type) { case env.Native: return *env.NewNative(ps.Idx, http.StripPrefix(prefix.Value, servr.Value.(http.Handler)), "Http-handler") default: return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Http-handler//Strip-prefix") } default: return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Http-handler//Strip-prefix") } }, }, "https-response//Header?": { Argsn: 2, Doc: "Get header value from HTTP response.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch resp := arg0.(type) { case env.Native: switch headerName := arg1.(type) { case env.String: response := resp.Value.(*http.Response) headerValue := response.Header.Get(headerName.Value) return *env.NewString(headerValue) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "https-response//Header?") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-response//Header?") } }, }, "https-response//Status?": { Argsn: 1, Doc: "Gets the HTTP status code from a response object.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch resp := arg0.(type) { case env.Native: response := resp.Value.(*http.Response) return *env.NewInteger(int64(response.StatusCode)) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-response//Status?") } }, }, "https-response//Status-text?": { Argsn: 1, Doc: "Gets the HTTP status text from a response object.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch resp := arg0.(type) { case env.Native: response := resp.Value.(*http.Response) return *env.NewString(response.Status) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-response//Status-text?") } }, }, }
var Builtins_io = map[string]*env.Builtin{ "input": { Argsn: 1, Doc: "Prompts for and reads user input from the console.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch str := arg0.(type) { case env.String: fmt.Print("" + str.Value) var input string fmt.Scanln(&input) return *env.NewString(input) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "input") } }, }, "file-uri//Open": { Argsn: 1, Doc: "Opens a file for reading.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Uri: file, err := os.Open(s.Path) if err != nil { return evaldo.MakeError(ps, err.Error()) } return *env.NewNative(ps.Idx, file, "file") default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Open") } }, }, "file-uri//Open\\append": { Argsn: 1, Doc: "Opens a file for appending.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { profile, exists := os.LookupEnv("RYE_SECCOMP_PROFILE") if exists && profile == "readonly" { ps.FailureFlag = true 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 evaldo.MakeBuiltinError(ps, err.Error(), "__openFile") } return *env.NewNative(ps.Idx, file, "file") default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "__openFile") } }, }, "file-uri//Create": { Argsn: 1, Doc: "Creates a new file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { profile, exists := os.LookupEnv("RYE_SECCOMP_PROFILE") if exists && profile == "readonly" { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "file creation blocked by readonly seccomp profile", "file-uri//Create") } switch s := arg0.(type) { case env.Uri: file, err := os.Create(s.Path) if err != nil { ps.ReturnFlag = true ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "__create") } return *env.NewNative(ps.Idx, file, "file") default: ps.ReturnFlag = true ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "__create") } }, }, "file-uri//Ext?": { Argsn: 1, Doc: "Gets the extension of a file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Uri: ext := filepath.Ext(s.Path) return *env.NewString(ext) default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType, env.StringType}, "Ext?") } }, }, "file-uri//Name?": { Argsn: 1, Doc: "Gets the filename with extension from a file path.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Uri: filename := filepath.Base(s.Path) return *env.NewString(filename) default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "Name?") } }, }, "file-uri//Stem?": { Argsn: 1, Doc: "Gets the filename without extension from a file path.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Uri: base := filepath.Base(s.Path) stem := strings.TrimSuffix(base, filepath.Ext(base)) return *env.NewString(stem) default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Stem?") } }, }, "file-uri//Dir?": { Argsn: 1, Doc: "Gets the directory path from a file path.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Uri: dir := filepath.Dir(s.Path) return *env.NewString(dir) default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Dir?") } }, }, "file-uri//Split": { Argsn: 1, Doc: "Splits a file path into its components.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Uri: pathStr := s.Path var components []env.Object parts := strings.Split(pathStr, string(filepath.Separator)) for _, part := range parts { if part != "" { components = append(components, *env.NewString(part)) } } if filepath.IsAbs(pathStr) && len(components) > 0 { components = append([]env.Object{*env.NewString(string(filepath.Separator))}, components...) } return *env.NewBlock(*env.NewTSeries(components)) default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Split") } }, }, "file-uri//Is-absolute": { Argsn: 1, Doc: "Checks if a file path is absolute.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Uri: isAbs := filepath.IsAbs(s.Path) return *env.NewBoolean(isAbs) default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Is-absolute") } }, }, "file-uri//Does-exist": { Argsn: 1, Doc: "Checks if a file exists.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Uri: _, err := os.Stat(s.Path) if err == nil { return *env.NewBoolean(true) } if os.IsNotExist(err) { return *env.NewBoolean(false) } return *env.NewBoolean(false) default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Does-exist") } }, }, "file-uri//Delete": { Argsn: 1, Doc: "Deletes a file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { profile, exists := os.LookupEnv("RYE_SECCOMP_PROFILE") if exists && profile == "readonly" { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "delete operation blocked by readonly seccomp profile", "file-uri//Delete") } switch s := arg0.(type) { case env.Uri: err := os.Remove(s.Path) if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "file-uri//Delete") } return *env.NewBoolean(true) default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Delete") } }, }, "file//Reader": { Argsn: 1, Doc: "Creates a new reader from file object.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Native: file, ok := s.Value.(*os.File) if !ok { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Error opening file.", "file//Reader") } return *env.NewNative(ps.Idx, bufio.NewReader(file), "reader") default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "file//Reader") } }, }, "file//Writer": { Argsn: 1, Doc: "Creates a new writer from a file object.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Native: file, ok := s.Value.(*os.File) if !ok { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Error opening file.", "file//Writer") } return *env.NewNative(ps.Idx, bufio.NewWriter(file), "writer") default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "file//Writer") } }, }, "file-uri//Reader": { Argsn: 1, Doc: "Creates a new reader from a file uri/path.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Uri: file, err := os.Open(s.Path) if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Error opening file.", "file-uri//Reader") } return *env.NewNative(ps.Idx, bufio.NewReader(file), "reader") default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Read") } }, }, "reader": { Argsn: 1, Doc: "Creates a new reader from a string.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.String: return *env.NewNative(ps.Idx, bufio.NewReader(strings.NewReader(s.Value)), "reader") default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "reader") } }, }, "stdin": { Argsn: 0, Doc: "Gets a reader for standard input.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return *env.NewNative(ps.Idx, os.Stdin, "reader") }, }, "stdout": { Argsn: 0, Doc: "Gets a writer for standard output.", Fn: func(env1 *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return *env.NewNative(env1.Idx, os.Stdout, "writer") }, }, "stderr": { Argsn: 0, Doc: "Gets a writer for standard error.", Fn: func(env1 *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return *env.NewNative(env1.Idx, os.Stderr, "writer") }, }, "reader//Read\\string": { Argsn: 1, Doc: "Reads all content from a reader as a string.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch r := arg0.(type) { case env.Native: reader, ok := r.Value.(io.Reader) if !ok { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Not Reader", "__read\\string") } buf := new(strings.Builder) _, err := io.Copy(buf, reader) if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "__read\\string") } return *env.NewString(buf.String()) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "__read\\string") } }, }, "reader//Close": { Argsn: 1, Doc: "Closes a reader if it implements io.Closer.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch r := arg0.(type) { case env.Native: if closer, ok := r.Value.(io.Closer); ok { err := closer.Close() if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "reader//Close") } return *env.NewString("") } return *env.NewString("") default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "reader//Close") } }, }, "reader//Copy": { Argsn: 2, Doc: "Copies all content from a reader to a writer.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch r := arg0.(type) { case env.Native: switch w := arg1.(type) { case env.Native: _, err := io.Copy(w.Value.(io.Writer), r.Value.(io.Reader)) if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "__copy") } return arg0 default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "__copy") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "__copy") } }, }, "file//Copy": { Argsn: 2, Doc: "Copies content from a file to a writer.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch r := arg0.(type) { case env.Native: switch w := arg1.(type) { case env.Native: _, err := io.Copy(w.Value.(io.Writer), r.Value.(io.Reader)) if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "__copy") } return arg0 default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.NativeType}, "__copy") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "__copy") } }, }, "file//Stat": { Argsn: 1, Doc: "Gets file information (stat) for a file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch r := arg0.(type) { case env.Native: info, err := r.Value.(*os.File).Stat() if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "file//Stat") } return *env.NewNative(ps.Idx, info, "file-info") default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "file//Stat") } }, }, "file-info//Size?": { Argsn: 1, Doc: "Gets the size of a file in bytes.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Native: size := s.Value.(os.FileInfo).Size() return *env.NewInteger(size) default: return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "file-info//Size?") } }, }, "file//Read": { Argsn: 1, Doc: "Reads the entire content of a file as a string.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Native: data, err := io.ReadAll(s.Value.(io.Reader)) if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Error reading file.", "Read") } return *env.NewString(string(data)) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "Read") } }, }, "file//Seek\\end": { Argsn: 1, Doc: "Seeks to the end of a file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Native: reader, ok := s.Value.(*os.File) if !ok { return evaldo.MakeBuiltinError(ps, "Native not io.Reader", "file//Seek\\end") } reader.Seek(0, os.SEEK_END) return arg0 default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "file//Seek\\end") } }, }, "file//Write": { Argsn: 2, Doc: "Writes a string directly to a file object.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { profile, exists := os.LookupEnv("RYE_SECCOMP_PROFILE") if exists && profile == "readonly" { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "write operation blocked by readonly seccomp profile", "file//Write") } switch s := arg0.(type) { case env.Native: file, ok := s.Value.(*os.File) if !ok { ps.FailureFlag = true 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 evaldo.MakeBuiltinError(ps, err.Error(), "file//Write") } return arg0 default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "file//Write") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "file//Write") } }, }, "file//Close": { Argsn: 1, Doc: "Closes an open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Native: err := s.Value.(*os.File).Close() if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "__close") } return *env.NewString("") default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "__close") } }, }, "file-uri//Read": { Argsn: 1, Doc: "Reads the entire content of a file as a string.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch f := arg0.(type) { case env.Uri: data, err := os.ReadFile(f.GetPath()) if err != nil { return evaldo.MakeBuiltinError(ps, err.Error(), "file-uri//Read") } return *env.NewString(string(data)) default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Read") } }, }, "file-uri//Read\\bytes": { Argsn: 1, Doc: "Reads the entire content of a file as bytes.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch f := arg0.(type) { case env.Uri: data, err := os.ReadFile(f.GetPath()) if err != nil { return evaldo.MakeBuiltinError(ps, err.Error(), "__fs_read_bytes") } return *env.NewBytes(data) default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "__fs_read_bytes") } }, }, "file-uri//Read\\lines": { Argsn: 1, Doc: "Reads a file and returns its content as a block of lines.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch f := arg0.(type) { case env.Uri: file, err := os.OpenFile(f.GetPath(), os.O_RDONLY, os.ModePerm) if err != nil { return evaldo.MakeBuiltinError(ps, err.Error(), "file-uri//Read\\lines") } defer file.Close() lines := make([]env.Object, 0) sc := bufio.NewScanner(file) for sc.Scan() { lines = append(lines, *env.NewString(sc.Text())) } if err := sc.Err(); err != nil { return evaldo.MakeBuiltinError(ps, err.Error(), "file-uri//Read\\lines") } return *env.NewBlock(*env.NewTSeries(lines)) default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Read\\lines") } }, }, "file-uri//Write": { Argsn: 2, Doc: "Writes content to a file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { profile, exists := os.LookupEnv("RYE_SECCOMP_PROFILE") if exists && profile == "readonly" { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "write operation blocked by readonly seccomp profile", "file-uri//Write") } switch f := arg0.(type) { case env.Uri: switch s := arg1.(type) { case env.String: err := os.WriteFile(f.GetPath(), []byte(s.Value), 0600) if err != nil { ps.FailureFlag = true 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 evaldo.MakeBuiltinError(ps, err.Error(), "__fs_write") } return arg1 default: return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType, env.NativeType}, "__fs_write") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "__fs_write") } }, }, "write\\bytes": { Argsn: 2, Doc: "Writes bytes to a file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch bytesObj := arg0.(type) { case env.Native: if ps.Idx.GetWord(bytesObj.GetKind()) != "Go-bytes" { ps.FailureFlag = true 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 evaldo.MakeBuiltinError(ps, fmt.Sprintf("Failed to write file: %v", err), "write-file") } return env.Integer{1} default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "write-file") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "write-file") } }, }, "append\\bytes": { Argsn: 2, Doc: "Appends two byte arrays into one.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch bytes1 := arg0.(type) { case env.Bytes: switch bytes2 := arg1.(type) { case env.Bytes: combined := append(bytes1.Value, bytes2.Value...) return *env.NewBytes(combined) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.BytesType}, "append-bytes") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.BytesType}, "append-bytes") } }, }, "writer//Write": { Argsn: 2, Doc: "Writes a string to a writer.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { profile, exists := os.LookupEnv("RYE_SECCOMP_PROFILE") if exists && profile == "readonly" { switch ww := arg0.(type) { case env.Native: _, ok := ww.Value.(io.Writer) if !ok { return evaldo.MakeBuiltinError(ps, "Native not io.Writer", "writer//Write") } } } switch s := arg1.(type) { case env.String: switch ww := arg0.(type) { case env.Native: if bw, ok := ww.Value.(*bufio.Writer); ok { _, err := bw.WriteString(s.Value) if err != nil { return evaldo.MakeBuiltinError(ps, "Error at write: "+err.Error(), "writer//Write") } return arg0 } if w, ok := ww.Value.(io.Writer); ok { _, err := io.WriteString(w, s.Value) if err != nil { return evaldo.MakeBuiltinError(ps, "Error at write: "+err.Error(), "writer//Write") } return arg0 } return evaldo.MakeBuiltinError(ps, "Native not io.Writer", "writer//Write") default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "writer//Write") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.StringType}, "writer//Write") } }, }, "https-uri//Ext?": { Argsn: 1, Doc: "Gets the extension of the last path component of an HTTPS URL.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Uri: ext := path.Ext(s.Path) return *env.NewString(ext) default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "https-uri//Ext?") } }, }, "https-uri//Name?": { Argsn: 1, Doc: "Gets the last path component (filename) from an HTTPS URL.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Uri: name := path.Base(s.Path) return *env.NewString(name) default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "https-uri//Name?") } }, }, "https-uri//Stem?": { Argsn: 1, Doc: "Gets the last path component (filename) without its extension from an HTTPS URL.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Uri: base := path.Base(s.Path) stem := strings.TrimSuffix(base, path.Ext(base)) return *env.NewString(stem) default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "https-uri//Stem?") } }, }, "https-uri//Dir?": { Argsn: 1, Doc: "Gets the directory portion of an HTTPS URL path (including the host).", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Uri: dir := path.Dir(s.Path) return *env.NewString(dir) default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "https-uri//Dir?") } }, }, "https-uri//Open": { Argsn: 1, Doc: "Opens a HTTPS GET request and returns a reader for the response body.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch f := arg0.(type) { case env.Uri: proto := ps.Idx.GetWord(f.GetProtocol().Index) req, err := http.NewRequest(http.MethodGet, proto+"://"+f.GetPath(), nil) if err != nil { ps.FailureFlag = true return *env.NewError(err.Error()) } resp, err := http.DefaultClient.Do(req) if err != nil { ps.FailureFlag = true return *env.NewError(err.Error()) } if resp.StatusCode >= 200 && resp.StatusCode <= 299 { return *env.NewNative(ps.Idx, resp.Body, "https-uri://open") } else { ps.FailureFlag = true errMsg := fmt.Sprintf("Status Code: %v", resp.StatusCode) return evaldo.MakeBuiltinError(ps, errMsg, "https-uri://Open") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-uri://Open") } }, }, "https-uri//Get": { Argsn: 1, Doc: "Makes a HTTPS GET request and returns the response body as a string.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch f := arg0.(type) { case env.Uri: proto := ps.Idx.GetWord(f.GetProtocol().Index) req, err := http.NewRequest(http.MethodGet, proto+"://"+f.GetPath(), nil) if err != nil { ps.FailureFlag = true return *env.NewError(err.Error()) } resp, err := http.DefaultClient.Do(req) if err != nil { ps.FailureFlag = true return *env.NewError(err.Error()) } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) if resp.StatusCode >= 200 && resp.StatusCode <= 299 { return *env.NewString(string(body)) } else { ps.FailureFlag = true errMsg := fmt.Sprintf("Status Code: %v", resp.StatusCode) return evaldo.MakeBuiltinError(ps, errMsg, "https-uri//Get") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "https-uri//Get") } }, }, "https-uri//Post": { Argsn: 3, Doc: "Makes a HTTPS POST request and returns the response body as a string.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch f := arg0.(type) { case env.Uri: switch d := arg1.(type) { case env.String: var tt string switch t := arg2.(type) { case env.Word: tidx, terr := ps.Idx.GetIndex("json") tidx2, terr2 := ps.Idx.GetIndex("text") tidx3, terr3 := ps.Idx.GetIndex("urlencoded") tidx4, terr4 := ps.Idx.GetIndex("multipart") if terr && t.Index == tidx { tt = "application/json" } else if terr2 && t.Index == tidx2 { tt = "text/plain" } else if terr3 && t.Index == tidx3 { tt = "application/x-www-form-urlencoded" } else if terr4 && t.Index == tidx4 { tt = "multipart/form-data" } else { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Wrong content type.", "https-uri//Post") } case env.String: tt = t.Value default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 3, []env.Type{env.WordType, env.StringType}, "https-uri//Post") } proto := ps.Idx.GetWord(f.GetProtocol().Index) req, err := http.NewRequest(http.MethodPost, proto+"://"+f.GetPath(), strings.NewReader(d.Value)) if err != nil { ps.FailureFlag = true return *env.NewError(err.Error()) } req.Header.Set("Content-Type", tt) resp, err := http.DefaultClient.Do(req) if err != nil { ps.FailureFlag = true return *env.NewError(err.Error()) } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "https-uri//Post") } if resp.StatusCode >= 200 && resp.StatusCode <= 299 { return *env.NewString(string(body)) } else { ps.FailureFlag = true return env.NewError2(resp.StatusCode, string(body)) } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "https-uri//Post") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "https-uri//Post") } }, }, "http-uri//Ext?": { Argsn: 1, Doc: "Gets the extension of the last path component of an HTTP URL.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Uri: ext := path.Ext(s.Path) return *env.NewString(ext) default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "http-uri//Ext?") } }, }, "http-uri//Name?": { Argsn: 1, Doc: "Gets the last path component (filename) from an HTTP URL.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Uri: name := path.Base(s.Path) return *env.NewString(name) default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "http-uri//Name?") } }, }, "http-uri//Stem?": { Argsn: 1, Doc: "Gets the last path component (filename) without its extension from an HTTP URL.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Uri: base := path.Base(s.Path) stem := strings.TrimSuffix(base, path.Ext(base)) return *env.NewString(stem) default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "http-uri//Stem?") } }, }, "http-uri//Dir?": { Argsn: 1, Doc: "Gets the directory portion of an HTTP URL path (including the host).", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Uri: dir := path.Dir(s.Path) return *env.NewString(dir) default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "http-uri//Dir?") } }, }, "http-uri//Open": { Argsn: 1, Doc: "Opens a HTTP GET request and returns a reader for the response body.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch f := arg0.(type) { case env.Uri: proto := ps.Idx.GetWord(f.GetProtocol().Index) req, err := http.NewRequest(http.MethodGet, proto+"://"+f.GetPath(), nil) if err != nil { ps.FailureFlag = true return *env.NewError(err.Error()) } resp, err := http.DefaultClient.Do(req) if err != nil { ps.FailureFlag = true return *env.NewError(err.Error()) } if resp.StatusCode >= 200 && resp.StatusCode <= 299 { return *env.NewNative(ps.Idx, resp.Body, "http-uri://open") } else { ps.FailureFlag = true errMsg := fmt.Sprintf("Status Code: %v", resp.StatusCode) return evaldo.MakeBuiltinError(ps, errMsg, "http-uri://Open") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "http-uri://Open") } }, }, "http-uri//Get": { Argsn: 1, Doc: "Makes a HTTP GET request and returns the response body as a string.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch f := arg0.(type) { case env.Uri: proto := ps.Idx.GetWord(f.GetProtocol().Index) req, err := http.NewRequest(http.MethodGet, proto+"://"+f.GetPath(), nil) if err != nil { ps.FailureFlag = true return *env.NewError(err.Error()) } resp, err := http.DefaultClient.Do(req) if err != nil { ps.FailureFlag = true return *env.NewError(err.Error()) } defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) if resp.StatusCode >= 200 && resp.StatusCode <= 299 { return *env.NewString(string(body)) } else { ps.FailureFlag = true errMsg := fmt.Sprintf("Status Code: %v", resp.StatusCode) return evaldo.MakeBuiltinError(ps, errMsg, "http-uri//Get") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "http-uri//Get") } }, }, "http-uri//Post": { Argsn: 3, Doc: "Makes a HTTP POST request and returns the response body as a string.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch f := arg0.(type) { case env.Uri: switch t := arg2.(type) { case env.Word: switch d := arg1.(type) { case env.String: var tt string tidx, terr := ps.Idx.GetIndex("json") tidx2, terr2 := ps.Idx.GetIndex("text") if terr && t.Index == tidx { tt = "application/json" } else if terr2 && t.Index == tidx2 { tt = "text/plain" } else { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Wrong content type.", "http-uri//Post") } proto := ps.Idx.GetWord(f.GetProtocol().Index) req, err := http.NewRequest(http.MethodPost, proto+"://"+f.GetPath(), strings.NewReader(d.Value)) if err != nil { ps.FailureFlag = true return *env.NewError(err.Error()) } req.Header.Set("Content-Type", tt) resp, err := http.DefaultClient.Do(req) if err != nil { ps.FailureFlag = true return *env.NewError(err.Error()) } defer resp.Body.Close() body, err := io.ReadAll(resp.Body) if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "http-uri//Post") } if resp.StatusCode >= 200 && resp.StatusCode <= 299 { return *env.NewString(string(body)) } else { ps.FailureFlag = true return env.NewError2(resp.StatusCode, string(body)) } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "http-uri//Post") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 3, []env.Type{env.WordType}, "http-uri//Post") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "http-uri//Post") } }, }, "http-uri//Request": { Argsn: 3, Doc: "Creates a new HTTP request object.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch uri := arg0.(type) { case env.Uri: switch method := arg1.(type) { case env.Word: method1 := ps.Idx.GetWord(method.Index) if !(method1 == "GET" || method1 == "POST" || method1 == "PUT" || method1 == "DELETE") { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Wrong method.", "http-uri//Request") } switch data := arg2.(type) { case env.String: data1 := strings.NewReader(data.Value) proto := ps.Idx.GetWord(uri.GetProtocol().Index) req, err := http.NewRequest(method1, proto+"://"+uri.GetPath(), data1) if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "http-uri//Request") } return *env.NewNative(ps.Idx, req, "http-request") default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "http-uri//Request") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType}, "http-uri//Request") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "http-uri//Request") } }, }, "https-uri//Request": { Argsn: 3, Doc: "Creates a new HTTPS request object.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch uri := arg0.(type) { case env.Uri: switch method := arg1.(type) { case env.Word: method1 := ps.Idx.GetWord(method.Index) if !(method1 == "GET" || method1 == "POST" || method1 == "PUT" || method1 == "DELETE") { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Wrong method.", "https-uri//Request") } switch data := arg2.(type) { case env.String: data1 := strings.NewReader(data.Value) proto := ps.Idx.GetWord(uri.GetProtocol().Index) req, err := http.NewRequest(method1, proto+"://"+uri.GetPath(), data1) if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "https-uri//Request") } return *env.NewNative(ps.Idx, req, "https-request") default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "https-uri//Request") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType}, "https-uri//Request") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "https-uri//Request") } }, }, "https-request//Header!": { Argsn: 3, Doc: "Sets a header on a HTTPS request.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch req := arg0.(type) { case env.Native: switch method := arg1.(type) { case env.Word: name := ps.Idx.GetWord(method.Index) switch data := arg2.(type) { case env.String: req.Value.(*http.Request).Header.Set(name, data.Value) return arg0 default: return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "https-request//Header!") } default: return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType}, "https-request//Header!") } default: return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-request//Header!") } }, }, "https-request//Basic-auth!": { Argsn: 3, Doc: "Sets Basic Authentication on a HTTPS request.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch req := arg0.(type) { case env.Native: switch username := arg1.(type) { case env.String: switch password := arg2.(type) { case env.String: req.Value.(*http.Request).SetBasicAuth(username.Value, password.Value) return arg0 default: return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "https-request//Basic-auth!") } default: return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "https-request//Basic-auth!") } default: return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-request//Basic-auth!") } }, }, "https-request//Call": { Argsn: 1, Doc: "Executes a HTTPS request and returns the response object. Always returns the response regardless of status code (200, 404, 500, etc.) - use Status? to check the code.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch req := arg0.(type) { case env.Native: client := &http.Client{} resp, err := client.Do(req.Value.(*http.Request)) if err != nil { return evaldo.MakeBuiltinError(ps, err.Error(), "https-request//Call") } return *env.NewNative(ps.Idx, resp, "https-response") default: return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-request//Call") } }, }, "http-request//Header!": { Argsn: 3, Doc: "Sets a header on a HTTP request.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch req := arg0.(type) { case env.Native: switch method := arg1.(type) { case env.Word: name := ps.Idx.GetWord(method.Index) switch data := arg2.(type) { case env.String: req.Value.(*http.Request).Header.Set(name, data.Value) return arg0 default: return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "http-request//Header!") } default: return evaldo.MakeArgError(ps, 2, []env.Type{env.WordType}, "http-request//Header!") } default: return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "http-request//Header!") } }, }, "http-request//Basic-auth!": { Argsn: 3, Doc: "Sets Basic Authentication on a HTTP request.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch req := arg0.(type) { case env.Native: switch username := arg1.(type) { case env.String: switch password := arg2.(type) { case env.String: req.Value.(*http.Request).SetBasicAuth(username.Value, password.Value) return arg0 default: return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "http-request//Basic-auth!") } default: return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "http-request//Basic-auth!") } default: return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "http-request//Basic-auth!") } }, }, "http-request//Call": { Argsn: 1, Doc: "Executes a HTTP request and returns the response object. Always returns the response regardless of status code (200, 404, 500, etc.) - use Status? to check the code.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch req := arg0.(type) { case env.Native: client := &http.Client{} resp, err := client.Do(req.Value.(*http.Request)) if err != nil { return evaldo.MakeBuiltinError(ps, err.Error(), "http-request//Call") } return *env.NewNative(ps.Idx, resp, "http-response") default: return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "http-request//Call") } }, }, "https-response//Reader": { Argsn: 1, Doc: "Gets a reader for the HTTPS response body that can be used with io.Copy.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch resp := arg0.(type) { case env.Native: return *env.NewNative(ps.Idx, resp.Value.(*http.Response).Body, "reader") default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-response//Reader") } }, }, "https-response//Read-body": { Argsn: 1, Doc: "Reads the body of a HTTPS response as a string.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch resp := arg0.(type) { case env.Native: data, err := io.ReadAll(resp.Value.(*http.Response).Body) if err != nil { return evaldo.MakeBuiltinError(ps, err.Error(), "https-response//Read-body") } return *env.NewString(string(data)) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-response//Read-body") } }, }, "http-response//Reader": { Argsn: 1, Doc: "Gets a reader for the HTTP response body that can be used with io.Copy.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch resp := arg0.(type) { case env.Native: return *env.NewNative(ps.Idx, resp.Value.(*http.Response).Body, "reader") default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "http-response//Reader") } }, }, "http-response//Read-body": { Argsn: 1, Doc: "Reads the body of a HTTP response as a string.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch resp := arg0.(type) { case env.Native: data, err := io.ReadAll(resp.Value.(*http.Response).Body) if err != nil { return evaldo.MakeBuiltinError(ps, err.Error(), "http-response//Read-body") } return *env.NewString(string(data)) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "http-response//Read-body") } }, }, "https-response//Close-body!": { Argsn: 1, Doc: "Closes the HTTPS response body to free network resources.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch resp := arg0.(type) { case env.Native: err := resp.Value.(*http.Response).Body.Close() if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "https-response//Close-body!") } return *env.NewString("") default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-response//Close-body!") } }, }, "email//Send": { Argsn: 2, Doc: "Sends an email to the specified address.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch to_ := arg0.(type) { case env.Email: switch msg := arg1.(type) { case env.String: idx, _ := ps.Idx.GetIndex("user-profile") uctx_, _ := ps.Ctx.Get(idx) uctx := uctx_.(*env.RyeCtx) fmt.Println(to_) fmt.Println(msg) fmt.Println(uctx) return *env.NewInteger(1) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "email//Send") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.EmailType}, "email//Send") } }, }, "ftp-uri//Open": { Argsn: 1, Doc: "Opens a connection to an FTP server.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Uri: conn, err := ftp.Dial(s.Path) if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Error connecting to FTP server: "+err.Error(), "ftp-uri//Open") } return *env.NewNative(ps.Idx, conn, "ftp-connection") default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType, env.StringType}, "ftp-uri//Open") } }, }, "ftp-connection//Login": { Argsn: 3, Doc: "Logs in to an FTP server connection.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Native: if ps.Idx.GetWord(s.Kind.Index) != "ftp-connection" { return evaldo.MakeBuiltinError(ps, "Expected FTP connection.", "ftp-connection//Login") } username, ok := arg1.(env.String) if !ok { ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "ftp-connection//Login") } pwd, ok := arg2.(env.String) if !ok { ps.FailureFlag = true return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "ftp-connection//Login") } conn, ok := s.Value.(*ftp.ServerConn) if !ok { return evaldo.MakeBuiltinError(ps, "Invalid FTP connection.", "ftp-connection//Login") } if err := conn.Login(username.Value, pwd.Value); err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Error logging in to FTP server: "+err.Error(), "ftp-connection//Login") } return s default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "ftp-connection//Login") } }, }, "ftp-connection//Retrieve": { Argsn: 2, Doc: "Retrieves a file from an FTP server.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Native: if ps.Idx.GetWord(s.Kind.Index) != "ftp-connection" { return evaldo.MakeBuiltinError(ps, "Expected FTP connection.", "ftp-connection//Retrieve") } path, ok := arg1.(env.String) if !ok { ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "ftp-connection//Retrieve") } resp, err := s.Value.(*ftp.ServerConn).Retr(path.Value) if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Error retrieving file from FTP server: "+err.Error(), "ftp-connection//Retrieve") } return *env.NewNative(ps.Idx, resp, "reader") default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "ftp-connection//Retrieve") } }, }, "ftp-connection//Close": { Argsn: 1, Doc: "Closes an FTP server connection.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Native: if ps.Idx.GetWord(s.Kind.Index) != "ftp-connection" { return evaldo.MakeBuiltinError(ps, "Expected FTP connection.", "ftp-connection//Close") } conn, ok := s.Value.(*ftp.ServerConn) if !ok { return evaldo.MakeBuiltinError(ps, "Invalid FTP connection.", "ftp-connection//Close") } err := conn.Quit() if err != nil { 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 evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "ftp-connection//Close") } }, }, "ftp-connection//List": { Argsn: 2, Doc: "Lists directory entries. Returns a block of maps with full info.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Native: if ps.Idx.GetWord(s.Kind.Index) != "ftp-connection" { return evaldo.MakeBuiltinError(ps, "Expected FTP connection.", "ftp-connection//List") } var path string if arg1 != nil { switch p := arg1.(type) { case env.String: path = p.Value default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "ftp-connection//List") } } entries, err := s.Value.(*ftp.ServerConn).List(path) if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "ftp-connection//List") } vals := make([]env.Object, 0, len(entries)) for _, e := range entries { typeStr := "file" switch e.Type { case ftp.EntryTypeFolder: typeStr = "dir" case ftp.EntryTypeLink: typeStr = "link" } m := env.NewDict(map[string]any{ "name": *env.NewString(e.Name), "type": *env.NewString(typeStr), "size": *env.NewInteger(int64(e.Size)), "time": *env.NewTime(e.Time), "target": *env.NewString(e.Target), }) vals = append(vals, *m) } return *env.NewBlock(*env.NewTSeries(vals)) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "ftp-connection//List") } }, }, "ftp-connection//Cwd": { Argsn: 2, Doc: "Changes working directory.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Native: p, ok := arg1.(env.String) if !ok { ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "ftp-connection//Cwd") } if err := s.Value.(*ftp.ServerConn).ChangeDir(p.Value); err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "ftp-connection//Cwd") } return arg0 default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "ftp-connection//Cwd") } }, }, "ftp-connection//Mkdir": { Argsn: 2, Doc: "Creates a directory.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Native: p, ok := arg1.(env.String) if !ok { ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "ftp-connection//Mkdir") } if err := s.Value.(*ftp.ServerConn).MakeDir(p.Value); err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "ftp-connection//Mkdir") } return arg0 default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "ftp-connection//Mkdir") } }, }, "ftp-connection//Rmdir": { Argsn: 2, Doc: "Removes a directory.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Native: p, ok := arg1.(env.String) if !ok { ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "ftp-connection//Rmdir") } if err := s.Value.(*ftp.ServerConn).RemoveDir(p.Value); err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "ftp-connection//Rmdir") } return arg0 default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "ftp-connection//Rmdir") } }, }, "ftp-connection//Delete": { Argsn: 2, Doc: "Deletes a file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Native: p, ok := arg1.(env.String) if !ok { ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "ftp-connection//Delete") } if err := s.Value.(*ftp.ServerConn).Delete(p.Value); err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "ftp-connection//Delete") } return arg0 default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "ftp-connection//Delete") } }, }, "ftp-connection//Rename": { Argsn: 3, Doc: "Renames or moves a file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Native: from, ok := arg1.(env.String) if !ok { ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "ftp-connection//Rename") } to, ok := arg2.(env.String) if !ok { ps.FailureFlag = true return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType}, "ftp-connection//Rename") } if err := s.Value.(*ftp.ServerConn).Rename(from.Value, to.Value); err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "ftp-connection//Rename") } return arg0 default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "ftp-connection//Rename") } }, }, "ftp-connection//Store": { Argsn: 3, Doc: "Uploads data to a remote path. Accepts string or reader.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Native: path, ok := arg1.(env.String) if !ok { ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "ftp-connection//Store") } var rdr io.Reader switch v := arg2.(type) { case env.String: rdr = strings.NewReader(v.Value) case env.Native: if ps.Idx.GetWord(v.Kind.Index) != "reader" { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Expected reader for data", "ftp-connection//Store") } if r, ok := v.Value.(io.Reader); ok { rdr = r } else { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Invalid reader", "ftp-connection//Store") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 3, []env.Type{env.StringType, env.NativeType}, "ftp-connection//Store") } if err := s.Value.(*ftp.ServerConn).Stor(path.Value, rdr); err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "ftp-connection//Store") } return arg0 default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "ftp-connection//Store") } }, }, "tail-file": { Argsn: 3, Doc: "Tails a file, following it for new content. Used for monitoring log files.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { var filePath string switch path := arg0.(type) { case env.Uri: filePath = path.GetPath() case env.String: filePath = path.Value default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType, env.StringType}, "tail-file") } follow := true if arg1 != nil { switch f := arg1.(type) { case env.Boolean: follow = f.Value default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.BooleanType}, "tail-file") } } reopen := true if arg2 != nil { switch r := arg2.(type) { case env.Boolean: reopen = r.Value default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 3, []env.Type{env.BooleanType}, "tail-file") } } config := tail.Config{ Follow: follow, ReOpen: reopen, } t, err := tail.TailFile(filePath, config) if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "tail-file") } return *env.NewNative(ps.Idx, t, "tail-file") }, }, "tail-file//Read-line": { Argsn: 1, Doc: "Reads the next line from a tailed file. Blocks until a line is available.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch t := arg0.(type) { case env.Native: if ps.Idx.GetWord(t.GetKind()) != "tail-file" { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Expected tail-file object", "tail-file//Read-line") } line, ok := <-t.Value.(*tail.Tail).Lines if !ok { return *env.NewVoid() } return *env.NewString(line.Text) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tail-file//Read-line") } }, }, "tail-file//Close": { Argsn: 1, Doc: "Closes a tailed file, stopping the monitoring.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch t := arg0.(type) { case env.Native: if ps.Idx.GetWord(t.GetKind()) != "tail-file" { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Expected tail-file object", "tail-file//Close") } err := t.Value.(*tail.Tail).Stop() if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "tail-file//Close") } return *env.NewString("") default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "tail-file//Close") } }, }, "unix-uri//Open": { Argsn: 1, Doc: "Opens a connection to a Unix domain socket.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s := arg0.(type) { case env.Uri: conn, err := net.Dial("unix", s.Path) if err != nil { ps.FailureFlag = true 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 evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "unix-uri//Open") } }, }, "unix-connection//Write": { Argsn: 2, Doc: "Writes data to a Unix domain socket connection.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch conn := arg0.(type) { case env.Native: if ps.Idx.GetWord(conn.GetKind()) != "unix-connection" { ps.FailureFlag = true 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 evaldo.MakeBuiltinError(ps, "Error writing to Unix socket: "+err.Error(), "unix-connection//Write") } return arg0 default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "unix-connection//Write") } default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "unix-connection//Write") } }, }, "unix-connection//Read": { Argsn: 1, Doc: "Reads data from a Unix domain socket connection.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch conn := arg0.(type) { case env.Native: if ps.Idx.GetWord(conn.GetKind()) != "unix-connection" { ps.FailureFlag = true 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 evaldo.MakeBuiltinError(ps, "Error reading from Unix socket: "+err.Error(), "unix-connection//Read") } return *env.NewString(string(buf[:n])) default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "unix-connection//Read") } }, }, "unix-connection//Close": { Argsn: 1, Doc: "Closes a Unix domain socket connection.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch conn := arg0.(type) { case env.Native: if ps.Idx.GetWord(conn.GetKind()) != "unix-connection" { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, "Expected unix-connection object", "unix-connection//Close") } err := conn.Value.(net.Conn).Close() if err != nil { ps.FailureFlag = true return evaldo.MakeBuiltinError(ps, err.Error(), "unix-connection//Close") } return *env.NewString("") default: ps.FailureFlag = true return evaldo.MakeArgError(ps, 1, []env.Type{env.NativeType}, "unix-connection//Close") } }, }, }
var Builtins_os = map[string]*env.Builtin{}/* 109 elements not displayed */
var Builtins_table_files = map[string]*env.Builtin{ "file-uri//Load\\csv__OLD": { Argsn: 1, Doc: "Loads a .csv file to a table datatype.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch file := arg0.(type) { case env.Uri: f, err := os.Open(file.GetPath()) if err != nil { return evaldo.MakeBuiltinError(ps, "Unable to read input file '"+file.GetPath()+"': "+err.Error(), "Load\\csv") } defer f.Close() csvReader := newCsvReader(f) rows, err := csvReader.ReadAll() if err != nil { return evaldo.MakeBuiltinError(ps, "Unable to parse file '"+file.GetPath()+"' as CSV: "+err.Error(), "Load\\csv") } if len(rows) == 0 { return evaldo.MakeBuiltinError(ps, "File '"+file.GetPath()+"' is empty", "Load\\csv") } spr := env.NewTable(rows[0]) if len(rows) > 1 { for _, row := range rows[1:] { anyRow := make([]any, len(row)) for i, v := range row { anyRow[i] = *env.NewString(v) } spr.AddRow(*env.NewTableRow(anyRow, spr)) } } return *spr default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "Load\\csv") } }, }, "file-uri//Load\\csv": { Argsn: 2, Doc: "Loads a .csv file to a table datatype.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch file := arg0.(type) { case env.Uri: switch separator := arg1.(type) { case env.String: f, err := os.Open(file.GetPath()) if err != nil { return evaldo.MakeBuiltinError(ps, "Unable to read input file '"+file.GetPath()+"': "+err.Error(), "Load\\csv") } defer f.Close() csvReader := newCsvReader(f) if len(separator.Value) != 1 { 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 { return evaldo.MakeBuiltinError(ps, "Unable to parse file '"+file.GetPath()+"' as CSV: "+err.Error(), "Load\\csv") } if len(rows) == 0 { return evaldo.MakeBuiltinError(ps, "File '"+file.GetPath()+"' is empty", "Load\\csv") } spr := env.NewTable(rows[0]) if len(rows) > 1 { for _, row := range rows[1:] { anyRow := make([]any, len(row)) for i, v := range row { anyRow[i] = *env.NewString(v) } spr.AddRow(*env.NewTableRow(anyRow, spr)) } } return *spr default: return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Load\\csv\\") } default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "Load\\csv\\") } }, }, "file-uri//Load\\csv\\ignore-bad": { Argsn: 2, Doc: "Loads a .csv file to a table datatype, parsing it line by line and skipping lines that can't be parsed as CSV.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch file := arg0.(type) { case env.Uri: switch separator := arg1.(type) { case env.String: if len(separator.Value) != 1 { return evaldo.MakeBuiltinError(ps, "Separator must be exactly 1 character long", "Load\\csv\\ignore-bad") } comma := rune(separator.Value[0]) f, err := os.Open(file.GetPath()) if err != nil { return evaldo.MakeBuiltinError(ps, "Unable to read input file '"+file.GetPath()+"': "+err.Error(), "Load\\csv\\ignore-bad") } defer f.Close() scanner := bufio.NewScanner(newBomReader(f)) scanner.Buffer(make([]byte, 1024*1024), 1024*1024) var spr *env.Table for scanner.Scan() { r := csv.NewReader(strings.NewReader(scanner.Text())) r.Comma = comma record, err := r.Read() if err != nil { continue } if spr == nil { spr = env.NewTable(record) continue } anyRow := make([]any, len(record)) for i, v := range record { anyRow[i] = *env.NewString(v) } spr.AddRow(*env.NewTableRow(anyRow, spr)) } if err := scanner.Err(); err != nil { return evaldo.MakeBuiltinError(ps, "Unable to read input file '"+file.GetPath()+"': "+err.Error(), "Load\\csv\\ignore-bad") } if spr == nil { return evaldo.MakeBuiltinError(ps, "No parseable lines found in '"+file.GetPath()+"'", "Load\\csv\\ignore-bad") } return *spr default: return evaldo.MakeArgError(ps, 2, []env.Type{env.StringType}, "Load\\csv\\ignore-bad") } default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "Load\\csv\\ignore-bad") } }, }, "file-uri//Load\\tsv": { Argsn: 1, Doc: "Loads a .tsv file to a table datatype.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch file := arg0.(type) { case env.Uri: f, err := os.Open(file.GetPath()) if err != nil { return evaldo.MakeBuiltinError(ps, "Unable to read input file '"+file.GetPath()+"': "+err.Error(), "Load\\csv") } defer f.Close() csvReader := newCsvReader(f) csvReader.Comma = '\t' rows, err := csvReader.ReadAll() if err != nil { return evaldo.MakeBuiltinError(ps, "Unable to parse file '"+file.GetPath()+"' as CSV: "+err.Error(), "Load\\csv") } if len(rows) == 0 { return evaldo.MakeBuiltinError(ps, "File '"+file.GetPath()+"' is empty", "Load\\csv") } spr := env.NewTable(rows[0]) if len(rows) > 1 { for _, row := range rows[1:] { anyRow := make([]any, len(row)) for i, v := range row { anyRow[i] = *env.NewString(v) } spr.AddRow(*env.NewTableRow(anyRow, spr)) } } return *spr default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "Load\\csv") } }, }, "file-uri//Save\\csv": { Argsn: 2, Doc: "Saves a table to a .csv file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch file := arg0.(type) { case env.Uri: switch spr := arg1.(type) { case env.Table: f, err := os.Create(file.GetPath()) if err != nil { return evaldo.MakeBuiltinError(ps, "Unable to create input file.", "file-uri//Save\\csv") } defer f.Close() cLen := len(spr.Cols) csvWriter := csv.NewWriter(f) err1 := csvWriter.Write(spr.Cols) if err1 != nil { return evaldo.MakeBuiltinError(ps, "Unable to create write header.", "file-uri//Save\\csv") } for ir, row := range spr.Rows { strVals := make([]string, cLen) for i, v := range row.Values { var sv string switch tv := v.(type) { case string: sv = tv case int64: sv = strconv.Itoa(int(tv)) case float64: sv = strconv.FormatFloat(tv, 'f', -1, 64) case env.String: sv = tv.Value case env.Integer: sv = strconv.Itoa(int(tv.Value)) case env.Decimal: sv = fmt.Sprintf("%f", tv.Value) } if i < cLen { strVals[i] = sv } } err := csvWriter.Write(strVals) if err != nil { return evaldo.MakeBuiltinError(ps, "Unable to write line: "+strconv.Itoa(ir), "file-uri//Save\\csv") } } csvWriter.Flush() f.Close() return spr default: return evaldo.MakeArgError(ps, 2, []env.Type{env.TableType}, "file-uri//Save\\csv") } default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Save\\csv") } }, }, "file-uri//Save\\tsv": { Argsn: 2, Doc: "Saves a table to a .tsv file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch file := arg0.(type) { case env.Uri: switch spr := arg1.(type) { case env.Table: f, err := os.Create(file.GetPath()) if err != nil { return evaldo.MakeBuiltinError(ps, "Unable to create input file.", "file-uri//Save\\tsv") } defer f.Close() cLen := len(spr.Cols) csvWriter := csv.NewWriter(f) csvWriter.Comma = '\t' err1 := csvWriter.Write(spr.Cols) if err1 != nil { return evaldo.MakeBuiltinError(ps, "Unable to create write header.", "file-uri//Save\\tsv") } for ir, row := range spr.Rows { strVals := make([]string, cLen) for i, v := range row.Values { var sv string switch tv := v.(type) { case string: sv = tv case int64: sv = strconv.Itoa(int(tv)) case float64: sv = strconv.FormatFloat(tv, 'f', -1, 64) case env.String: sv = tv.Value case env.Integer: sv = strconv.Itoa(int(tv.Value)) case env.Decimal: sv = fmt.Sprintf("%f", tv.Value) } if i < cLen { strVals[i] = sv } } err := csvWriter.Write(strVals) if err != nil { return evaldo.MakeBuiltinError(ps, "Unable to write line: "+strconv.Itoa(ir), "file-uri//Save\\tsv") } } csvWriter.Flush() f.Close() return spr default: return evaldo.MakeArgError(ps, 2, []env.Type{env.TableType}, "file-uri//Save\\tsv") } default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Save\\tsv") } }, }, "file-uri//Load\\xlsx": { Argsn: 1, Doc: "Loads the first sheet in an .xlsx file to a Table. Cells starting with \"{\" are loaded as Rye code.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch file := arg0.(type) { case env.Uri: f, err := excelize.OpenFile(file.GetPath()) if err != nil { return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Unable to open file '%s': %s", file.GetPath(), err), "Load\\xlsx") } defer f.Close() sheetMap := f.GetSheetMap() if len(sheetMap) == 0 { return evaldo.MakeBuiltinError(ps, fmt.Sprintf("No sheets found in file '%s'", file.GetPath()), "Load\\xlsx") } sheetName := sheetMap[1] rows, err := f.Rows(sheetName) if err != nil { return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Unable to get rows from sheet in '%s': %s", file.GetPath(), err), "Load\\xlsx") } rows.Next() header, err := rows.Columns() if err != nil { return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Unable to get columns from sheet in '%s': %s", file.GetPath(), err), "Load\\xlsx") } if len(header) == 0 { return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Header row is empty in '%s'", file.GetPath()), "Load\\xlsx") } spr := env.NewTable(header) for rows.Next() { row, err := rows.Columns() if err != nil { return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Unable to get row in '%s': %s", file.GetPath(), err), "Load\\xlsx") } anyRow := make([]any, len(row)) for i, v := range row { anyRow[i] = evaldo.LoadXlsxCell(ps, v) } for i := len(row); i < len(spr.Cols); i++ { anyRow[i] = *env.NewString("") } spr.AddRow(*env.NewTableRow(anyRow, spr)) } return *spr default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "Load\\xlsx") } }, }, "file-uri//Save\\xlsx": { Argsn: 2, Doc: "Saves a Table to a .xlsx file. Block cells are serialized with their Rye dump.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch file := arg0.(type) { case env.Uri: switch spr := arg1.(type) { case env.Table: sheetName := "Sheet1" f := excelize.NewFile() index, err := f.NewSheet(sheetName) if err != nil { 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 evaldo.MakeBuiltinError(ps, fmt.Sprintf("Unable to set header row: %s", err), "file-uri//Save\\xlsx") } for i, row := range spr.Rows { rowIndex := i + 2 vals := make([]any, len(row.Values)) for j, v := range row.Values { val, err := util.FormatXlsxCell(v, ps.Idx) if err != nil { return evaldo.MakeBuiltinError(ps, fmt.Sprintf("Unable to save table: %s", err), "file-uri//Save\\xlsx") } vals[j] = val } err = f.SetSheetRow(sheetName, fmt.Sprintf("A%d", rowIndex), &vals) if err != nil { 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 evaldo.MakeBuiltinError(ps, fmt.Sprintf("Unable to save table: %s", err), "file-uri//Save\\xlsx") } return spr default: return evaldo.MakeArgError(ps, 2, []env.Type{env.TableType}, "file-uri//Save\\xlsx") } default: return evaldo.MakeArgError(ps, 1, []env.Type{env.UriType}, "file-uri//Save\\xlsx") } }, }, }
Builtins_table_files contains table formats that read or write file URIs.
Functions ¶
func DisplayRyeValue ¶
DisplayRyeValue explores values interactively or returns a compact summary for the console. The display builtin instead prints complete static output. Exported so the console package can reference it via baseio.DisplayRyeValue.
func FileExists ¶ added in v0.2.63
func Register ¶
func Register(ps *env.ProgramState)
Register registers all base I/O builtins and the interactive terminal display builtins into the program state. Call after evaldo.RegisterBuiltins.
Types ¶
This section is empty.