Documentation
¶
Overview ¶
builtins.go
builtins.go
Index ¶
- Constants
- Variables
- func AddIndexes(ps *env.ProgramState, s *env.Table, columns []env.Word) env.Object
- func ArrayFloat32FromSeries(block env.TSeries) []float32
- func AutoType(ps *env.ProgramState, s *env.Table, percent float64) env.Object
- func BsonToValue_Map(ps *env.ProgramState, val any, typ string, meta any, topLevel bool) env.Object
- func BsonToValue_Val(ps *env.ProgramState, val any, topLevel bool) env.Object
- func BuiConvert(ps *env.ProgramState, arg0 env.Object, arg1 env.Object) env.Object
- func BuiValidate(env1 *env.ProgramState, arg0 env.Object, arg1 env.Object) env.Object
- func CallBuiltin(bi env.Builtin, ps *env.ProgramState, arg0_ env.Object, toLeft bool, ...) *env.ProgramState
- func CallFunction(fn env.Function, ps *env.ProgramState, arg0 env.Object, toLeft bool, ...) *env.ProgramState
- func CallFunctionArgs2(fn env.Function, ps *env.ProgramState, arg0 env.Object, arg1 env.Object, ...) *env.ProgramState
- func CallFunctionArgs4(fn env.Function, ps *env.ProgramState, arg0 env.Object, arg1 env.Object, ...) *env.ProgramState
- func CallFunctionArgsN(fn env.Function, ps *env.ProgramState, ctx *env.RyeCtx, args ...env.Object) *env.ProgramState
- func Clear()
- func ColNames(ps *env.ProgramState, from env.Object, fnName string) ([]string, env.Object)
- func CompileRyeToEyr(block *env.Block, ps *env.ProgramState, eyrBlock *env.Block) *env.Block
- func CompileStepRyeToEyr(block *env.Block, ps *env.ProgramState, eyrBlock *env.Block) *env.Block
- func CompileWord(block *env.Block, ps *env.ProgramState, word env.Word, eyrBlock *env.Block)
- func Conversion_EvalBlockCtx(ps *env.ProgramState, vals env.RyeCtx) env.Object
- func Conversion_EvalBlockDict(ps *env.ProgramState, vals env.Dict) env.Object
- func CopyMap(m map[string]any) map[string]any
- func DetermineContext(fn env.Function, ps *env.ProgramState, ctx *env.RyeCtx) *env.RyeCtx
- func DialectMath(env1 *env.ProgramState, arg0 env.Object) env.Object
- func DictToJSON(dict env.Dict) string
- func DirectlyCallBuiltin(ps *env.ProgramState, bi env.Builtin, a0 env.Object, a1 env.Object) env.Object
- func DoRyeRepl(es *env.ProgramState, dialect string, showResults bool)
- func DropColumn(ps *env.ProgramState, s env.Table, name env.String) env.Object
- func DropColumnBlock(ps *env.ProgramState, s env.Table, names env.Block) env.Object
- func DropColumns(ps *env.ProgramState, s env.Table, names []env.String) env.Object
- func EscapeJson(val string) string
- func EvalBlock(ps *env.ProgramState) *env.ProgramState
- func EvalBlockInCtx(ps *env.ProgramState, ctx *env.RyeCtx) *env.ProgramState
- func EvalBlockInCtxInj(ps *env.ProgramState, ctx *env.RyeCtx, inj env.Object, injnow bool) *env.ProgramState
- func EvalBlockInj(ps *env.ProgramState, inj env.Object, injnow bool) *env.ProgramState
- func EvalBlockInjMultiDialect(ps *env.ProgramState, inj env.Object, injnow bool) *env.ProgramState
- func EvalExpression2(ps *env.ProgramState, limited bool) *env.ProgramState
- func EvalExpressionConcrete(ps *env.ProgramState) *env.ProgramState
- func EvalExpressionInj(ps *env.ProgramState, inj env.Object, injnow bool) (*env.ProgramState, bool)
- func EvalExpressionInjLimited(ps *env.ProgramState, inj env.Object, injnow bool) (*env.ProgramState, bool)
- func EvalGenword(ps *env.ProgramState, word env.Genword, leftVal env.Object, toLeft bool) *env.ProgramState
- func EvalGetword(ps *env.ProgramState, word env.Getword, leftVal env.Object, toLeft bool) *env.ProgramState
- func EvalModword(ps *env.ProgramState, word env.Modword) *env.ProgramState
- func EvalObject(ps *env.ProgramState, object env.Object, leftVal env.Object, toLeft bool, ...) *env.ProgramState
- func EvalSetword(ps *env.ProgramState, word env.Setword) *env.ProgramState
- func EvalWord(ps *env.ProgramState, word env.Object, leftVal env.Object, toLeft bool, ...) *env.ProgramState
- func EvaluateLoadedValue(ps *env.ProgramState, block_ env.Object, script_ string, allowMod bool) env.Object
- func Eyr_CallBuiltin(bi env.Builtin, ps *env.ProgramState, arg0_ env.Object, toLeft bool) *env.ProgramState
- func Eyr_CallBuiltinPipe(bi env.Builtin, ps *env.ProgramState, arg0_ env.Object) *env.ProgramState
- func Eyr_CallFunction(fn env.Function, es *env.ProgramState, leftVal env.Object, toLeft bool, ...) *env.ProgramState
- func Eyr_EvalBlock(ps *env.ProgramState, full bool) *env.ProgramState
- func Eyr_EvalBlockInside(ps *env.ProgramState, inj env.Object, injnow bool) *env.ProgramState
- func Eyr_EvalExpression(ps *env.ProgramState) *env.ProgramState
- func Eyr_EvalLSetword(ps *env.ProgramState, word env.LSetword, leftVal env.Object, toLeft bool) *env.ProgramState
- func Eyr_EvalObject(es *env.ProgramState, object env.Object, leftVal env.Object, pipeWord bool, ...) *env.ProgramState
- func Eyr_EvalWord(ps *env.ProgramState, word env.Object, leftVal env.Object, pipeWord bool) *env.ProgramState
- func FileExists(filePath string) int
- func GenerateColumn(ps *env.ProgramState, s env.Table, name env.Word, extractCols env.Block, ...) env.Object
- func GenerateColumnRegexReplace(ps *env.ProgramState, s *env.Table, name env.Word, fromColName env.Word, ...) env.Object
- func GetNumRowsFrom(ps *env.ProgramState, data any) (int, *env.Error)
- func GroupBy(ps *env.ProgramState, s env.Table, col string, ...) env.Object
- func IntersectBlocksCustom(a env.Block, b env.Block, ps *env.ProgramState, fn env.Function) []env.Object
- func IntersectStringsCustom(a env.String, b env.String, ps *env.ProgramState, fn env.Function) string
- func LeftJoin(ps *env.ProgramState, s1 env.Table, s2 env.Table, col1 string, col2 string, ...) env.Object
- func ListToJSON(list env.List) string
- func LoadColumnData(ps *env.ProgramState, data any, colIdx int, numRows int, ...) *env.Error
- func LoadScriptLocalFile(ps *env.ProgramState, s1 env.Uri) (env.Object, string)
- func MakeArgError(env1 *env.ProgramState, N int, typ []env.Type, fn string) *env.Error
- func MakeArgErrorMessage(N int, allowedTypes []env.Type, fn string) string
- func MakeBuiltinError(env1 *env.ProgramState, msg string, fn string) *env.Error
- func MakeColError(ps *env.ProgramState, builtinName string, colName string, expectedRowCount int, ...) *env.Error
- func MakeError(env1 *env.ProgramState, msg string) *env.Error
- func MakeNativeArgError(env1 *env.ProgramState, N int, knd []string, fn string) *env.Error
- func MakeNeedsThawedArgError(env1 *env.ProgramState, fn string) *env.Error
- func MakeRyeError(env1 *env.ProgramState, val env.Object, er *env.Error) *env.Error
- func Math_EvalBlock(es *env.ProgramState) []env.Object
- func MaybeAcceptComma(ps *env.ProgramState, inj env.Object, injnow bool) (*env.ProgramState, bool)
- func MaybeDisplayFailureOrError(es *env.ProgramState, genv *env.Idxs, tag string)
- func MaybeDisplayFailureOrErrorWASM(es *env.ProgramState, genv *env.Idxs, printfn func(string), tag string)
- func MaybeEvalOpwordOnRight(nextObj env.Object, ps *env.ProgramState, limited bool) *env.ProgramState
- func MoveCursor(x int, y int)
- func MoveCursorBackward(bias int)
- func MoveCursorDown(bias int)
- func MoveCursorForward(bias int)
- func MoveCursorUp(bias int)
- func NameOfRyeType(t env.Type) string
- func PopOutBuffer() string
- func RegisterBuiltins(ps *env.ProgramState)
- func RegisterBuiltins2(builtins map[string]*env.Builtin, ps *env.ProgramState, name string)
- func RegisterBuiltinsInContext(builtins map[string]*env.Builtin, ps *env.ProgramState, name string) *env.RyeCtx
- func RegisterBuiltinsInSubContext(builtins map[string]*env.Builtin, ps *env.ProgramState, parent *env.RyeCtx, ...) *env.RyeCtx
- func RenameColumn(ps *env.ProgramState, s *env.Table, oldName env.String, newName env.String) env.Object
- func RyeToJSON(res any) string
- func RyeToJSONLines(res any) string
- func RyeValueToTableRow(spr *env.Table, obj env.Object) (bool, string, *env.TableRow)
- func SQL_EvalBlock(es *env.ProgramState, mode int, values []any) (*env.ProgramState, []any)
- func SQL_EvalExpression(es *env.ProgramState, vals []any, mode int) (*env.ProgramState, string, []any)
- func SheetFromColumns(ps *env.ProgramState, arg0 env.Object, arg1 env.Object) (res env.Object)
- func SheetFromColumnsMapData(ps *env.ProgramState, cols []string, arg1 env.Object) env.Object
- func SortByColumn(ps *env.ProgramState, s *env.Table, name string)
- func SortByColumnDesc(ps *env.ProgramState, s *env.Table, name string)
- func Stck_CallBuiltin(bi env.Builtin, ps *env.ProgramState, arg0_ env.Object, toLeft bool) *env.ProgramState
- func Stck_EvalBlock(ps *env.ProgramState) *env.ProgramState
- func Stck_EvalExpression(ps *env.ProgramState) *env.ProgramState
- func Stck_EvalObject(ps *env.ProgramState, object env.Object, leftVal env.Object, toLeft bool, ...) *env.ProgramState
- func Stck_EvalWord(ps *env.ProgramState, word env.Object, leftVal env.Object, toLeft bool) *env.ProgramState
- func TableRowToJSON(row env.TableRow) string
- func TableRowsFromBlockOrList(ps *env.ProgramState, spr *env.Table, numCols int, arg1 any) (*env.TableRow, *env.Error)
- func TableToJSON(s env.Table) string
- func TableToJSONLines(s env.Table) string
- func TelegramUpdateToRyeDict(update_ tgm.Update) env.Dict
- func Validation_EvalBlock(es *env.ProgramState, vals env.Dict) (env.Dict, map[string]env.Object)
- func Validation_EvalBlock_List(es *env.ProgramState, vals env.List) (env.Object, []env.Object)
- func ValueToBSON(arg0 env.Object, topLevel bool) any
- func VectorToJSON(vector env.Vector) string
- func WhereBetween(ps *env.ProgramState, s *env.Table, name string, val1 env.Object, ...) env.Object
- func WhereContains(ps *env.ProgramState, s *env.Table, name string, val string, not bool) env.Object
- func WhereEquals(ps *env.ProgramState, s env.Table, name string, val env.Object) env.Object
- func WhereGreater(ps *env.ProgramState, s *env.Table, name string, val env.Object) env.Object
- func WhereIn(ps *env.ProgramState, s env.Table, name string, b []env.Object) env.Object
- func WhereLesser(ps *env.ProgramState, s *env.Table, name string, val env.Object) env.Object
- func WhereMatch(ps *env.ProgramState, s *env.Table, name string, r *regexp.Regexp) env.Object
- type ConversionError
- type HtmlDialectNode
- type HtmlNavigCondition
- type Repl
- type RyeBlockCustomSort
- type RyeBlockSort
- type RyeListCustomSort
- type RyeListSort
- type RyeStringSort
- type ShellEd
- type ValidationError
Constants ¶
const MODE_PSQL = 2
const MODE_SQLITE = 1
const TYPE_CODE int = 2
const TYPE_SUBNODE int = 1
Variables ¶
var BuiltinNames map[string]int // TODO --- this looks like some hanging global ... it should move to ProgramState, it doesn't even really work with contrib and external probably
var Builtins_bcrypt = map[string]*env.Builtin{ "bcrypt-hash": { Argsn: 1, Doc: "Generate hashing.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __bcrypt_hash(ps, arg0, arg1, arg2, arg3, arg4) }, }, "bcrypt-check": { Argsn: 2, Doc: "Compare hash and password.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __bcrypt_check(ps, arg0, arg1, arg2, arg3, arg4) }, }, "generate-token": { Argsn: 1, Doc: "Generate token for hashing.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __generate_token(ps, arg0, arg1, arg2, arg3, arg4) }, }, }
var Builtins_bson = map[string]*env.Builtin{ "from-bson": { Argsn: 1, Doc: "Takes a BSON value and returns it encoded into Rye values.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { var val map[string]any err := bson.Unmarshal(arg0.(env.Native).Value.([]byte), &val) if err != nil { return MakeBuiltinError(ps, err.Error(), "from-bson") } return BsonToValue_Map(ps, val["val"], val["typ"].(string), val["met"], true) }, }, "to-bson": { Argsn: 1, Doc: "Takes a Rye value and returns it encoded into BSON.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { value := ValueToBSON(arg0, true) encoded, err := bson.Marshal(value) if err != nil { return MakeBuiltinError(ps, err.Error(), "to-bson") } return *env.NewNative(ps.Idx, encoded, "bytes") }, }, }
var Builtins_console = map[string]*env.Builtin{ "enter-console": { Argsn: 1, Doc: "Stops execution and gives you a Rye console, to test the code inside environment.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch name := arg0.(type) { case env.String: ser := ps.Ser fmt.Println("Welcome to console: \033[1m" + name.Value + "\033[0m") fmt.Println("* use \033[1mlc\033[0m to list current context") fmt.Println("-------------------------------------------------------------") DoRyeRepl(ps, "rye", ShowResults) fmt.Println("-------------------------------------------------------------") ps.Ser = ser return ps.Res default: return MakeArgError(ps, 1, []env.Type{env.StringType}, "enter-console") } }, }, }
var Builtins_conversion = map[string]*env.Builtin{ "convert": { Argsn: 2, Doc: "Converts value from one kind to another.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return BuiConvert(ps, arg0, arg1) }, }, "converter": { Argsn: 3, Doc: "Sets a converter between two kinds of objects.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch obj1 := arg0.(type) { case env.Kind: switch obj2 := arg1.(type) { case env.Kind: switch spec := arg2.(type) { case env.Block: obj2.SetConverter(obj1.Kind.Index, spec) return obj2 default: return MakeArgError(ps, 3, []env.Type{env.BlockType}, "converter") } default: return MakeArgError(ps, 2, []env.Type{env.KindType, env.BlockType}, "converter") } default: return MakeArgError(ps, 1, []env.Type{env.KindType}, "converter") } }, }, }
var Builtins_crypto = map[string]*env.Builtin{ "string//to-bytes": { Argsn: 1, Doc: "Decode string to bytes.", 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: r, err := hex.DecodeString(addr.Value) if err != nil { ps.FailureFlag = true return MakeBuiltinError(ps, "Failure to decode string.", "string//to-bytes") } return *env.NewNative(ps.Idx, r, "Go-bytes") default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.StringType}, "string//to-bytes") } }, }, "Go-bytes//to-string": { Argsn: 1, Doc: "Encoding value to string.", 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.Native: return env.NewString(hex.EncodeToString(addr.Value.([]byte))) default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-bytes//to-string") } }, }, "Ed25519-pub-key//to-string": { Argsn: 1, Doc: "Turns public key to string.", 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.Native: return env.NewString(hex.EncodeToString(addr.Value.(ed25519.PublicKey))) default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Ed25519-pub-key//to-string") } }, }, "Ed25519-priv-key//to-string": { Argsn: 1, Doc: "Turns private key to string.", 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.Native: return env.NewString(hex.EncodeToString(addr.Value.(ed25519.PrivateKey))) default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Ed25519-priv-key//to-string") } }, }, "ed25519-generate-keys": { Argsn: 0, Doc: "Generates private and public key, returns them in a block. Public first.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { keys := make([]env.Object, 2) puk, pvk, err := ed25519.GenerateKey(nil) if err != nil { ps.FailureFlag = true return MakeBuiltinError(ps, "Failed to generate keys.", "ed25519-generate-keys") } keys[0] = *env.NewNative(ps.Idx, puk, "Ed25519-pub-key") keys[1] = *env.NewNative(ps.Idx, pvk, "Ed25519-priv-key") ser := *env.NewTSeries(keys) return *env.NewBlock(ser) }, }, "ed25519-private-key": { Argsn: 1, Doc: "Creates private key from string or bytes.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { var pkey []byte var err error switch server := arg0.(type) { case env.Native: pkey = server.Value.([]byte) case env.String: pkey, err = hex.DecodeString(server.Value) if err != nil { ps.FailureFlag = true return MakeBuiltinError(ps, "Error in decoding string.", "ed25519-private-key") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType, env.StringType}, "ed25519-private-key") } return *env.NewNative(ps.Idx, ed25519.PrivateKey(pkey), "Ed25519-priv-key") }, }, "ed25519-public-key": { Argsn: 1, Doc: "Creates public key from string or bytes.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { var pkey []byte var err error switch server := arg0.(type) { case env.Native: pkey = server.Value.([]byte) case env.String: pkey, err = hex.DecodeString(server.Value) if err != nil { ps.FailureFlag = true return MakeBuiltinError(ps, "Error in decoding string.", "ed25519-public-key") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType, env.StringType}, "ed25519-public-key") } return *env.NewNative(ps.Idx, ed25519.PublicKey(pkey), "Ed25519-pub-key") }, }, "Ed25519-priv-key//sign": { Argsn: 2, Doc: "Signs string with private key. Returns signature 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 pvk := arg0.(type) { case env.Native: switch buff := arg1.(type) { case env.String: sigb := ed25519.Sign(pvk.Value.(ed25519.PrivateKey), []byte(buff.Value)) return *env.NewNative(ps.Idx, sigb, "Go-bytes") default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.StringType}, "Ed25519-priv-key//sign") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Ed25519-priv-key//sign") } }, }, "sha512": { Argsn: 1, Doc: "Calculates SHA512 on 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: h := sha512.New() h.Write([]byte(s.Value)) bs := h.Sum(nil) return env.NewString(hex.EncodeToString(bs[:])) default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.StringType}, "sha512") } }, }, }
var Builtins_email = map[string]*env.Builtin{ "new-email-message": { Argsn: 0, Doc: "Create new email message.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __newMessage(ps, arg0, arg1, arg2, arg3, arg4) }, }, "gomail-message//set-header": { Argsn: 3, Doc: "Set email header.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __setHeader(ps, arg0, arg1, arg2, arg3, arg4) }, }, "gomail-message//set-address-header": { Argsn: 4, Doc: "TODODOC.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __setAddressHeader(ps, arg0, arg1, arg2, arg3, arg4) }, }, "gomail-message//set-body": { Argsn: 3, Doc: "TODODOC.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __setBody(ps, arg0, arg1, arg2, arg3, arg4) }, }, "gomail-message//attach": { Argsn: 2, Doc: "TODODOC.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __attach(ps, arg0, arg1, arg2, arg3, arg4) }, }, "gomail-message//add-alternative": { Argsn: 3, Doc: "TODODOC.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __addAlternative(ps, arg0, arg1, arg2, arg3, arg4) }, }, "new-email-dialer": { Argsn: 4, Doc: "TODODOC.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __newDialer(ps, arg0, arg1, arg2, arg3, arg4) }, }, "gomail-dialer//dial-and-send": { Argsn: 2, Doc: "TODODOC.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __dialAndSend(ps, arg0, arg1, arg2, arg3, arg4) }, }, }
var Builtins_eyr = map[string]*env.Builtin{ "eyr": { Argsn: 1, Doc: "Evaluates Rye block as Eyr (postfix) stack based code.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch bloc := arg0.(type) { case env.Block: ser := ps.Ser ps.Ser = bloc.Series ps.Dialect = env.EyrDialect Eyr_EvalBlock(ps, false) ps.Ser = ser return ps.Res default: return MakeArgError(ps, 1, []env.Type{env.BlockType}, "eyr") } }, }, "eyr\\full": { Argsn: 1, Doc: "Evaluates Rye block as Eyr (postfix) stack based code.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch bloc := arg0.(type) { case env.Block: ser := ps.Ser ps.Ser = bloc.Series ps.Dialect = env.EyrDialect Eyr_EvalBlock(ps, true) ps.Ser = ser return ps.Res default: return MakeArgError(ps, 1, []env.Type{env.BlockType}, "eyr\\full") } }, }, "eyr\\loop": { Argsn: 2, Doc: "Evaluates Rye block in loop as Eyr code (postfix stack based) N times.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch cond := arg0.(type) { case env.Integer: switch bloc := arg1.(type) { case env.Block: ps.Dialect = env.EyrDialect ser := ps.Ser ps.Ser = bloc.Series for i := 0; int64(i) < cond.Value; i++ { ps = Eyr_EvalBlock(ps, false) ps.Ser.Reset() } ps.Ser = ser return ps.Res default: return MakeArgError(ps, 2, []env.Type{env.BlockType}, "eyr\\loop") } default: return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "eyr\\loop") } }, }, "to-eyr": { Argsn: 1, Doc: "Evaluates Rye block as Eyr (postfix) stack based code.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch bloc := arg0.(type) { case env.Block: eBlock := env.NewBlock(*env.NewTSeries(make([]env.Object, 0))) CompileRyeToEyr(&bloc, ps, eBlock) return *eBlock default: return MakeArgError(ps, 1, []env.Type{env.BlockType}, "eyr") } }, }, }
var Builtins_goroutines = map[string]*env.Builtin{ "go-with": { Argsn: 2, Doc: "TODODOC.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch arg := arg0.(type) { case env.Object: switch handler := arg1.(type) { case env.Function: errC := make(chan error) go func() { ps.FailureFlag = false ps.ErrorFlag = false ps.ReturnFlag = false psTemp := env.ProgramState{} err := copier.Copy(&psTemp, &ps) if err != nil { ps.FailureFlag = true ps.ErrorFlag = true ps.ReturnFlag = true errC <- fmt.Errorf("failed to copy ps: %w", err) } close(errC) CallFunction(handler, &psTemp, arg, false, nil) }() if err := <-errC; err != nil { return MakeBuiltinError(ps, err.Error(), "go-with") } return arg0 default: ps.FailureFlag = true return MakeArgError(ps, 2, []env.Type{env.FunctionType}, "go-with") } default: ps.FailureFlag = true return MakeBuiltinError(ps, "First argument should be object type.", "go-with") } }, }, "go": { Argsn: 1, Doc: "TODODOC.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch handler := arg0.(type) { case env.Function: errC := make(chan error) go func() { ps.FailureFlag = false ps.ErrorFlag = false ps.ReturnFlag = false psTemp := env.ProgramState{} err := copier.Copy(&psTemp, &ps) if err != nil { ps.FailureFlag = true ps.ErrorFlag = true ps.ReturnFlag = true errC <- fmt.Errorf("failed to copy ps: %w", err) } close(errC) CallFunction(handler, &psTemp, nil, false, nil) }() if err := <-errC; err != nil { return MakeBuiltinError(ps, err.Error(), "go") } return arg0 default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.FunctionType}, "go") } }, }, "channel": { Argsn: 1, Doc: "TODODOC.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch buflen := arg0.(type) { case env.Integer: ch := make(chan *env.Object, int(buflen.Value)) return *env.NewNative(ps.Idx, ch, "Rye-channel") default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "channel") } }, }, "Rye-channel//read": { Argsn: 1, Doc: "TODODOC.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch chn := arg0.(type) { case env.Native: msg, ok := <-chn.Value.(chan *env.Object) if ok { return *msg } else { return *env.NewError("channel closed") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-channel//read") } }, }, "Rye-channel//send": { Argsn: 2, Doc: "TODODOC.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch chn := arg0.(type) { case env.Native: chn.Value.(chan *env.Object) <- &arg1 return arg0 default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-channel//send") } }, }, "Rye-channel//close": { Argsn: 1, Doc: "TODODOC.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch chn := arg0.(type) { case env.Native: close(chn.Value.(chan *env.Object)) return arg0 default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-channel//close") } }, }, "waitgroup": { Argsn: 0, Doc: "Create a waitgroup.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { var wg sync.WaitGroup return *env.NewNative(ps.Idx, &wg, "Rye-waitgroup") }, }, "Rye-waitgroup//add": { Argsn: 2, Doc: "TODODOC.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch wg := arg0.(type) { case env.Native: switch count := arg1.(type) { case env.Integer: wg.Value.(*sync.WaitGroup).Add(int(count.Value)) return arg0 default: ps.FailureFlag = true return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "Rye-waitgroup//add") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-waitgroup//add") } }, }, "Rye-waitgroup//done": { Argsn: 1, Doc: "TODODOC.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch wg := arg0.(type) { case env.Native: wg.Value.(*sync.WaitGroup).Done() return arg0 default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-waitgroup//done") } }, }, "Rye-waitgroup//wait": { Argsn: 1, Doc: "Wait on a waitgroup.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch wg := arg0.(type) { case env.Native: wg.Value.(*sync.WaitGroup).Wait() return arg0 default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-waitgroup//wait") } }, }, "select\\fn": { Argsn: 1, Doc: "Select on a message on multiple channels or default.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch block := arg0.(type) { case env.Block: ser := ps.Ser ps.Ser = block.Series var hasDeafult bool var cases []reflect.SelectCase var funcs []env.Function for ps.Ser.Pos() < ps.Ser.Len() { EvalExpression2(ps, false) defaultFn, ok := ps.Res.(env.Function) if ok { if hasDeafult { ps.FailureFlag = true return MakeBuiltinError(ps, "select can only have one default case", "select\\fn") } if defaultFn.Argsn != 0 { ps.FailureFlag = true return MakeBuiltinError(ps, "function with 0 args required", "select\\fn") } defaultCase := make(chan struct{}) close(defaultCase) cases = append(cases, reflect.SelectCase{ Dir: reflect.SelectRecv, Chan: reflect.ValueOf(defaultCase), }) funcs = append(funcs, defaultFn) hasDeafult = true continue } native, ok := ps.Res.(env.Native) if !ok { ps.FailureFlag = true return MakeBuiltinError(ps, "first argument of a case must be a channel", "select\\fn") } ch, ok := native.Value.(chan *env.Object) if !ok { ps.FailureFlag = true return MakeBuiltinError(ps, "first argument of a case must be a channel", "select\\fn") } cases = append(cases, reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ch)}) EvalExpression2(ps, false) fn, ok := ps.Res.(env.Function) if !ok { ps.FailureFlag = true return MakeBuiltinError(ps, "second argument of a case must be a function", "select\\fn") } if fn.Argsn > 1 { ps.FailureFlag = true return MakeBuiltinError(ps, "function with 0 or 1 arg required", "select\\fn") } funcs = append(funcs, fn) } ps.Ser = ser chosen, value, recvOK := reflect.Select(cases) fn := funcs[chosen] psTemp := env.ProgramState{} err := copier.Copy(&psTemp, &ps) if err != nil { ps.FailureFlag = true return MakeBuiltinError(ps, fmt.Sprintf("failed to copy ps: %s", err), "select\\fn") } var arg env.Object = nil if recvOK { val, ok := value.Interface().(*env.Object) if !ok { ps.FailureFlag = true return MakeBuiltinError(ps, "value from channel is not an object", "select\\fn") } arg = *val } if fn.Argsn == 0 { arg = nil } CallFunction(fn, &psTemp, arg, false, nil) default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.BlockType}, "select\\fn") } return arg0 }, }, "select": { Argsn: 1, Doc: "Select on a message on multiple channels or default.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch block := arg0.(type) { case env.Block: ser := ps.Ser ps.Ser = block.Series var hasDeafult bool var cases []reflect.SelectCase var funcs []env.Block for ps.Ser.Pos() < ps.Ser.Len() { EvalExpression2(ps, false) switch maybeChan := ps.Res.(type) { case env.Native: ch, ok := maybeChan.Value.(chan *env.Object) if !ok { ps.FailureFlag = true return MakeBuiltinError(ps, "first argument of a case must be a channel", "select") } cases = append(cases, reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ch)}) EvalExpression2(ps, false) fn, ok := ps.Res.(env.Block) if !ok { ps.FailureFlag = true return MakeBuiltinError(ps, "second argument of a case must be a block", "select") } funcs = append(funcs, fn) case env.Void: if hasDeafult { ps.FailureFlag = true return MakeBuiltinError(ps, "select can only have one default case", "select") } defaultCase := make(chan struct{}) close(defaultCase) cases = append(cases, reflect.SelectCase{ Dir: reflect.SelectRecv, Chan: reflect.ValueOf(defaultCase), }) EvalExpression2(ps, false) fn, ok := ps.Res.(env.Block) if !ok { ps.FailureFlag = true return MakeBuiltinError(ps, "second argument of a case must be a block", "select") } funcs = append(funcs, fn) hasDeafult = true } } ps.Ser = ser chosen, value, recvOK := reflect.Select(cases) fn := funcs[chosen] psTemp := env.ProgramState{} err := copier.Copy(&psTemp, &ps) if err != nil { ps.FailureFlag = true return MakeBuiltinError(ps, fmt.Sprintf("failed to copy ps: %s", err), "select") } var arg env.Object = nil if recvOK { val, ok := value.Interface().(*env.Object) if !ok { ps.FailureFlag = true return MakeBuiltinError(ps, "value from channel is not an object", "select") } arg = *val } psTemp.Ser = fn.Series EvalBlockInj(&psTemp, arg, true) default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.BlockType}, "select") } return arg0 }, }, }
var Builtins_html = map[string]*env.Builtin{ "unescape\\html": { Argsn: 1, Doc: "Unescapes HTML string", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { text, ok := arg0.(env.String) if !ok { return MakeArgError(ps, 1, []env.Type{env.StringType}, "unescape\\html") } mkd := html.UnescapeString(text.Value) return *env.NewString(mkd) }, }, "escape\\html": { Argsn: 1, Doc: "Unescapes HTML string", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { text, ok := arg0.(env.String) if !ok { return MakeArgError(ps, 1, []env.Type{env.StringType}, "unescape\\html") } mkd := html.EscapeString(text.Value) return *env.NewString(mkd) }, }, "html->markdown": { Argsn: 1, Doc: "Converts HTML text to markdown", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { text, ok := arg0.(env.String) if !ok { return MakeArgError(ps, 1, []env.Type{env.StringType}, "html->markdown") } mkd, err := htmltomarkdown.ConvertString(text.Value) if err != nil { return MakeBuiltinError(ps, err.Error(), "html->markdown") } return *env.NewString(mkd) }, }, "rye-reader//parse-html": { Argsn: 2, Doc: "Parses HTML string with a HTML dialect.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { rm, err := load_html_Dict(ps, arg1.(env.Block)) trace8("*** _--- GOT RM ++**") if err != nil { ps.FailureFlag = true return MakeBuiltinError(ps, "Error to load html dict.", "rye-reader//parse-html") } return do_html(ps, arg0.(env.Native).Value.(io.Reader), rm) }, }, "rye-html-start//attr?": { Argsn: 2, Doc: "Gets an attribute on node start.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch tok1 := arg0.(type) { case env.Native: switch tok := tok1.Value.(type) { case html.Token: switch n := arg1.(type) { case env.Integer: if int(n.Value) < len(tok.Attr) { return *env.NewString(tok.Attr[int(n.Value)].Val) } else { return env.Void{} } case env.Word: for _, a := range tok.Attr { if a.Key == ps.Idx.GetWord(n.Index) { return *env.NewString(a.Val) } } return env.Void{} default: return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "rye-html-start//attr?") } default: return MakeBuiltinError(ps, "Token value is not matching.", "rye-html-start//attr?") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-html-start//attr?") } }, }, "rye-html-start//name?": { Argsn: 1, Doc: "Gets the name of the node.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch tok1 := arg0.(type) { case env.Native: switch tok := tok1.Value.(type) { case html.Token: return *env.NewString(tok.Data) default: return MakeBuiltinError(ps, "Not xml-start element.", "rye-html-start//name?") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-html-start//name?") } }, }, }
var Builtins_http = map[string]*env.Builtin{ "http-server": { Argsn: 1, Doc: "Create new http server.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch addr := arg0.(type) { case env.String: server := &http.Server{Addr: addr.Value, ReadHeaderTimeout: 10 * time.Second} return *env.NewNative(ps.Idx, server, "Go-server") default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.StringType}, "http-server") } }, }, "Go-server//serve": { Argsn: 1, Doc: "Listen and serve new server.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch server := arg0.(type) { case env.Native: err := server.Value.(*http.Server).ListenAndServe() if err != nil { return makeError(ps, err.Error()) } return arg0 default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server//serve") } }, }, "Go-server//handle": { Argsn: 3, Doc: "HTTP handle function for server.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch 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, 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()) } CallFunctionArgs2(handler, ps, *env.NewNative(ps.Idx, w, "Go-server-response-writer"), *env.NewNative(ps.Idx, r, "Go-server-request"), nil) }) return arg0 case env.Native: http.Handle(path.Value, handler.Value.(http.Handler)) return arg0 default: ps.FailureFlag = true return MakeArgError(ps, 3, []env.Type{env.StringType, env.FunctionType, env.NativeType}, "Go-server//handle") } default: ps.FailureFlag = true return MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server//handle") } }, }, "Go-server-response-writer//write": { Argsn: 2, Doc: "Http response writer write function.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch path := arg0.(type) { case env.Native: switch handler := arg1.(type) { case env.String: fmt.Fprintf(path.Value.(http.ResponseWriter), handler.Value) return arg0 default: ps.FailureFlag = true return MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-response-writer//write") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-response-writer//write") } }, }, "Go-server-response-writer//set-content-type": { Argsn: 2, Doc: "Set http content type.", 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 MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-response-writer//set-content-type") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-response-writer//set-content-type") } }, }, "Go-server-response-writer//set-header": { Argsn: 3, Doc: "Set header for http server.", 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 MakeArgError(ps, 3, []env.Type{env.StringType}, "Go-server-response-writer//set-header") } default: ps.FailureFlag = true return MakeArgError(ps, 2, []env.Type{env.WordType}, "Go-server-response-writer//set-header") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-response-writer//set-header") } }, }, "Go-server-response-writer//write-header": { Argsn: 2, Doc: "Write header for http server.", 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 MakeArgError(ps, 2, []env.Type{env.IntegerType}, "Go-server-response-writer//write-header") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-response-writer//write-header") } }, }, "Go-server//handle-ws": { Argsn: 3, Doc: "Define handler for websockets", 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 { fmt.Println("< upgrade http error >") } go func() { defer conn.Close() ps.FailureFlag = false ps.ErrorFlag = false ps.ReturnFlag = false fmt.Println("<< Call Function Args 2 >>") fmt.Println(ps.Ser.PositionAndSurroundingElements(*ps.Idx)) psTemp := env.ProgramState{} err := copier.Copy(&psTemp, &ps) if err != nil { fmt.Println(err.Error()) } CallFunctionArgs2(handler, &psTemp, *env.NewNative(psTemp.Idx, conn, "Go-server-websocket"), *env.NewNative(psTemp.Idx, "asd", "Go-server-context"), nil) }() }) return arg0 default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.FunctionType}, "Go-server//handle-ws") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.StringType}, "Go-server//handle-ws") } }, }, "Go-server-websocket//read": { Argsn: 1, Doc: "Reading websocket.", 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: fmt.Println("BEFORE READ") msg, op, err := wsutil.ReadClientData(conn.Value.(io.ReadWriter)) fmt.Println("AFTER READ") fmt.Println(op) if err != nil { fmt.Println(err.Error()) fmt.Println("READ ERROR !!!!") ps.ReturnFlag = true ps.FailureFlag = true ps.ErrorFlag = true return MakeBuiltinError(ps, "Error in reading client data.", "Go-server-websocket//read") } return env.NewString(string(msg)) default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-websocket//read") } }, }, "Go-server-websocket//write": { Argsn: 2, Doc: "Writing websocket.", 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 { fmt.Println("YYOOYOYOYOYOYOYYOYOYOOY") ps.FailureFlag = true return MakeBuiltinError(ps, "Failed to write server message.", "Go-server-websocket//write") } return arg1 default: ps.FailureFlag = true return MakeArgError(ps, 2, []env.Type{env.NativeType}, "Go-server-websocket//write") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-websocket//write") } }, }, "Go-server-request//query?": { Argsn: 2, Doc: "Get query parameter from 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 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 MakeBuiltinError(ps, "Key is missing.", "Go-server-request//query?") } return env.NewString(vals[0]) default: ps.FailureFlag = true return MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-request//query?") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//query?") } }, }, "Go-server-request//url?": { Argsn: 1, Doc: "Get URL from 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: vals := req.Value.(*http.Request).URL return *env.NewNative(ps.Idx, vals, "Go-server-url") default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//url?") } }, }, "Go-server-url//path?": { Argsn: 1, Doc: "Get path from server url.", 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 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 MakeBuiltinError(ps, "Cookie key is missing.", "Go-server-request//cookie-val?") } return *env.NewString(cookie.Value) default: ps.FailureFlag = true return MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-request//cookie-val?") } default: ps.FailureFlag = true return 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 makeError(ps, err.Error()) } val := r.FormValue(key.Value) if len(val) < 1 { ps.FailureFlag = true return MakeBuiltinError(ps, "Value is missing.", "Go-server-request//form?") } return *env.NewString(val) default: ps.FailureFlag = true return MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-request//form?") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//form?") } }, }, "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 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 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 makeError(ps, err.Error()) } return arg0 default: ps.FailureFlag = true return 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 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, "rye-reader") pair[1] = *env.NewNative(ps.Idx, handler, "rye-multipart-header") return *env.NewBlock(*env.NewTSeries(pair)) default: ps.FailureFlag = true return MakeArgError(ps, 2, []env.Type{env.StringType}, "Go-server-request//form-file?") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Go-server-request//form-file?") } }, }, "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 MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-multipart-header//filename?") } }, }, "new-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 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 MakeBuiltinError(ps, errMsg, "Http-cookie-store//get") } return *env.NewNative(ps.Idx, session, "Http-session") default: ps.FailureFlag = true return *env.NewError("arg 0 should be String") } default: ps.FailureFlag = true return *env.NewError("arg 0 should be String") } default: ps.FailureFlag = true return 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 MakeArgError(ps, 3, []env.Type{env.StringType, env.IntegerType}, "Http-session//set") } default: return MakeArgError(ps, 2, []env.Type{env.StringType}, "Http-session//set") } default: return 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 MakeBuiltinError(ps, "Unknown type.", "Http-session//get") } } else { ps.FailureFlag = true return MakeBuiltinError(ps, "Value is empty.", "Http-session//get") } default: return MakeArgError(ps, 2, []env.Type{env.StringType}, "Http-session//get") } default: return 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 MakeBuiltinError(ps, errMsg, "Http-session//save") } return *env.NewInteger(1) default: return MakeArgError(ps, 3, []env.Type{env.NativeType}, "Http-session//save") } default: return MakeArgError(ps, 2, []env.Type{env.NativeType}, "Http-session//save") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Http-session//save") } }, }, "new-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 MakeArgError(ps, 1, []env.Type{env.UriType}, "new-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 MakeArgError(ps, 1, []env.Type{env.UriType}, "new-static-handler") } }, }, "Http-handler//strip-prefix": { Argsn: 2, Doc: "TODODOC.", 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 MakeArgError(ps, 1, []env.Type{env.NativeType}, "Http-handler//strip-prefix") } default: return MakeArgError(ps, 2, []env.Type{env.StringType}, "Http-handler//strip-prefix") } }, }, }
var Builtins_io = map[string]*env.Builtin{ "input": { Argsn: 1, Doc: "Take input from a user.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __input(ps, arg0, arg1, arg2, arg3, arg4) }, }, "file-schema//open": { Argsn: 1, Doc: "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.Uri: file, err := os.Open(s.Path) if err != nil { return makeError(ps, err.Error()) } return *env.NewNative(ps.Idx, file, "rye-file") default: return MakeArgError(ps, 1, []env.Type{env.UriType}, "file-schema//open") } }, }, "file-schema//open\\append": { Argsn: 1, Doc: "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.Uri: file, err := os.OpenFile(s.Path, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) if err != nil { return MakeBuiltinError(ps, err.Error(), "__openFile") } return *env.NewNative(ps.Idx, file, "rye-writer") default: return MakeArgError(ps, 1, []env.Type{env.UriType}, "__openFile") } }, }, "file-schema//create": { Argsn: 1, Doc: "Create file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __create(ps, arg0, arg1, arg2, arg3, arg4) }, }, "file-ext?": { Argsn: 1, Doc: "Get file extension.", 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: path := strings.Split(s.Path, "://") ext := filepath.Ext(path[1]) return *env.NewString(ext) case env.String: ext := filepath.Ext(s.Value) return *env.NewString(ext) default: return MakeArgError(ps, 1, []env.Type{env.UriType, env.StringType}, "file-ext?") } }, }, "reader": { Argsn: 1, Doc: "Open new 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.Uri: file, err := os.Open(s.Path) if err != nil { ps.FailureFlag = true return MakeBuiltinError(ps, "Error opening file.", "__open_reader") } return *env.NewNative(ps.Idx, bufio.NewReader(file), "rye-reader") case env.Native: file, ok := s.Value.(*os.File) if !ok { ps.FailureFlag = true return MakeBuiltinError(ps, "Error opening file.", "__open_reader") } return *env.NewNative(ps.Idx, bufio.NewReader(file), "rye-reader") case env.String: return *env.NewNative(ps.Idx, bufio.NewReader(strings.NewReader(s.Value)), "rye-reader") default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.UriType, env.StringType}, "__open_reader") } }, }, "stdin": { Argsn: 0, Doc: "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, "rye-reader") }, }, "stdout": { Argsn: 0, Doc: "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, "rye-writer") }, }, "rye-reader//read\\string": { Argsn: 2, Doc: "Read string from a reader up to the first character of the ending 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: switch ending := arg1.(type) { case env.String: reader, ok := r.Value.(*bufio.Reader) if !ok { ps.FailureFlag = true return MakeBuiltinError(ps, "Not Reader", "__read\\string") } inp, err := reader.ReadString(ending.Value[0]) if err != nil { ps.FailureFlag = true return MakeBuiltinError(ps, err.Error(), "__read\\string") } return *env.NewString(inp) default: ps.FailureFlag = true return MakeArgError(ps, 2, []env.Type{env.NativeType}, "__read\\string") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "__read\\string") } }, }, "rye-reader//copy": { Argsn: 2, Doc: "Copy 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 MakeBuiltinError(ps, err.Error(), "__copy") } return arg0 default: ps.FailureFlag = true return MakeArgError(ps, 2, []env.Type{env.NativeType}, "__copy") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "__copy") } }, }, "rye-file//copy": { Argsn: 2, Doc: "Copy Rye file to ouptut.", 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 MakeBuiltinError(ps, err.Error(), "__copy") } return arg0 default: ps.FailureFlag = true return MakeArgError(ps, 2, []env.Type{env.NativeType}, "__copy") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "__copy") } }, }, "rye-file//stat": { Argsn: 1, Doc: "Get stat 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 { return __stat(ps, arg0, arg1, arg2, arg3, arg4) }, }, "file-info//size?": { Argsn: 1, Doc: "Get size 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: size := s.Value.(os.FileInfo).Size() return *env.NewInteger(size) default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "file-info//size?") } }, }, "rye-file//read-all": { Argsn: 1, Doc: "Read all 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: data, err := io.ReadAll(s.Value.(io.Reader)) if err != nil { ps.FailureFlag = true return MakeBuiltinError(ps, "Error reading file.", "__read_all") } return *env.NewString(string(data)) default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "__read_all") } }, }, "rye-file//seek\\end": { Argsn: 1, Doc: "Write 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 s := arg0.(type) { case env.Native: reader, ok := s.Value.(*os.File) if !ok { return MakeBuiltinError(ps, "Native not io.Reader", "rye-file//seek\\end") } reader.Seek(0, os.SEEK_END) return arg0 default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-file//seek\\end") } }, }, "rye-file//close": { Argsn: 1, Doc: "Closes an open file or reader or writer.", 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 MakeBuiltinError(ps, err.Error(), "__close") } return *env.NewString("") default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "__close") } }, }, "file-schema//read": { Argsn: 1, Doc: "Read a file given the path.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __fs_read(ps, arg0, arg1, arg2, arg3, arg4) }, }, "file-schema//read\\bytes": { Argsn: 1, Doc: "Read a specific number of bytes 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 { return __fs_read_bytes(ps, arg0, arg1, arg2, arg3, arg4) }, }, "file-schema//read\\lines": { Argsn: 1, Doc: "Read files into the 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 { return __fs_read_lines(ps, arg0, arg1, arg2, arg3, arg4) }, }, "file-schema//write": { Argsn: 2, Doc: "Write 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 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 MakeBuiltinError(ps, err.Error(), "__fs_write") } return arg1 case env.Native: err := os.WriteFile(f.GetPath(), s.Value.([]byte), 0600) if err != nil { ps.FailureFlag = true return MakeBuiltinError(ps, err.Error(), "__fs_write") } return arg1 default: return MakeArgError(ps, 2, []env.Type{env.StringType, env.NativeType}, "__fs_write") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.UriType}, "__fs_write") } }, }, "rye-writer//write\\string": { Argsn: 2, Doc: "Write 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 { switch s := arg1.(type) { case env.String: switch ww := arg0.(type) { case env.Native: writer, ok := ww.Value.(*os.File) if !ok { return MakeBuiltinError(ps, "Native not io.File", "rye-writer//write\\string") } _, err := writer.WriteString(s.Value) if err != nil { return MakeBuiltinError(ps, "Error at write: "+err.Error(), "rye-writer//write\\string") } return arg0 default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-writer//write\\string") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.StringType}, "rye-writer//write\\string") } }, }, "https-schema//open": { Argsn: 1, Doc: "Open a HTTPS GET request.", 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-schema://open") } else { ps.FailureFlag = true errMsg := fmt.Sprintf("Status Code: %v, Body: %v", resp.StatusCode) return MakeBuiltinError(ps, errMsg, "https-schema://open") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.NativeType}, "https-schema://open") } }, }, "https-schema//get": { Argsn: 1, Doc: "Make a HTTPS GET request.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __https_s_get(ps, arg0, arg1, arg2, arg3, arg4) }, }, "https-schema//post": { Argsn: 3, Doc: "Make a HTTPS POST request.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __http_s_post(ps, arg0, arg1, arg2, arg3, arg4) }, }, "http-schema//get": { Argsn: 1, Doc: "Make a HTTP GET request.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __https_s_get(ps, arg0, arg1, arg2, arg3, arg4) }, }, "http-schema//post": { Argsn: 3, Doc: "Make a HTTP POST request.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __http_s_post(ps, arg0, arg1, arg2, arg3, arg4) }, }, "https-schema//new-request": { Argsn: 3, Doc: "Create 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 { return __https_s__new_request(ps, arg0, arg1, arg2, arg3, arg4) }, }, "https-request//set-header": { Argsn: 3, Doc: "Set header to the HTTPS Request.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __https_request__set_header(ps, arg0, arg1, arg2, arg3, arg4) }, }, "https-request//set-basic-auth": { Argsn: 3, Doc: "Set Basic Auth to the HTTPS Request.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __https_request__set_basic_auth(ps, arg0, arg1, arg2, arg3, arg4) }, }, "https-request//call": { Argsn: 1, Doc: "Call 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 { return __https_request__do(ps, arg0, arg1, arg2, arg3, arg4) }, }, "https-response//read-body": { Argsn: 1, Doc: "Read body of HTTPS response.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __https_response__read_body(ps, arg0, arg1, arg2, arg3, arg4) }, }, "email//send": { Argsn: 2, Doc: "Send email.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return __email_send(ps, arg0, arg1, arg2, arg3, arg4) }, }, "ftp-schema//open": { Argsn: 1, Doc: "Open connection to 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 { fmt.Println("Error connecting to FTP server:", err) return MakeBuiltinError(ps, "Error connecting to FTP server: "+err.Error(), "ftp-schema//open") } if err != nil { ps.FailureFlag = true return MakeBuiltinError(ps, "Error opening file.", "ftp-schema//open") } return *env.NewNative(ps.Idx, conn, "ftp-connection") default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.UriType, env.StringType}, "ftp-schema//open") } }, }, "ftp-connection//login": { Argsn: 3, Doc: "Login to connection to 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: username, ok := arg1.(env.String) if !ok { return nil } pwd, ok := arg2.(env.String) if !ok { return nil } err := s.Value.(*ftp.ServerConn).Login(username.Value, pwd.Value) if err != nil { fmt.Println("Error logging in:", err) return nil } return s default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.UriType, env.StringType}, "ftp-connection//login") } }, }, "ftp-connection//retrieve": { Argsn: 2, Doc: "Retrieve file from connection to 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: path, ok := arg1.(env.String) if !ok { } resp, err := s.Value.(*ftp.ServerConn).Retr(path.Value) if err != nil { fmt.Println("Error retrieving:", err) return nil } return *env.NewNative(ps.Idx, resp, "rye-reader") default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.UriType, env.StringType}, "ftp-connection//login") } }, }, }
var Builtins_json = map[string]*env.Builtin{ "parse-json": { Argsn: 1, Doc: "Parses JSON to and turns them to Rye values.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch input := arg0.(type) { case env.String: var m any err := json.Unmarshal([]byte(input.Value), &m) if err != nil { return MakeBuiltinError(ps, "Failed to Unmarshal.", "_parse_json") } return env.ToRyeValue(m) default: return MakeArgError(ps, 1, []env.Type{env.StringType}, "_parse_json") } }, }, "to-json": { Argsn: 1, Doc: "Takes a Rye value and returns it encoded into JSON.", Fn: func(es *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return *env.NewString(RyeToJSON(arg0)) }, }, "to-json\\lines": { Argsn: 1, Doc: "Takes a Rye value and returns it encoded into JSON.", Fn: func(es *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return *env.NewString(RyeToJSONLines(arg0)) }, }, }
var Builtins_mail = map[string]*env.Builtin{ "rye-reader//parse-email": { Argsn: 1, Doc: "Parse email.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch reader := arg0.(type) { case env.Native: email, err := parsemail.Parse(reader.Value.(io.Reader)) if err != nil { return MakeBuiltinError(ps, err.Error(), "rye-reader//parse-email") } return *env.NewNative(ps.Idx, email, "parsed-email") default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-reader//parse-email") } }, }, "parsed-email//subject?": { Argsn: 1, Doc: "Get subject value from parsed email.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch email := arg0.(type) { case env.Native: return *env.NewString(email.Value.(parsemail.Email).Subject) default: return *MakeArgError(ps, 1, []env.Type{env.NativeType}, "parsed-email//subject?") } }, }, "parsed-email//message-id?": { Argsn: 1, Doc: "Get message-id from parsed email.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch email := arg0.(type) { case env.Native: return *env.NewString(email.Value.(parsemail.Email).MessageID) default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "parsed-email//message-id?") } }, }, "parsed-email//html-body?": { Argsn: 1, Doc: "Get HTML body from parsed email", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch email := arg0.(type) { case env.Native: return *env.NewString(email.Value.(parsemail.Email).HTMLBody) default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "parsed-email//html-body?") } }, }, "parsed-email//text-body?": { Argsn: 1, Doc: "Get text body from parsed email.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch email := arg0.(type) { case env.Native: return *env.NewString(email.Value.(parsemail.Email).TextBody) default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "parsed-email//text-body?") } }, }, "parsed-email//attachments?": { Argsn: 1, Doc: "TODODOC", 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, arg0, "smtpd") }, }, "parsed-email//embedded-files?": { Argsn: 1, Doc: "TODODOC", 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, arg0, "smtpd") }, }, }
var Builtins_math = map[string]*env.Builtin{ "mod": { Argsn: 2, Doc: "Return a decimal remainder", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { fa, fb, errPos := assureFloats(arg0, arg1) if errPos > 0 { return MakeArgError(ps, errPos, []env.Type{env.IntegerType, env.BlockType}, "mod") } return *env.NewDecimal(math.Mod(fa, fb)) }, }, "pow": { Argsn: 2, Doc: "Return the power of", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { fa, fb, errPos := assureFloats(arg0, arg1) if errPos > 0 { return MakeArgError(ps, errPos, []env.Type{env.IntegerType, env.BlockType}, "pow") } return *env.NewDecimal(math.Pow(fa, fb)) }, }, "log2": { Argsn: 1, Doc: "Return binary logarithm of x", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.Log2(float64(val.Value))) case env.Decimal: return *env.NewDecimal(math.Log2(val.Value)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.BlockType}, "log2") } }, }, "log10": { Argsn: 1, Doc: "Returns the decimal logarithm of x", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.Log10(float64(val.Value))) case env.Decimal: return *env.NewDecimal(math.Log10(val.Value)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "log10") } }, }, "log1p": { Argsn: 1, Doc: "Returns the natural logarithm of 1 plus its argument x", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.Log1p(float64(val.Value))) case env.Decimal: return *env.NewDecimal(math.Log1p(val.Value)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "log1p") } }, }, "logb": { Argsn: 1, Doc: "logb returns the binary exponent of x", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.Logb(float64(val.Value))) case env.Decimal: return *env.NewDecimal(math.Logb(val.Value)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "logb") } }, }, "sq": { Argsn: 1, Doc: "Return the sine of the radian argument.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.Pow(float64(val.Value), 2.0)) case env.Decimal: return *env.NewDecimal(math.Pow(val.Value, 2.0)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.BlockType}, "sq") } }, }, "sin": { Argsn: 1, Doc: "Return the sine of the radian argument.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.Sin(float64(val.Value))) case env.Decimal: return *env.NewDecimal(math.Sin(val.Value)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.BlockType}, "sin") } }, }, "cos": { Argsn: 1, Doc: "Return the cosine of the radian argument.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.Cos(float64(val.Value))) case env.Decimal: return *env.NewDecimal(math.Cos(val.Value)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.BlockType}, "cos") } }, }, "sqrt": { Argsn: 1, Doc: "Return the square root of x.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.Sqrt(float64(val.Value))) case env.Decimal: return *env.NewDecimal(math.Sqrt(val.Value)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.BlockType}, "sqrt") } }, }, "abs": { Argsn: 1, Doc: "Return absolute value.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewInteger(int64(math.Abs(float64(val.Value)))) case env.Decimal: return *env.NewDecimal(math.Abs(val.Value)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.BlockType}, "abs") } }, }, "acos": { Argsn: 1, Doc: "Returns the arccosine.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: if val.Value < -1.0 || val.Value > 1.0 { return MakeBuiltinError(ps, "Invalid input: Acos is only defined for -1 <= x <= 1.", "acos") } return *env.NewDecimal(math.Acos(float64(val.Value))) case env.Decimal: if val.Value < -1.0 || val.Value > 1.0 { return MakeBuiltinError(ps, "Invalid input: Acos is only defined for -1 <= x <= 1.", "acos") } return *env.NewDecimal(math.Acos(val.Value)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "acos") } }, }, "acosh": { Argsn: 1, Doc: "Returns the inverse hyperbolic cosine.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: if val.Value < 1.0 { return MakeBuiltinError(ps, " Acosh is only defined for x >= 1.", "acosh") } return *env.NewDecimal(math.Log(float64(val.Value) + math.Sqrt(float64(val.Value)*float64(val.Value)-1))) case env.Decimal: if val.Value < 1.0 { return MakeBuiltinError(ps, " Acosh is only defined for x >= 1.", "acosh") } return *env.NewDecimal(math.Log(val.Value + math.Sqrt(val.Value*val.Value-1))) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "acosh") } }, }, "asin": { Argsn: 1, Doc: "Returns the arcsine (inverse sine).", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: if val.Value < -1.0 || val.Value > 1.0 { return MakeBuiltinError(ps, "Invalid input: Asin is only defined for -1 <= x <= 1.", "asin") } return *env.NewDecimal(math.Asin(float64(val.Value))) case env.Decimal: if val.Value < -1.0 || val.Value > 1.0 { return MakeBuiltinError(ps, "Invalid input: Asin is only defined for -1 <= x <= 1.", "asin") } return *env.NewDecimal(math.Asin(val.Value)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "asin") } }, }, "asinh": { Argsn: 1, Doc: "Returns the inverse hyperbolic sine.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.Log(float64(val.Value) + math.Sqrt(float64(val.Value)*float64(val.Value)+1))) case env.Decimal: return *env.NewDecimal(math.Log(val.Value + math.Sqrt(val.Value*val.Value+1))) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "asinh") } }, }, "atan": { Argsn: 1, Doc: "Returns the arctangent (inverse tangent).", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.Atan(float64(val.Value))) case env.Decimal: return *env.NewDecimal(math.Atan(val.Value)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "atan") } }, }, "atan2": { Argsn: 2, Doc: "Returns the arc tangent of y/x, using the signs of the two to determine the quadrant of the return value.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: switch val2 := arg1.(type) { case env.Integer: return *env.NewDecimal(math.Atan2(float64(val.Value), float64(val2.Value))) case env.Decimal: return *env.NewDecimal(math.Atan2(float64(val.Value), val2.Value)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "atan2") } case env.Decimal: switch val2 := arg1.(type) { case env.Integer: return *env.NewDecimal(math.Atan2(val.Value, float64(val2.Value))) case env.Decimal: return *env.NewDecimal(math.Atan2(val.Value, val2.Value)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "atan2") } default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "atan2") } }, }, "atanh": { Argsn: 1, Doc: "Returns the inverse hyperbolic tangent.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.Atanh(float64(val.Value))) case env.Decimal: return *env.NewDecimal(math.Atanh(val.Value)) default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "atanh") } }, }, "ceil": { Argsn: 1, Doc: "Returns the least integer value greater than or equal to x.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(float64(val.Value)) case env.Decimal: return *env.NewDecimal(math.Ceil(val.Value)) default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "ceil") } }, }, "cbrt": { Argsn: 1, Doc: "Returns returns the cube root of x.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.Cbrt(float64(val.Value))) case env.Decimal: return *env.NewDecimal(math.Cbrt(val.Value)) default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "cbrt") } }, }, "copysign": { Argsn: 2, Doc: "Copysign returns a value with the magnitude of arg1 and the sign of arg2.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: switch val2 := arg1.(type) { case env.Integer: return *env.NewDecimal(math.Copysign(float64(val.Value), float64(val2.Value))) case env.Decimal: return *env.NewDecimal(math.Copysign(float64(val.Value), val2.Value)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "copysign") } case env.Decimal: switch val2 := arg1.(type) { case env.Integer: return *env.NewDecimal(math.Copysign(val.Value, float64(val2.Value))) case env.Decimal: return *env.NewDecimal(math.Copysign(val.Value, val2.Value)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "copysign") } default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "copysign") } }, }, "dim": { Argsn: 2, Doc: "Dim returns the maximum of arg1-arg2 or 0.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: switch val2 := arg1.(type) { case env.Integer: return *env.NewDecimal(util.GetDimValue(float64(val.Value), float64(val2.Value))) case env.Decimal: return *env.NewDecimal(util.GetDimValue(float64(val.Value), val2.Value)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "dim") } case env.Decimal: switch val2 := arg1.(type) { case env.Integer: return *env.NewDecimal(util.GetDimValue(val.Value, float64(val2.Value))) case env.Decimal: return *env.NewDecimal(util.GetDimValue(val.Value, val2.Value)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "dim") } default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "dim") } }, }, "round\\to": { Argsn: 2, Doc: "Round to a number of digits.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Decimal: switch precision := arg1.(type) { case env.Integer: ratio := math.Pow(10, float64(precision.Value)) return *env.NewDecimal(math.Round(val.Value*ratio) / ratio) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "round\\to") } default: return MakeArgError(ps, 1, []env.Type{env.DecimalType}, "round\\to") } }, }, "round": { Argsn: 1, Doc: "Round to nearest integer.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Decimal: return *env.NewDecimal(math.Round(val.Value)) default: return MakeArgError(ps, 1, []env.Type{env.DecimalType}, "round\\to") } }, }, "roundtoeven": { Argsn: 1, Doc: "Returns the nearest integer, rounding ties to even.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Decimal: return *env.NewDecimal(math.RoundToEven(val.Value)) case env.Integer: return *env.NewDecimal(math.RoundToEven(float64(val.Value))) default: return MakeArgError(ps, 1, []env.Type{env.DecimalType, env.IntegerType}, "roundtoeven") } }, }, "erf": { Argsn: 1, Doc: "Returns the error function of value.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.Erf(float64(val.Value))) case env.Decimal: return *env.NewDecimal(math.Erf(val.Value)) default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "erf") } }, }, "erfc": { Argsn: 1, Doc: "Returns the complementary error function of value.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.Erfc(float64(val.Value))) case env.Decimal: return *env.NewDecimal(math.Erfc(val.Value)) default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "erfc") } }, }, "erfcinv": { Argsn: 1, Doc: "Returns the inverse of erfc(x) function.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.Erfcinv(float64(val.Value))) case env.Decimal: return *env.NewDecimal(math.Erfcinv(val.Value)) default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "erfcinv") } }, }, "erfinv": { Argsn: 1, Doc: "Returns the inverse error function of value.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.Erfinv(float64(val.Value))) case env.Decimal: return *env.NewDecimal(math.Erfinv(val.Value)) default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "erfinv") } }, }, "exp": { Argsn: 1, Doc: "Returns e**x, the base-e exponential of x.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.Exp(float64(val.Value))) case env.Decimal: return *env.NewDecimal(math.Exp(val.Value)) default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "exp") } }, }, "exp2": { Argsn: 1, Doc: "Returns 2**x, the base-2 exponential of x.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.Exp2(float64(val.Value))) case env.Decimal: return *env.NewDecimal(math.Exp2(val.Value)) default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "exp2") } }, }, "expm1": { Argsn: 1, Doc: "Returns e**x - 1, the base-e exponential of x minus 1. It is more accurate than exp(x) - 1 when x is near zero.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.Expm1(float64(val.Value))) case env.Decimal: return *env.NewDecimal(math.Expm1(val.Value)) default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "expm1") } }, }, "fma": { Argsn: 3, Doc: "Returns x * y + z, computed with only one rounding. (That is, FMA returns the fused multiply-add of x, y, and z.)", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val1 := arg0.(type) { case env.Integer: switch val2 := arg1.(type) { case env.Integer: switch val3 := arg2.(type) { case env.Integer: return *env.NewDecimal(math.FMA(float64(val1.Value), float64(val2.Value), float64(val3.Value))) case env.Decimal: return *env.NewDecimal(math.FMA(float64(val1.Value), float64(val2.Value), val3.Value)) default: return MakeArgError(ps, 3, []env.Type{env.IntegerType, env.DecimalType}, "fma") } case env.Decimal: switch val3 := arg2.(type) { case env.Integer: return *env.NewDecimal(math.FMA(float64(val1.Value), val2.Value, float64(val3.Value))) case env.Decimal: return *env.NewDecimal(math.FMA(float64(val1.Value), val2.Value, val3.Value)) default: return MakeArgError(ps, 3, []env.Type{env.IntegerType, env.DecimalType}, "fma") } default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "fma") } case env.Decimal: switch val2 := arg1.(type) { case env.Integer: switch val3 := arg2.(type) { case env.Integer: return *env.NewDecimal(math.FMA(val1.Value, float64(val2.Value), float64(val3.Value))) case env.Decimal: return *env.NewDecimal(math.FMA(val1.Value, float64(val2.Value), val3.Value)) default: return MakeArgError(ps, 3, []env.Type{env.IntegerType, env.DecimalType}, "fma") } case env.Decimal: switch val3 := arg2.(type) { case env.Integer: return *env.NewDecimal(math.FMA(val1.Value, val2.Value, float64(val3.Value))) case env.Decimal: return *env.NewDecimal(math.FMA(val1.Value, val2.Value, val3.Value)) default: return MakeArgError(ps, 3, []env.Type{env.IntegerType, env.DecimalType}, "fma") } default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "fma") } default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "fma") } }, }, "j0": { Argsn: 1, Doc: "Returns the order-zero Bessel function of the first kind.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.J0(float64(val.Value))) case env.Decimal: return *env.NewDecimal(math.J0(val.Value)) default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "j0") } }, }, "j1": { Argsn: 1, Doc: "Returns the order-one Bessel function of the first kind.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.J1(float64(val.Value))) case env.Decimal: return *env.NewDecimal(math.J1(val.Value)) default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "j1") } }, }, "y0": { Argsn: 1, Doc: "Returns the order-zero Bessel function of the second kind.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.Y0(float64(val.Value))) case env.Decimal: return *env.NewDecimal(math.Y0(val.Value)) default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "y0") } }, }, "y1": { Argsn: 1, Doc: "Returns the order-one Bessel function of the second kind.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(math.Y1(float64(val.Value))) case env.Decimal: return *env.NewDecimal(math.Y1(val.Value)) default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "y1") } }, }, "yn": { Argsn: 2, Doc: "Returns the order-n Bessel function of the second kind.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch v1 := arg0.(type) { case env.Integer: switch v2 := arg1.(type) { case env.Integer: return *env.NewDecimal(math.Yn(int(v1.Value), float64(v2.Value))) case env.Decimal: return *env.NewDecimal(math.Yn(int(v1.Value), v2.Value)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "yn") } case env.Decimal: switch v2 := arg1.(type) { case env.Integer: return *env.NewDecimal(math.Yn(int(v1.Value), float64(v2.Value))) case env.Decimal: return *env.NewDecimal(math.Yn(int(v1.Value), v2.Value)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "yn") } default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "yn") } }, }, "jn": { Argsn: 2, Doc: "Returns the order-n Bessel function of the first kind.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch v1 := arg0.(type) { case env.Integer: switch v2 := arg1.(type) { case env.Integer: return *env.NewDecimal(math.Jn(int(v1.Value), float64(v2.Value))) case env.Decimal: return *env.NewDecimal(math.Jn(int(v1.Value), v2.Value)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "jn") } case env.Decimal: switch v2 := arg1.(type) { case env.Integer: return *env.NewDecimal(math.Jn(int(v1.Value), float64(v2.Value))) case env.Decimal: return *env.NewDecimal(math.Jn(int(v1.Value), v2.Value)) default: return MakeArgError(ps, 2, []env.Type{env.IntegerType, env.DecimalType}, "jn") } default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "jn") } }, }, "trunc": { Argsn: 1, Doc: "Trunc returns the integer value of input.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Integer: return *env.NewDecimal(float64(val.Value)) case env.Decimal: return *env.NewDecimal(math.Trunc(val.Value)) default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "trunc") } }, }, "pi": { Argsn: 0, Doc: "Return Pi constant.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return *env.NewDecimal(float64(math.Pi)) }, }, "deg->rad": { Argsn: 1, Doc: "Convert degrees to radians.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { var fa float64 switch a := arg0.(type) { case env.Decimal: fa = a.Value case env.Integer: fa = float64(a.Value) default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.DecimalType}, "deg->rad") } return *env.NewDecimal(fa * float64(math.Pi) / 180.0) }, }, "is-near": { Argsn: 2, Doc: "Returns true if two decimals are close.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { fa, fb, errPos := assureFloats(arg0, arg1) if errPos > 0 { return MakeArgError(ps, errPos, []env.Type{env.IntegerType, env.BlockType}, "is-near") } const epsilon = 0.0000000000001 // math.SmallestNonzeroFloat64 if math.Abs(fa-fb) <= (epsilon) { return env.NewInteger(1) } else { return env.NewInteger(0) } }, }, "near-zero": { Argsn: 1, Doc: "Returns true if a decimal is close to zero.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { var fa float64 switch a := arg0.(type) { case env.Decimal: fa = a.Value case env.Integer: fa = float64(a.Value) default: return MakeArgError(ps, 1, []env.Type{env.IntegerType, env.BlockType}, "near-zero") } // const epsilon = math.SmallestNonzeroFloat64 const epsilon = 0.0000000000001 // math.SmallestNonzeroFloat64 if math.Abs(fa) <= epsilon { return env.NewInteger(1) } else { return env.NewInteger(0) } }, }, "to-eyr": { Argsn: 1, Doc: "Math dialect to Eyr dialect", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return DialectMath(ps, arg0) }, }, "calc": { Argsn: 1, Doc: "Do math dialect", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { res := DialectMath(ps, arg0) switch block := res.(type) { case env.Block: ps.ResetStack() ser := ps.Ser ps.Ser = block.Series Eyr_EvalBlock(ps, false) ps.Ser = ser return ps.Res default: return res } }, }, }
var Builtins_mysql = map[string]*env.Builtin{ "mysql-schema//open": { Argsn: 1, Doc: "Open Mysql connection.", 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.Uri: db, err := sql.Open("mysql", str.Path) if err != nil { ps.FailureFlag = true errMsg := fmt.Sprintf("Error opening SQL: %v", err.Error()) return MakeBuiltinError(ps, errMsg, "mysql-schema//open") } else { return *env.NewNative(ps.Idx, db, "Rye-mysql") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.UriType}, "mysql-schema//open") } }, }, "mysql-schema//open\\pwd": { Argsn: 2, Doc: "Open Mysql connection.", 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.Uri: switch pwd := arg1.(type) { case env.String: path := strings.Replace(str.Path, "@", ":"+pwd.Value+"@", 1) fmt.Println(path) db, err := sql.Open("mysql", path) if err != nil { ps.FailureFlag = true errMsg := fmt.Sprintf("Error opening SQL: %v", err.Error()) return MakeBuiltinError(ps, errMsg, "mysql-schema//open\\pwd") } else { return *env.NewNative(ps.Idx, db, "Rye-mysql") } default: ps.FailureFlag = true return MakeArgError(ps, 2, []env.Type{env.StringType}, "mysql-schema//open\\pwd") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.UriType}, "mysql-schema//open\\pwd") } }, }, "Rye-mysql//exec": { Argsn: 2, Doc: "Execute sql query in for mysql.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { var sqlstr string var vals []any switch db1 := arg0.(type) { case env.Native: switch str := arg1.(type) { case env.Block: ser := ps.Ser ps.Ser = str.Series values := make([]any, 0, 2) _, vals = SQL_EvalBlock(ps, MODE_SQLITE, values) sqlstr = ps.Res.(env.String).Value ps.Ser = ser case env.String: sqlstr = str.Value default: ps.ErrorFlag = true return MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-mysql//exec") } if sqlstr != "" { db2 := db1.Value.(*sql.DB) res, err := db2.Exec(sqlstr, vals...) if err != nil { ps.FailureFlag = true return MakeBuiltinError(ps, err.Error(), "Rye-mysql//exec") } else { num, _ := res.RowsAffected() if num > 0 { return env.NewInteger(1) } else { ps.FailureFlag = true return MakeBuiltinError(ps, "No rows affected.", "Rye-mysql//exec") } } } else { return MakeBuiltinError(ps, "SQL string is blank.", "Rye-mysql//exec") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mysql//exec") } }, }, "Rye-mysql//query": { Argsn: 2, Doc: "Sql query to get rows data", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { var sqlstr string var vals []any switch db1 := arg0.(type) { case env.Native: switch str := arg1.(type) { case env.Block: ser := ps.Ser ps.Ser = str.Series values := make([]any, 0, 2) _, vals = SQL_EvalBlock(ps, MODE_SQLITE, values) sqlstr = ps.Res.(env.String).Value ps.Ser = ser case env.String: sqlstr = str.Value default: ps.ErrorFlag = true return MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-mysql//query") } if sqlstr != "" { rows, err := db1.Value.(*sql.DB).Query(sqlstr, vals...) if err != nil { ps.FailureFlag = true return MakeBuiltinError(ps, err.Error(), "Rye-mysql//exec") } else { cols, _ := rows.Columns() spr := env.NewTable(cols) i := 0 for rows.Next() { var sr env.TableRow columns := make([]any, len(cols)) columnPointers := make([]any, len(cols)) for i := range columns { columnPointers[i] = &columns[i] } m := make(map[string]any) for i, colName := range cols { val := *columnPointers[i].(*any) switch vval := val.(type) { case []uint8: m[colName] = env.ToRyeValue(string(vval)) sr.Values = append(sr.Values, env.ToRyeValue(string(vval))) default: m[colName] = env.ToRyeValue(vval) sr.Values = append(sr.Values, env.ToRyeValue(vval)) } } spr.AddRow(sr) i++ } rows.Close() if i == 0 { ps.FailureFlag = true return MakeBuiltinError(ps, "No data.", "Rye-mysql//query") } return *spr } } else { return MakeBuiltinError(ps, "Empty SQL.", "Rye-mysql//query") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-mysql//query") } }, }, }
var Builtins_os = map[string]*env.Builtin{ "cwd?": { Argsn: 0, Doc: "Returns current working directory.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { path, err := os.Getwd() if err != nil { return MakeBuiltinError(ps, err.Error(), "cwd") } return *env.NewUri1(ps.Idx, "file://"+path) }, }, "cd": { Argsn: 1, Doc: "Changes current directory.", 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.Uri: err := os.Chdir(path.GetPath()) if err != nil { return MakeBuiltinError(ps, err.Error(), "cd") } return arg0 default: return MakeArgError(ps, 1, []env.Type{env.UriType}, "cd") } }, }, "env?": { Argsn: 1, Doc: "Gets the environment variable.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch variable_name := arg0.(type) { case env.String: val, ok := os.LookupEnv(variable_name.Value) if !ok { return MakeBuiltinError(ps, "Variable couldn't be read", "env?") } return env.NewString(val) default: return MakeArgError(ps, 1, []env.Type{env.StringType}, "env?") } }, }, "mkdir": { Argsn: 1, 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 path := arg0.(type) { case env.Uri: newDir := filepath.Join(filepath.Dir(ps.WorkingPath), path.GetPath()) err := os.Mkdir(newDir, 0755) if err != nil { return MakeBuiltinError(ps, "Error creating directory: "+err.Error(), "mkdir") } else { return arg0 } default: return MakeArgError(ps, 1, []env.Type{env.UriType}, "mkdir") } }, }, "mktmp": { Argsn: 0, Doc: "Creates a temporary directory.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { dir, err := os.MkdirTemp("", "rye-tmp-") if err != nil { return MakeBuiltinError(ps, "Error creating temporary directory: "+err.Error(), "mktmp") } return *env.NewUri1(ps.Idx, "file://"+dir) }, }, "mv": { 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 path := arg0.(type) { case env.Uri: switch path2 := arg1.(type) { case env.Uri: old := filepath.Join(filepath.Dir(ps.WorkingPath), path.GetPath()) new := filepath.Join(filepath.Dir(ps.WorkingPath), path2.GetPath()) err := os.Rename(old, new) if err != nil { fmt.Println("Error renaming file:", err) return MakeBuiltinError(ps, "Error renaming file: "+err.Error(), "mv") } else { return arg1 } default: return MakeArgError(ps, 1, []env.Type{env.UriType}, "mv") } default: return MakeArgError(ps, 1, []env.Type{env.UriType}, "mv") } }, }, "ls": { Argsn: 0, Doc: "Returns current working directory.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { files, err := os.ReadDir(".") if err != nil { return MakeBuiltinError(ps, "Error reading directory:"+err.Error(), "ls") } items := make([]env.Object, len(files)) for i, file := range files { items[i] = *env.NewUri1(ps.Idx, "file://"+file.Name()) } return *env.NewBlock(*env.NewTSeries(items)) }, }, "host-info?": { Argsn: 0, Doc: "Get information about the host system.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { v, err := host.Info() if err != nil { return MakeBuiltinError(ps, err.Error(), "host-info?") } r := env.NewDict(make(map[string]any, 10)) r.Data["hostname"] = *env.NewString(v.Hostname) r.Data["uptime"] = *env.NewInteger(int64(v.Uptime)) r.Data["boot-time"] = *env.NewInteger(int64(v.BootTime)) r.Data["procs"] = *env.NewInteger(int64(v.Procs)) r.Data["os"] = *env.NewString(v.OS) r.Data["platform"] = *env.NewString(v.Platform) r.Data["platform-family"] = *env.NewString(v.PlatformFamily) r.Data["platform-version"] = *env.NewString(v.PlatformVersion) r.Data["kernel-version"] = *env.NewString(v.KernelVersion) r.Data["virtualization-system"] = *env.NewString(v.VirtualizationSystem) return *r }, }, "users?": { Argsn: 0, Doc: "Get information about users as a table.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { users, err := host.Users() if err != nil { return MakeBuiltinError(ps, err.Error(), "users?") } fmt.Println(users) s := env.NewTable([]string{"User", "Terminal", "Host", "Started"}) for _, user := range users { vals := []any{ *env.NewString(user.User), *env.NewString(user.Terminal), *env.NewString(user.Host), *env.NewInteger(int64(user.Started)), } s.AddRow(*env.NewTableRow(vals, s)) } return *s }, }, "load-avg?": { Argsn: 0, Doc: "Get the load average as a dict representing load average over the last 1, 5, and 15 minutes.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { v, err := load.Avg() if err != nil { return MakeBuiltinError(ps, err.Error(), "load-avg?") } r := env.NewDict(make(map[string]any, 3)) r.Data["1"] = *env.NewDecimal(v.Load1) r.Data["5"] = *env.NewDecimal(v.Load5) r.Data["15"] = *env.NewDecimal(v.Load15) return *r }, }, "virtual-memory?": { Argsn: 0, Doc: "Get information about virtual memory usage.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { v, err := mem.VirtualMemory() if err != nil { return MakeBuiltinError(ps, err.Error(), "virtual-memory?") } r := env.NewDict(make(map[string]any, 3)) r.Data["total"] = *env.NewInteger(int64(v.Total)) r.Data["free"] = *env.NewInteger(int64(v.Free)) r.Data["used-percent"] = *env.NewDecimal(v.UsedPercent) return *r }, }, "disk-usage?": { Argsn: 0, Doc: "Get disk usage information as a table.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { partitions, err := disk.Partitions(true) if err != nil { return MakeBuiltinError(ps, err.Error(), "disk-usage?") } s := env.NewTable([]string{"Filesystem", "Size", "Used", "Available", "Capacity", "iused", "ifree", "%iused", "Mounted on"}) for _, partition := range partitions { usage, err := disk.Usage(partition.Mountpoint) if err != nil { return MakeBuiltinError(ps, err.Error(), "disk-usage?") } vals := []any{ *env.NewString(partition.Device), *env.NewInteger(int64(usage.Total)), *env.NewInteger(int64(usage.Used)), *env.NewInteger(int64(usage.Free)), *env.NewDecimal(usage.UsedPercent), *env.NewInteger(int64(usage.InodesUsed)), *env.NewInteger(int64(usage.InodesFree)), *env.NewInteger(int64(usage.InodesUsedPercent)), *env.NewString(usage.Path), } s.AddRow(*env.NewTableRow(vals, s)) } return *s }, }, "pids?": { Argsn: 0, Doc: "Get process pids as a block.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { pids, err := process.Pids() if err != nil { return MakeBuiltinError(ps, err.Error(), "pids?") } pids2 := make([]env.Object, len(pids)) for i, p := range pids { pids2[i] = env.NewInteger(int64(p)) } return *env.NewBlock(*env.NewTSeries(pids2)) }, }, "processes?": { Argsn: 0, Doc: "Get information about all processes as a table.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { processes, err := process.Processes() if err != nil { return MakeBuiltinError(ps, err.Error(), "processes?") } s := proccesTableBase() for _, process := range processes { processTableAdd(s, process) } return *s }, }, "process": { Argsn: 1, Doc: "Get information about process with a given PID.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch pid := arg0.(type) { case env.Integer: process, err := process.NewProcess(int32(pid.Value)) if err != nil { return MakeBuiltinError(ps, err.Error(), "process") } s := proccesTableBase() processTableAdd(s, process) return s.Rows[0].ToDict() default: return *MakeArgError(ps, 1, []env.Type{env.IntegerType}, "process") } }, }, "lookup-address": { Argsn: 1, Doc: "Get address of an IP.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch ip := arg0.(type) { case env.String: names, err := net.LookupAddr(ip.Value) if err != nil { return MakeBuiltinError(ps, err.Error(), "ip-lookup") } items := make([]env.Object, len(names)) for i, name := range names { items[i] = *env.NewString(name) } return *env.NewBlock(*env.NewTSeries(items)) default: return *MakeArgError(ps, 1, []env.Type{env.StringType}, "ip-lookup") } }, }, "lookup-ip": { Argsn: 1, Doc: "Get IP of an address.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch ip := arg0.(type) { case env.String: names, err := net.LookupIP(ip.Value) if err != nil { return MakeBuiltinError(ps, err.Error(), "ip-lookup") } items := make([]env.Object, len(names)) for i, name := range names { items[i] = *env.NewString(name.String()) } return *env.NewBlock(*env.NewTSeries(items)) default: return *MakeArgError(ps, 1, []env.Type{env.StringType}, "ip-lookup") } }, }, "write\\clipboard": { Argsn: 1, Doc: "Writes value to OS clipboard", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.String: err := clipboard.WriteAll(val.Value) if err != nil { return MakeBuiltinError(ps, err.Error(), "write\\clipboard") } return arg0 default: return *MakeArgError(ps, 1, []env.Type{env.StringType}, "write\\clipboard") } }, }, "read\\clipboard": { Argsn: 0, Doc: "Reads value from OS clipboard", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { val, err := clipboard.ReadAll() if err != nil { return MakeBuiltinError(ps, err.Error(), "read\\clipboard") } return *env.NewString(val) }, }, }
var Builtins_pipes = map[string]*env.Builtin{ "cat": { Argsn: 1, Doc: "Creates a new pipe object from 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 path := arg0.(type) { case env.Uri: p := script.File(path.GetPath()) return *env.NewNative(ps.Idx, p, "script-pipe") default: return MakeArgError(ps, 1, []env.Type{env.UriType}, "p-new-file") } }, }, "find": { Argsn: 1, Doc: "Creates a pipe object listing all the files in the directory and its subdirectories recursively, one per line.", 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.Uri: p := script.FindFiles(path.GetPath()) return *env.NewNative(ps.Idx, p, "script-pipe") default: return MakeArgError(ps, 1, []env.Type{env.UriType}, "p-new-find-files") } }, }, "list": { Argsn: 1, Doc: "Creates a pipe object listing all the files in the directory, one per line. Accepts and URI or glob pattern.", 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.Uri: p := script.ListFiles(path.GetPath()) return *env.NewNative(ps.Idx, p, "script-pipe") case env.String: p := script.ListFiles(path.Value) return *env.NewNative(ps.Idx, p, "script-pipe") default: return MakeArgError(ps, 1, []env.Type{env.UriType}, "p-new-list-files") } }, }, "from-block": { Argsn: 1, Doc: "Creates a pipe object from a block of strings, one per line.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch block := arg0.(type) { case env.Block: strs := make([]string, len(block.Series.S)) for i, item := range block.Series.S { switch s := item.(type) { case env.String: strs[i] = s.Value default: return MakeBuiltinError(ps, "Block must contain only strings", "p-new-block") } } p := script.Slice(strs) return *env.NewNative(ps.Idx, p, "script-pipe") default: return MakeArgError(ps, 1, []env.Type{env.BlockType}, "p-new-block") } }, }, "echo": { Argsn: 1, Doc: "Creates a pipe object 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: p := script.Echo(s.Value) return *env.NewNative(ps.Idx, p, "script-pipe") default: return MakeArgError(ps, 1, []env.Type{env.StringType}, "p-new-echo") } }, }, "cat\\opt": { Argsn: 1, Doc: "Creates a pipe object from a file if it exists, otherwise returns an empty pipe object.", 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.Uri: p := script.IfExists(path.GetPath()) return *env.NewNative(ps.Idx, p, "script-pipe") default: return MakeArgError(ps, 1, []env.Type{env.UriType}, "p-new-if-exists") } }, }, "exec": { Argsn: 1, Doc: "Creates a pipe object from a command that is executed.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch cmd := arg0.(type) { case env.String: p := script.Exec(cmd.Value) return *env.NewNative(ps.Idx, p, "script-pipe") default: return MakeArgError(ps, 1, []env.Type{env.StringType}, "p-new-exec") } }, }, "exec\\in": { Argsn: 2, Doc: "Executes a command by sending it the contents of the pipe as input and returns a pipe object.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: switch cmd := arg1.(type) { case env.String: newPipe := pipe.Exec(cmd.Value) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeArgError(ps, 2, []env.Type{env.StringType}, "p-exec") } default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-exec") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-exec") } }, }, "exec\\each": { Argsn: 2, Doc: "Executes a command from a Go template for each line in the pipe and returns a pipe object with the output of each command.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: switch cmd := arg1.(type) { case env.String: newPipe := pipe.ExecForEach(cmd.Value) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeArgError(ps, 2, []env.Type{env.StringType}, "p-exec-for-each") } default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-exec-for-each") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-exec-for-each") } }, }, "into-string": { Argsn: 1, Doc: "Returns pipe contents 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 p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: str, err := pipe.String() if err != nil { return MakeBuiltinError(ps, err.Error(), "p-string") } return *env.NewString(str) default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-string") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-string") } }, }, "into-file": { Argsn: 2, Doc: "Writes pipe contents to a file and returns the number of bytes written.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: switch path := arg1.(type) { case env.Uri: i, err := pipe.WriteFile(path.GetPath()) if err != nil { return MakeBuiltinError(ps, err.Error(), "p-write-file") } return *env.NewInteger(i) default: return MakeArgError(ps, 2, []env.Type{env.UriType}, "p-write-file") } default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-write-file") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-write-file") } }, }, "out": { Argsn: 1, Doc: "Prints pipe contents to stdout and returns the number of bytes written.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: i, err := pipe.Stdout() if err != nil { return MakeBuiltinError(ps, err.Error(), "p-stdout") } return *env.NewInteger(int64(i)) default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-stdout") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-stdout") } }, }, "head": { Argsn: 2, Doc: "Returns a pipe with the first n lines from the pipe.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: switch n := arg1.(type) { case env.Integer: newPipe := pipe.First(int(n.Value)) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "p-first-n") } default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-first-n") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-first-n") } }, }, "tail": { Argsn: 2, Doc: "Returns a pipe with the last n lines from the pipe.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: switch n := arg1.(type) { case env.Integer: newPipe := pipe.Last(int(n.Value)) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "p-last-n") } default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-last-n") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-last-n") } }, }, "dirname": { Argsn: 1, Doc: "Reads paths from the pipe, one per line, and returns the directory component of each.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: newPipe := pipe.Dirname() return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-dirname") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-dirname") } }, }, "basename": { Argsn: 1, Doc: "Reads paths from the pipe, one per line, and removes any leading directory components from each.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: newPipe := pipe.Basename() return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-basename") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-basename") } }, }, "wcl": { Argsn: 1, Doc: "Returns the number of lines in a pipe.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: n, err := pipe.CountLines() if err != nil { return MakeBuiltinError(ps, err.Error(), "p-count-lines") } return *env.NewInteger(int64(n)) default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-count-lines") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-count-lines") } }, }, "freq": { Argsn: 1, Doc: "Returns a pipe object with the frequency of each line in a pipe in descending order.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: newPipe := pipe.Freq() return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-freq") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-freq") } }, }, "column": { Argsn: 2, Doc: "Returns a pipe object with the column of each line of input, where the first column is column 1, and columns are delimited by Unicode whitespace.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: switch n := arg1.(type) { case env.Integer: newPipe := pipe.Column(int(n.Value)) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "p-column") } default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-column") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-column") } }, }, "jq": { Argsn: 2, Doc: "Executes the jq command on the pipe whose contents are presumed to be JSON and returns a new pipe object with the output.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: switch jq := arg1.(type) { case env.String: newPipe := pipe.JQ(jq.Value) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeArgError(ps, 2, []env.Type{env.StringType}, "p-jq") } default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-jq") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-jq") } }, }, "match": { Argsn: 2, Doc: "Returns a pipe object with lines that match the string.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: switch s := arg1.(type) { case env.String: newPipe := pipe.Match(s.Value) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeArgError(ps, 2, []env.Type{env.StringType}, "p-match") } default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-match") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-match") } }, }, "match\\regexp": { Argsn: 2, Doc: "Returns a pipe object with lines that match the regular expression.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: switch r := arg1.(type) { case env.Native: switch regxp := r.Value.(type) { case *regexp.Regexp: newPipe := pipe.MatchRegexp(regxp) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeNativeArgError(ps, 2, []string{"regexp"}, "p-match-regexp") } default: return MakeArgError(ps, 2, []env.Type{env.NativeType}, "p-match-regexp") } default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-match-regexp") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-match-regexp") } }, }, "not-match": { Argsn: 2, Doc: "Returns a pipe object with lines that do not match the string.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: switch s := arg1.(type) { case env.String: newPipe := pipe.Reject(s.Value) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeArgError(ps, 2, []env.Type{env.StringType}, "p-not-match") } default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-not-match") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-not-match") } }, }, "not-match\\regexp": { Argsn: 2, Doc: "Returns a pipe object with lines that do not match the regular expression.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: switch r := arg1.(type) { case env.Native: switch regxp := r.Value.(type) { case *regexp.Regexp: newPipe := pipe.RejectRegexp(regxp) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeNativeArgError(ps, 2, []string{"regexp"}, "p-not-match-regexp") } default: return MakeArgError(ps, 2, []env.Type{env.NativeType}, "p-not-match-regexp") } default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-not-match-regexp") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-not-match-regexp") } }, }, "replace": { Argsn: 3, Doc: "Replaces all occurrences of a string with another string in the pipe and returns a new pipe object.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: switch search := arg1.(type) { case env.String: switch replace := arg2.(type) { case env.String: newPipe := pipe.Replace(search.Value, replace.Value) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeArgError(ps, 3, []env.Type{env.StringType}, "p-replace") } default: return MakeArgError(ps, 2, []env.Type{env.StringType}, "p-replace") } default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-replace") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-replace") } }, }, "replace\\regexp": { Argsn: 3, Doc: "Replaces all occurrences of strings that match the regexp pattern with a string in the pipe and returns a new pipe object.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: switch searchR := arg1.(type) { case env.Native: switch searchRegexp := searchR.Value.(type) { case *regexp.Regexp: switch replace := arg2.(type) { case env.String: newPipe := pipe.ReplaceRegexp(searchRegexp, replace.Value) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeArgError(ps, 3, []env.Type{env.StringType}, "p-replace-regexp") } default: return MakeNativeArgError(ps, 2, []string{"regexp"}, "p-replace-regexp") } default: return MakeArgError(ps, 2, []env.Type{env.NativeType}, "p-replace-regexp") } default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-replace-regexp") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-replace-regexp") } }, }, "into-block": { Argsn: 1, Doc: "Returns a block of strings with the contents of the pipe, one per line.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: lines, err := pipe.Slice() if err != nil { return MakeBuiltinError(ps, err.Error(), "p-block") } items := make([]env.Object, len(lines)) for i, line := range lines { items[i] = *env.NewString(line) } return *env.NewBlock(*env.NewTSeries(items)) default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-block") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-block") } }, }, "error\\opt": { Argsn: 1, Doc: "Returns the error from the pipe, if any.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: err := pipe.Error() if err != nil { return *env.NewError(err.Error()) } return env.Void{} default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-error") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-error") } }, }, "sha256sum": { Argsn: 1, Doc: "Returns the hex-encoded SHA-256 hash of the entire contents of the pipe.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: sha256, err := pipe.SHA256Sum() if err != nil { return MakeBuiltinError(ps, err.Error(), "pipes/sha256sum") } return *env.NewString(sha256) default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "pipes/sha256sum") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "pipes/sha256sum") } }, }, "sha256sums": { Argsn: 1, Doc: "Reads paths from the pipe, one per line, and produces the hex-encoded SHA-256 hash of each corresponding file, one per line.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: newPipe := pipe.SHA256Sums() return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "pipes/sha256sums") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "pipes/sha256sums") } }, }, "decodeBase64": { Argsn: 1, Doc: "decodeBase64 produces the string represented by the base64 encoded input.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: newPipe := pipe.DecodeBase64() return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "decodeBase64") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "decodeBase64") } }, }, "encodeBase64": { Argsn: 1, Doc: "encodeBase64 produces the base64 encoding of the input.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: newPipe := pipe.EncodeBase64() return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "encodeBase64") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "encodeBase64") } }, }, "join": { Argsn: 1, Doc: "joins all the lines in the pipe's contents into a single space-separated string, which will always end with a newline.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: newPipe := pipe.Join() return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-join") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-join") } }, }, "exit-status": { Argsn: 1, Doc: "Returns the integer exit status of a previous command. This will be zero unless the pipe's error status is set and the error matches the pattern.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: status := pipe.ExitStatus() return *env.NewInteger(int64(status)) default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-exit-status") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-exit-status") } }, }, "args": { Argsn: 0, Doc: "Creates a pipe containing the program's command-line arguments from os.Args, excluding the program name, one per line.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { newPipe := script.Args() return *env.NewNative(ps.Idx, newPipe, "script-pipe") }, }, "concat": { Argsn: 1, Doc: "concat reads paths from the pipe, one per line, and produces the contents of all the corresponding files in sequence. If there are any errors (for example, non-existent files), these will be ignored, execution will continue, and the pipe's error status will not be set.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: newPipe := pipe.Concat() return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-concat") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-concat") } }, }, "close": { Argsn: 1, Doc: "Closes the pipe's associated reader.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: closeErr := pipe.Close() if closeErr != nil { return *env.NewError("Error closing pipe") } return *env.NewInteger(0) default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-close") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-close") } }, }, "get": { Argsn: 2, Doc: "Get makes an HTTP GET request to url, sending the contents of the pipe as the request body, and produces the server's response.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: switch s := arg1.(type) { case env.String: newPipe := pipe.Get(s.Value) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeArgError(ps, 2, []env.Type{env.StringType}, "p-get") } default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-get") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-get") } }, }, "post": { Argsn: 2, Doc: "Post makes an HTTP POST request to url, using the contents of the pipe as the request body, and produces the server's response.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: switch s := arg1.(type) { case env.String: newPipe := pipe.Post(s.Value) return *env.NewNative(ps.Idx, newPipe, "script-pipe") default: return MakeArgError(ps, 2, []env.Type{env.StringType}, "p-post") } default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-post") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-post") } }, }, "new": { Argsn: 0, Doc: "new creates a new pipe with an empty reader.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { newPipe := script.NewPipe() return *env.NewNative(ps.Idx, newPipe, "script-pipe") }, }, "wait": { Argsn: 1, Doc: "Wait reads the pipe to completion and returns any error present on the pipe, or 0 otherwise..", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: waitErr := pipe.Wait() if waitErr != nil { return *env.NewError("Error in pipe during waiting") } return *env.NewInteger(0) default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-wait") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-wait") } }, }, "append-to-file": { Argsn: 2, Doc: "append-to-file appends the contents of the pipe to the file path, creating it if necessary, and returns the number of bytes successfully written, or an error.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: switch s := arg1.(type) { case env.String: writtenBytes, err := pipe.AppendFile(s.Value) if err != nil { return *env.NewError("Error while appending data to files.") } return *env.NewInteger(writtenBytes) case env.Uri: writtenBytes, err := pipe.AppendFile(s.Path) if err != nil { return *env.NewError("Error while appending data to rey-file.") } return *env.NewInteger(writtenBytes) default: return MakeArgError(ps, 2, []env.Type{env.StringType, env.UriType}, "p-append-to-file") } default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-append-to-file") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-append-to-file") } }, }, "stdin": { Argsn: 0, Doc: "Stdin creates a pipe that reads from os.Stdin.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { newPipe := script.Stdin() return *env.NewNative(ps.Idx, newPipe, "script-pipe") }, }, "error": { Argsn: 1, Doc: "error - returns any error present on the pipe, or 0 otherwise.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: waitErr := pipe.Error() if waitErr != nil { return *env.NewError("Error in pipe: " + waitErr.Error()) } return *env.NewInteger(0) default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-error") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-error") } }, }, "set-error": { Argsn: 2, Doc: "set-error sets the error err on the pipe and return it.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch p := arg0.(type) { case env.Native: switch pipe := p.Value.(type) { case *script.Pipe: switch errStr := arg1.(type) { case env.String: err := errors.New(errStr.Value) pipe.SetError(err) return *env.NewNative(ps.Idx, pipe, "script-pipe") default: return MakeArgError(ps, 2, []env.Type{env.StringType}, "p-set-error") } default: return MakeNativeArgError(ps, 1, []string{"script-pipe"}, "p-set-error") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "p-set-error") } }, }, }
var Builtins_psql = map[string]*env.Builtin{ "postgres-schema//open": { Argsn: 1, Doc: "Open Postgresql connection.", 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.Uri: db, err := sql.Open("postgres", str.Path) if err != nil { ps.FailureFlag = true errMsg := fmt.Sprintf("Error opening SQL: %v" + err.Error()) return MakeBuiltinError(ps, errMsg, "postgres-schema//open") } else { return *env.NewNative(ps.Idx, db, "Rye-psql") } default: ps.FailureFlag = true return MakeArgError(ps, 1, []env.Type{env.UriType}, "postgres-schema//open") } }, }, "Rye-psql//exec": { Argsn: 2, Doc: "Execute sql query in for postgresql.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { var sqlstr string var vals []any switch db1 := arg0.(type) { case env.Native: switch str := arg1.(type) { case env.Block: ser := ps.Ser ps.Ser = str.Series values := make([]any, 0, 2) _, vals = SQL_EvalBlock(ps, MODE_PSQL, values) sqlstr = ps.Res.(env.String).Value ps.Ser = ser case env.String: sqlstr = str.Value default: ps.ErrorFlag = true return MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-psql//exec") } if sqlstr != "" { db2 := db1.Value.(*sql.DB) res, err := db2.Exec(sqlstr, vals...) if err != nil { ps.FailureFlag = true return env.NewError("Error" + err.Error()) } else { num, _ := res.RowsAffected() if num > 0 { return env.NewInteger(1) } else { ps.FailureFlag = true return MakeBuiltinError(ps, "No rows affected.", "Rye-psql//exec") } } } else { return MakeBuiltinError(ps, "Sql string is empty.", "Rye-psql//exec") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-psql//exec") } }, }, "Rye-psql//query": { Argsn: 2, Doc: "Sql query to get rows data.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { var sqlstr string var vals []any switch db1 := arg0.(type) { case env.Native: switch str := arg1.(type) { case env.Block: ser := ps.Ser ps.Ser = str.Series values := make([]any, 0, 2) _, vals = SQL_EvalBlock(ps, MODE_PSQL, values) sqlstr = ps.Res.(env.String).Value ps.Ser = ser case env.String: sqlstr = str.Value default: ps.ErrorFlag = true return MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-psql//query") } if sqlstr != "" { rows, err := db1.Value.(*sql.DB).Query(sqlstr, vals...) if err != nil { ps.FailureFlag = true return MakeBuiltinError(ps, err.Error(), "Rye-psql//query") } else { cols, _ := rows.Columns() spr := env.NewTable(cols) i := 0 for rows.Next() { var sr env.TableRow columns := make([]any, len(cols)) columnPointers := make([]any, len(cols)) for i := range columns { columnPointers[i] = &columns[i] } m := make(map[string]any) for i, colName := range cols { val := columnPointers[i].(*any) m[colName] = *val sr.Values = append(sr.Values, *val) } spr.AddRow(sr) i++ } rows.Close() if i == 0 { ps.FailureFlag = true return MakeBuiltinError(ps, "No data.", "Rye-psql//query") } return *spr } } else { return MakeBuiltinError(ps, "Empty SQL.", "Rye-psql//query") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-psql//query") } }, }, }
var Builtins_regexp = map[string]*env.Builtin{ "regexp": { Argsn: 1, Doc: "Creates a Regular Expression native value.", 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: val, err := regexp.Compile(s.Value) if err != nil { return MakeError(ps, err.Error()) } return *env.NewNative(ps.Idx, val, "regexp") default: return MakeArgError(ps, 1, []env.Type{env.StringType}, "regexp") } }, }, "regexp//is-match": { Argsn: 2, Doc: "Check if string matches the given regular epression.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg1.(type) { case env.String: switch s := arg0.(type) { case env.Native: res := s.Value.(*regexp.Regexp).MatchString(val.Value) if res { return *env.NewInteger(1) } else { return *env.NewInteger(0) } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "regexp//is-match") } default: return MakeArgError(ps, 2, []env.Type{env.StringType}, "regexp//is-match") } }, }, "regexp//submatch?": { Argsn: 2, Doc: "Get the first submatch from string given the regular exprepesion.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg1.(type) { case env.String: switch s := arg0.(type) { case env.Native: res := s.Value.(*regexp.Regexp).FindStringSubmatch(val.Value) if len(res) > 1 { return *env.NewString(res[1]) } else { return MakeBuiltinError(ps, "No submatch.", "regexp//submatch?") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "regexp//submatch?") } default: return MakeArgError(ps, 2, []env.Type{env.StringType}, "regexp//submatch?") } }, }, "regexp//submatches?": { Argsn: 2, Doc: "Get all regexp submatches in a Block.", Fn: func(env1 *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg1.(type) { case env.String: switch s := arg0.(type) { case env.Native: res := s.Value.(*regexp.Regexp).FindStringSubmatch(val.Value) if len(res) > 0 { col1 := make([]env.Object, len(res)-1) for i, row := range res { if i > 0 { col1[i-1] = *env.NewString(row) } } return *env.NewBlock(*env.NewTSeries(col1)) } return MakeBuiltinError(env1, "No results", "submatches?") default: return MakeError(env1, "Arg2 not Native") } default: return MakeError(env1, "Arg1 not String") } }, }, "regexp//submatches\\all?": { Argsn: 2, Doc: "Get all regexp submatches in a Block.", Fn: func(env1 *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg1.(type) { case env.String: switch s := arg0.(type) { case env.Native: res := s.Value.(*regexp.Regexp).FindAllStringSubmatch(val.Value, -1) if len(res) > 0 { blks := make([]env.Object, len(res)) for i, mtch := range res { strs := make([]env.Object, len(mtch)-1) for j, row := range mtch { if j > 0 { strs[j-1] = *env.NewString(row) } } blks[i] = *env.NewBlock(*env.NewTSeries(strs)) } return *env.NewBlock(*env.NewTSeries(blks)) } return MakeBuiltinError(env1, "No results", "submatches?") default: return MakeError(env1, "Arg2 not Native") } default: return MakeError(env1, "Arg1 not String") } }, }, "regexp//find-all": { Argsn: 2, Doc: "Find all matches and return them in a Block", Fn: func(env1 *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg1.(type) { case env.String: switch s := arg0.(type) { case env.Native: res := s.Value.(*regexp.Regexp).FindAllString(val.Value, -1) if len(res) > 0 { col1 := make([]env.Object, len(res)) for i, row := range res { col1[i] = *env.NewString(row) } return *env.NewBlock(*env.NewTSeries(col1)) } return MakeBuiltinError(env1, "No results", "submatches?") default: return MakeError(env1, "Arg2 not Native") } default: return MakeError(env1, "Arg1 not String") } }, }, "regexp//match?": { Argsn: 2, Doc: "Get the regexp match.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg1.(type) { case env.String: switch s := arg0.(type) { case env.Native: res := s.Value.(*regexp.Regexp).FindString(val.Value) return *env.NewString(res) default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "regexp//match?") } default: return MakeArgError(ps, 2, []env.Type{env.StringType}, "regexp//match?") } }, }, "regexp//replace-all": { Argsn: 3, Doc: "Replace all mathes in a string given the regexp with another string.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch re := arg0.(type) { case env.Native: switch val := arg1.(type) { case env.String: switch replac := arg2.(type) { case env.String: res := re.Value.(*regexp.Regexp).ReplaceAllString(val.Value, replac.Value) return *env.NewString(res) default: return MakeArgError(ps, 3, []env.Type{env.StringType}, "regexp//replace-all") } default: return MakeArgError(ps, 2, []env.Type{env.StringType}, "regexp//replace-all") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "regexp//replace-all") } }, }, }
var Builtins_smtpd = map[string]*env.Builtin{ "smtp-server": { Argsn: 1, Doc: "Creates SMTP server", 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, arg0, "smtpd") }, }, "smtpd//serve": { Argsn: 4, Doc: "Serve SMTP server.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch server := arg0.(type) { case env.Native: switch handler := arg1.(type) { case env.Function: switch name := arg2.(type) { case env.String: err := smtpd.ListenAndServe(server.Value.(env.String).Value, func(origin net.Addr, from string, to []string, data []byte) error { ps.FailureFlag = false ps.ErrorFlag = false ps.ReturnFlag = false psTemp := env.ProgramState{} err := copier.Copy(&psTemp, &ps) if err != nil { fmt.Println(err.Error()) } lstTo := make([]any, len(to)) for i, v := range to { lstTo[i] = v } CallFunctionArgs4(handler, ps, *env.NewNative(ps.Idx, bytes.NewReader(data), "rye-reader"), env.NewString(from), *env.NewList(lstTo), *env.NewNative(ps.Idx, origin, "new-addr"), nil) return nil }, name.Value, "") if err != nil { return makeError(ps, err.Error()) } return arg0 default: return MakeArgError(ps, 3, []env.Type{env.StringType}, "smtpd//serve") } default: return MakeArgError(ps, 2, []env.Type{env.FunctionType}, "smtpd//serve") } default: return MakeArgError(ps, 1, []env.Type{env.StringType}, "smtpd//serve") } }, }, }
var Builtins_sqlite = map[string]*env.Builtin{ "sqlite-schema//open": { Argsn: 1, Doc: "Opening sqlite schema.", 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.Uri: db, _ := sql.Open("sqlite3", str.GetPath()) return *env.NewNative(ps.Idx, db, "Rye-sqlite") default: return MakeArgError(ps, 1, []env.Type{env.UriType}, "sqlite-schema//open") } }, }, "htmlize": { Argsn: 1, Doc: "Converting to html.", 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.Table: return *env.NewString(str.ToHtml()) default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "htmlize") } }, }, "Rye-sqlite//exec": { Argsn: 2, Doc: "Executes SQL over a database.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { var sqlstr string var vals []any switch db1 := arg0.(type) { case env.Native: switch str := arg1.(type) { case env.Block: ser := ps.Ser ps.Ser = str.Series values := make([]any, 0) _, vals = SQL_EvalBlock(ps, MODE_SQLITE, values) sqlstr = ps.Res.(env.String).Value ps.Ser = ser case env.String: sqlstr = str.Value default: return MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-sqlite//exec") } if sqlstr != "" { db2 := db1.Value.(*sql.DB) _, err := db2.Exec(sqlstr, vals...) if err != nil { return MakeBuiltinError(ps, err.Error(), "Rye-sqlite//exec") } return arg0 } else { return MakeBuiltinError(ps, "sql string not found.", "Rye-sqlite//exec") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-sqlite//exec") } }, }, "Rye-sqlite//query": { Argsn: 2, Doc: "Query a SQLite database with SQL.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { var sqlstr string var vals []any switch db1 := arg0.(type) { case env.Native: switch str := arg1.(type) { case env.Block: ser := ps.Ser ps.Ser = str.Series values := make([]any, 0) _, vals = SQL_EvalBlock(ps, MODE_SQLITE, values) sqlstr = ps.Res.(env.String).Value ps.Ser = ser case env.String: sqlstr = str.Value default: return MakeArgError(ps, 2, []env.Type{env.BlockType, env.StringType}, "Rye-sqlite//query") } if sqlstr != "" { rows, err := db1.Value.(*sql.DB).Query(sqlstr, vals...) if err != nil { return MakeBuiltinError(ps, err.Error(), "Rye-sqlite//query") } columns, _ := rows.Columns() spr := env.NewTable(columns) if err != nil { fmt.Println(err.Error()) } else { cols, _ := rows.Columns() for rows.Next() { var sr env.TableRow columns := make([]any, len(cols)) columnPointers := make([]any, len(cols)) for i := range columns { columnPointers[i] = &columns[i] } if err := rows.Scan(columnPointers...); err != nil { return env.NewError(err.Error()) } m := make(map[string]any) for i, colName := range cols { val := columnPointers[i].(*any) m[colName] = *val sr.Values = append(sr.Values, *val) } spr.AddRow(sr) } rows.Close() return *spr } return MakeBuiltinError(ps, "Empty SQL.", "Rye-sqlite//query") } else { return MakeBuiltinError(ps, "Sql string not found.", "Rye-sqlite//query") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "Rye-sqlite//query") } }, }, }
var Builtins_ssh = map[string]*env.Builtin{}
var Builtins_stackless = map[string]*env.Builtin{ "ry0": { Argsn: 1, Doc: "TODODOC", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch bloc := arg0.(type) { case env.Block: ser := ps.Ser ps.Ser = bloc.Series Stck_EvalBlock(ps) ps.Ser = ser return ps.Res default: return MakeArgError(ps, 1, []env.Type{env.BlockType}, "ry0") } }, }, "ry0-loop": { Argsn: 2, Doc: "TODODOC", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch cond := arg0.(type) { case env.Integer: switch bloc := arg1.(type) { case env.Block: ser := ps.Ser ps.Ser = bloc.Series for i := 0; int64(i) < cond.Value; i++ { ps = Stck_EvalBlock(ps) ps.Ser.Reset() } ps.Ser = ser return ps.Res default: return MakeArgError(ps, 1, []env.Type{env.BlockType}, "ry0-loop") } default: return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "ry0-loop") } }, }, }
var Builtins_structures = map[string]*env.Builtin{ "process": { Argsn: 2, Doc: "TODODOC", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { rm, err := load_structures_Dict(ps, arg1.(env.Block)) if err != nil { ps.FailureFlag = true return err } switch data := arg0.(type) { case env.Dict: return do_structures(ps, data, rm) } return nil }, }, }
var Builtins_sxml = map[string]*env.Builtin{ "rye-reader//do-sxml": { Argsn: 2, Doc: "TODODOC", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { rm, err := load_saxml_Dict(ps, arg1.(env.Block)) if err != nil { ps.FailureFlag = true return err } return do_sxml(ps, arg0.(env.Native).Value.(io.Reader), rm) }, }, "rye-sxml-start//attr?": { Argsn: 2, Doc: "TODODOC", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch obj := arg0.(type) { case env.Native: switch obj1 := obj.Value.(type) { case xml.StartElement: switch n := arg1.(type) { case env.Integer: if int(n.Value) < len(obj1.Attr) { return *env.NewString(obj1.Attr[int(n.Value)].Value) } else { return env.Void{} } default: return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "rye-sxml-start//get-attr") } default: return MakeBuiltinError(ps, "Not xml-start element.", "rye-sxml-start//get-attr") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-sxml-start//get-attr") } }, }, "rye-sxml-start//name?": { Argsn: 1, Doc: "TODODOC", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch obj := arg0.(type) { case env.Native: switch obj1 := obj.Value.(type) { case xml.StartElement: return *env.NewString(obj1.Name.Local) default: return MakeBuiltinError(ps, "Not xml-start element.", "rye-sxml-start//name?") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "rye-sxml-start//name?") } }, }, }
var Builtins_table = map[string]*env.Builtin{ "table": { Argsn: 2, Doc: "Creates a table by accepting block of column names and flat block of values", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch header1 := arg0.(type) { case env.Block: hlen := header1.Series.Len() cols, err := ColNames(ps, header1, "table") if err != nil { return err } spr := env.NewTable(cols) switch data1 := arg1.(type) { case env.Block: rdata := data1.Series.S if hlen > 0 { for i := 0; i < len(rdata)/hlen; i++ { rowd := make([]any, hlen) for ii := 0; ii < hlen; ii++ { rowd[ii] = rdata[i*hlen+ii] } spr.AddRow(*env.NewTableRow(rowd, spr)) } } return *spr case env.List: rdata := data1.Data for i := 0; i < len(rdata)/hlen; i++ { rowd := make([]any, hlen) for ii := 0; ii < hlen; ii++ { rowd[ii] = rdata[i*hlen+ii] } spr.AddRow(*env.NewTableRow(rowd, spr)) } return *spr default: return MakeArgError(ps, 2, []env.Type{env.BlockType}, "table") } default: return MakeArgError(ps, 1, []env.Type{env.BlockType}, "table") } }, }, "table\\columns": { Argsn: 2, Doc: "Creats a table by accepting a block of columns", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) (res env.Object) { return SheetFromColumns(ps, arg0, arg1) }, }, "table\\rows": { Argsn: 2, Doc: "Creates a table by accepting a block or list of rows", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) (res env.Object) { cols, err := ColNames(ps, arg0, "table\\rows ") if err != nil { return err } spr := env.NewTable(cols) switch rows := arg1.(type) { case env.Block: for _, objRow := range rows.Series.S { row, err := TableRowsFromBlockOrList(ps, spr, len(cols), objRow) if err != nil { return err } spr.AddRow(*row) } return *spr case env.List: for _, listRow := range rows.Data { row, err := TableRowsFromBlockOrList(ps, spr, len(cols), listRow) if err != nil { return err } spr.AddRow(*row) } return *spr default: return MakeArgError(ps, 2, []env.Type{env.BlockType, env.ListType}, "table\\rows") } }, }, "to-table": { Argsn: 1, Doc: "Creates a table by accepting block or list of dicts", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) (res env.Object) { switch block := arg0.(type) { case env.Block: data := block.Series if data.Len() == 0 { return MakeBuiltinError(ps, "Block is empty", "to-table") } k := make(map[string]struct{}) for _, obj := range data.S { switch dict := obj.(type) { case env.Dict: for key := range dict.Data { k[key] = struct{}{} } default: return MakeBuiltinError(ps, "Block must contain only dicts", "to-table") } } var keys []string for key := range k { keys = append(keys, key) } spr := env.NewTable(keys) for _, obj := range data.S { switch dict := obj.(type) { case env.Dict: row := make([]any, len(keys)) for i, key := range keys { data, ok := dict.Data[key] if !ok { data = env.Void{} } row[i] = data } spr.AddRow(*env.NewTableRow(row, spr)) } } return *spr case env.List: data := block.Data if len(data) == 0 { return MakeBuiltinError(ps, "List is empty", "to-table") } k := make(map[string]struct{}) for _, obj := range data { switch dict := obj.(type) { case map[string]any: for key := range dict { k[key] = struct{}{} } case env.Dict: for key := range dict.Data { k[key] = struct{}{} } default: return MakeBuiltinError(ps, "List must contain only dicts", "to-table") } } var keys []string for key := range k { keys = append(keys, key) } spr := env.NewTable(keys) for _, obj := range data { row := make([]any, len(keys)) switch dict := obj.(type) { case map[string]any: for i, key := range keys { data, ok := dict[key] if !ok { data = env.Void{} } row[i] = data } spr.AddRow(*env.NewTableRow(row, spr)) case env.Dict: row := make([]any, len(keys)) for i, key := range keys { data, ok := dict.Data[key] if !ok { data = env.Void{} } row[i] = data } spr.AddRow(*env.NewTableRow(row, spr)) } } return *spr default: return MakeArgError(ps, 1, []env.Type{env.BlockType, env.ListType}, "to-table") } }, }, "where-equal": { Argsn: 3, Doc: "Returns table of rows where specific colum is equal to given value.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch spr := arg0.(type) { case *env.Table: switch col := arg1.(type) { case env.Word: return WhereEquals(ps, *spr, ps.Idx.GetWord(col.Index), arg2) case env.String: return WhereEquals(ps, *spr, col.Value, arg2) default: return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-equal") } case env.Table: switch col := arg1.(type) { case env.Word: return WhereEquals(ps, spr, ps.Idx.GetWord(col.Index), arg2) case env.String: return WhereEquals(ps, spr, col.Value, arg2) default: return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-equal") } default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-equal") } }, }, "where-void": { Argsn: 2, Doc: "Returns table of rows where specific colum is equal to given value.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch spr := arg0.(type) { case *env.Table: switch col := arg1.(type) { case env.Word: return WhereEquals(ps, *spr, ps.Idx.GetWord(col.Index), env.NewVoid()) case env.String: return WhereEquals(ps, *spr, col.Value, env.NewVoid()) default: return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-equal") } case env.Table: switch col := arg1.(type) { case env.Word: return WhereEquals(ps, spr, ps.Idx.GetWord(col.Index), env.NewVoid()) case env.String: return WhereEquals(ps, spr, col.Value, env.NewVoid()) default: return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-equal") } default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-equal") } }, }, "where-match": { Argsn: 3, Doc: "Returns table of rows where a specific colum matches a regex.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) (res env.Object) { var spr *env.Table switch sheet := arg0.(type) { case env.Table: spr = &sheet case *env.Table: spr = sheet default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-match") } switch reNative := arg2.(type) { case env.Native: re, ok := reNative.Value.(*regexp.Regexp) if !ok { return MakeArgError(ps, 2, []env.Type{env.NativeType}, "where-match") } switch col := arg1.(type) { case env.Word: return WhereMatch(ps, spr, ps.Idx.GetWord(col.Index), re) case env.String: return WhereMatch(ps, spr, col.Value, re) default: return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-match") } default: return MakeArgError(ps, 3, []env.Type{env.NativeType}, "where-match") } }, }, "where-contains": { Argsn: 3, Doc: "Returns table of rows where specific colum contains a given string value.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) (res env.Object) { var spr *env.Table switch sheet := arg0.(type) { case env.Table: spr = &sheet case *env.Table: spr = sheet default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-match") } switch s := arg2.(type) { case env.String: switch col := arg1.(type) { case env.Word: return WhereContains(ps, spr, ps.Idx.GetWord(col.Index), s.Value, false) case env.String: return WhereContains(ps, spr, col.Value, s.Value, false) default: return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-contains") } default: return MakeArgError(ps, 3, []env.Type{env.StringType}, "where-contains") } }, }, "where-not-contains": { Argsn: 3, Doc: "Returns table of rows where specific colum contains a given string value.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) (res env.Object) { var spr *env.Table switch sheet := arg0.(type) { case env.Table: spr = &sheet case *env.Table: spr = sheet default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-match") } switch s := arg2.(type) { case env.String: switch col := arg1.(type) { case env.Word: return WhereContains(ps, spr, ps.Idx.GetWord(col.Index), s.Value, true) case env.String: return WhereContains(ps, spr, col.Value, s.Value, true) default: return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-not-contains") } default: return MakeArgError(ps, 3, []env.Type{env.StringType}, "where-not-contains") } }, }, "where-greater": { Argsn: 3, Doc: "Returns table of rows where specific colum is greater than given value.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { var spr *env.Table switch sheet := arg0.(type) { case env.Table: spr = &sheet case *env.Table: spr = sheet default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-match") } switch col := arg1.(type) { case env.Word: return WhereGreater(ps, spr, ps.Idx.GetWord(col.Index), arg2) case env.String: return WhereGreater(ps, spr, col.Value, arg2) default: return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-greater") } }, }, "where-lesser": { Argsn: 3, Doc: "Returns table of rows where specific colum is lesser than given value.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { var spr *env.Table switch sheet := arg0.(type) { case env.Table: spr = &sheet case *env.Table: spr = sheet default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-match") } switch col := arg1.(type) { case env.Word: return WhereLesser(ps, spr, ps.Idx.GetWord(col.Index), arg2) case env.String: return WhereLesser(ps, spr, col.Value, arg2) default: return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-lesser") } }, }, "where-between": { Argsn: 4, Doc: "Returns table of rows where specific colum is between given values.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) (res env.Object) { var spr *env.Table switch sheet := arg0.(type) { case env.Table: spr = &sheet case *env.Table: spr = sheet default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-match") } switch col := arg1.(type) { case env.Word: return WhereBetween(ps, spr, ps.Idx.GetWord(col.Index), arg2, arg3, false) case env.String: return WhereBetween(ps, spr, col.Value, arg2, arg3, false) default: return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-between") } }, }, "where-between\\inclusive": { Argsn: 4, Doc: "Returns table of rows where specific colum is between given values.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) (res env.Object) { var spr *env.Table switch sheet := arg0.(type) { case env.Table: spr = &sheet case *env.Table: spr = sheet default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-match") } switch col := arg1.(type) { case env.Word: return WhereBetween(ps, spr, ps.Idx.GetWord(col.Index), arg2, arg3, true) case env.String: return WhereBetween(ps, spr, col.Value, arg2, arg3, true) default: return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-between") } }, }, "where-in": { Argsn: 3, Doc: "Returns table of rows where specific colum value if found in block of values.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) (res env.Object) { switch spr := arg0.(type) { case env.Table: switch s := arg2.(type) { case env.Block: switch col := arg1.(type) { case env.Word: return WhereIn(ps, spr, ps.Idx.GetWord(col.Index), s.Series.S) case env.String: return WhereIn(ps, spr, col.Value, s.Series.S) default: return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "where-in") } default: return MakeArgError(ps, 3, []env.Type{env.StringType}, "where-in") } default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "where-in") } }, }, "add-row": { Argsn: 2, Doc: "Returns a table with new-row added to it", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch table := arg0.(type) { case env.Table: switch bloc := arg1.(type) { case env.Block: vals := make([]any, bloc.Series.Len()) for i := 0; i < bloc.Series.Len(); i++ { vals[i] = bloc.Series.Get(i) } table.AddRow(*env.NewTableRow(vals, &table)) return table } return nil } return nil }, }, "get-rows": { Argsn: 1, Doc: "Get rows as a native. This value can be used in `add-rows` and `add-rows!`", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch spr := arg0.(type) { case env.Table: rows := spr.GetRows() return *env.NewNative(ps.Idx, rows, "table-rows") default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "get-rows") } }, }, "add-rows": { Argsn: 2, Doc: "Add one or more rows to a table", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch spr := arg0.(type) { case env.Table: switch data1 := arg1.(type) { case env.Block: data := data1.Series for data.Pos() < data.Len() { rowd := make([]any, len(spr.Cols)) for ii := 0; ii < len(spr.Cols); ii++ { k1 := data.Pop() rowd[ii] = k1 } spr.AddRow(*env.NewTableRow(rowd, &spr)) } return spr case env.List: data := data1.Data for item := range data { rowd := make([]any, len(spr.Cols)) for ii := 0; ii < len(spr.Cols); ii++ { k1 := item rowd[ii] = k1 } spr.AddRow(*env.NewTableRow(rowd, &spr)) } return spr case env.Native: spr.Rows = append(spr.Rows, data1.Value.([]env.TableRow)...) return spr default: fmt.Println(data1.Inspect(*ps.Idx)) return MakeArgError(ps, 2, []env.Type{env.BlockType, env.NativeType}, "add-rows") } default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "add-rows") } }, }, "add-rows!": { Argsn: 2, Doc: "Add one or more rows to a table ref", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch spr := arg0.(type) { case *env.Table: switch data1 := arg1.(type) { case env.Block: data := data1.Series for data.Pos() < data.Len() { rowd := make([]any, len(spr.Cols)) for ii := 0; ii < len(spr.Cols); ii++ { k1 := data.Pop() rowd[ii] = k1 } spr.AddRow(*env.NewTableRow(rowd, spr)) } return spr case env.Native: spr.Rows = append(spr.Rows, data1.Value.([]env.TableRow)...) return spr default: return MakeArgError(ps, 2, []env.Type{env.BlockType, env.NativeType}, "add-rows!") } default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "add-rows!") } }, }, "update-row!": { Argsn: 3, Doc: `Update the row at the given index.`, Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch spr := arg0.(type) { case *env.Table: switch idx := arg1.(type) { case env.Integer: if idx.Value < 1 || (idx.Value-1) > int64(len(spr.Rows)) { errMsg := fmt.Sprintf("update-row! called with row index %d, but table only has %d rows", idx.Value, len(spr.Rows)) return makeError(ps, errMsg) } switch updater := arg2.(type) { case env.Function: CallFunction(updater, ps, spr.Rows[idx.Value-1], false, ps.Ctx) ret := ps.Res if ok, err, row := RyeValueToTableRow(spr, ret); ok { spr.Rows[idx.Value-1] = *row return spr } else if len(err) > 0 { return makeError(ps, err) } else { return makeError(ps, fmt.Sprintf( "Function given to update-row! should have returned a Dict or a TableRow, but returned a %s %#v instead", NameOfRyeType(ret.Type()), ret, )) } case env.Dict: row := spr.Rows[idx.Value-1] for keyStr, val := range updater.Data { index := spr.GetColumnIndex(keyStr) if index < 0 { return makeError(ps, "Column "+keyStr+" was not found") } row.Values[index] = val } return spr case env.TableRow: spr.Rows[idx.Value-1] = updater return spr default: return MakeArgError(ps, 3, []env.Type{env.FunctionType, env.DictType, env.TableRowType}, "update-row!") } default: return MakeArgError(ps, 2, []env.Type{env.IntegerType}, "update-row!") } default: return MakeNeedsThawedArgError(ps, "update-row!") } }, }, "remove-row!": { Argsn: 2, Doc: "Remove a row from a table by index", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch spr := arg0.(type) { case *env.Table: switch data1 := arg1.(type) { case env.Integer: if data1.Value > 0 && data1.Value <= int64(len(spr.Rows)) { spr.RemoveRowByIndex(data1.Value - 1) return spr } else { return makeError(ps, fmt.Sprintf("Table had less then %d rows", data1.Value)) } default: return MakeArgError(ps, 2, []env.Type{env.BlockType, env.NativeType}, "remove-row!") } default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "remove-row!") } }, }, "columns?": { Argsn: 2, Doc: "Returns table with just given columns.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch spr := arg0.(type) { case env.Table: switch col := arg1.(type) { case env.Block: cols := make([]string, col.Series.Len()) for c := range col.Series.S { switch ww := col.Series.S[c].(type) { case env.String: cols[c] = ww.Value case env.Tagword: cols[c] = ps.Idx.GetWord(ww.Index) } } return spr.Columns(ps, cols) default: return MakeArgError(ps, 1, []env.Type{env.BlockType}, "columns") } default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "columns") } }, }, "header?": { Argsn: 1, Doc: "Gets the column names (header) as block.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch spr := arg0.(type) { case *env.Table: return spr.GetColumns() case env.Table: return spr.GetColumns() default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "headers?") } }, }, "column?": { Argsn: 2, Doc: "Gets all values of a column as a block.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) (res env.Object) { switch spr := arg0.(type) { case env.Table: switch col := arg1.(type) { case env.Word: return spr.GetColumn(ps.Idx.GetWord(col.Index)) case env.String: return spr.GetColumn(col.Value) default: return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "column?") } case env.Block: switch col := arg1.(type) { case env.Integer: col1 := make([]env.Object, len(spr.Series.S)) if col.Value < 0 { return MakeBuiltinError(ps, "Index can't be negative", "column?") } for i, item_ := range spr.Series.S { switch item := item_.(type) { case env.Block: if len(item.Series.S) < int(col.Value) { return MakeBuiltinError(ps, "index out of bounds for item: "+strconv.Itoa(i), "column?") } col1[i] = item.Series.S[col.Value] } } return *env.NewBlock(*env.NewTSeries(col1)) default: return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "column?") } default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "column?") } }, }, "drop-column": { Argsn: 2, Doc: "Remove a column from a table. Returns new table", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch spr := arg0.(type) { case env.Table: switch rmCol := arg1.(type) { case env.String: return DropColumn(ps, spr, rmCol) case env.Block: return DropColumnBlock(ps, spr, rmCol) default: return MakeArgError(ps, 2, []env.Type{env.WordType, env.BlockType}, "drop-column") } } return MakeArgError(ps, 1, []env.Type{env.TableType}, "drop-column") }, }, "rename-column!": { Argsn: 3, Doc: "Remove a column from a table. Returns new table", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch spr := arg0.(type) { case *env.Table: switch oldName := arg1.(type) { case env.String: switch newName := arg2.(type) { case env.String: return RenameColumn(ps, spr, oldName, newName) default: return MakeArgError(ps, 2, []env.Type{env.WordType, env.BlockType}, "rename-column") } default: return MakeArgError(ps, 2, []env.Type{env.WordType, env.BlockType}, "rename-column") } } return MakeArgError(ps, 1, []env.Type{env.TableType}, "rename-column") }, }, "add-column": { Argsn: 4, Doc: "Adds a new column to table. Changes in-place and returns the new table.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch spr := arg0.(type) { case env.Table: switch newCol := arg1.(type) { case env.Word: switch fromCols := arg2.(type) { case env.Block: switch code := arg3.(type) { case env.Block: return GenerateColumn(ps, spr, newCol, fromCols, code) default: return MakeArgError(ps, 4, []env.Type{env.BlockType}, "add-column") } case env.Word: switch replaceBlock := arg3.(type) { case env.Block: if replaceBlock.Series.Len() != 2 { return MakeBuiltinError(ps, "Replacement block must contain a regex object and replacement string.", "add-column") } regexNative, ok := replaceBlock.Series.S[0].(env.Native) if !ok { return MakeBuiltinError(ps, "First element of replacement block must be a regex object.", "add-column") } regex, ok := regexNative.Value.(*regexp.Regexp) if !ok { return MakeBuiltinError(ps, "First element of replacement block must be a regex object.", "add-column") } replaceStr, ok := replaceBlock.Series.S[1].(env.String) if !ok { return MakeBuiltinError(ps, "Second element of replacement block must be a string.", "add-column") } err := GenerateColumnRegexReplace(ps, &spr, newCol, fromCols, regex, replaceStr.Value) if err != nil { return err } return spr default: return MakeArgError(ps, 3, []env.Type{env.BlockType}, "add-column") } default: return MakeArgError(ps, 3, []env.Type{env.BlockType}, "add-column") } default: return MakeArgError(ps, 2, []env.Type{env.WordType}, "add-column") } default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "add-column") } }, }, "order-by!": { Argsn: 3, Doc: "Sorts row by given column, changes table in place.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { dir, ok := arg2.(env.Word) if !ok { return MakeArgError(ps, 3, []env.Type{env.WordType}, "sort-by!") } var dirAsc bool if dir.Index == ps.Idx.IndexWord("asc") { dirAsc = true } else if dir.Index == ps.Idx.IndexWord("desc") { dirAsc = false } else { return MakeBuiltinError(ps, "Direction can be just asc or desc.", "sort-by!") } switch spr := arg0.(type) { case env.Table: switch col := arg1.(type) { case env.String: if dirAsc { SortByColumn(ps, &spr, col.Value) } else { SortByColumnDesc(ps, &spr, col.Value) } return spr case env.Word: if dirAsc { SortByColumn(ps, &spr, ps.Idx.GetWord(col.Index)) } else { SortByColumnDesc(ps, &spr, ps.Idx.GetWord(col.Index)) } return spr default: return MakeArgError(ps, 2, []env.Type{env.WordType}, "sort-by!") } default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "sort-by!") } }, }, "order-by": { Argsn: 3, Doc: "Sorts row by given column, changes table in place.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { dir, ok := arg2.(env.Word) if !ok { return MakeArgError(ps, 3, []env.Type{env.WordType}, "sort-by!") } var dirAsc bool if dir.Index == ps.Idx.IndexWord("asc") { dirAsc = true } else if dir.Index == ps.Idx.IndexWord("desc") { dirAsc = false } else { return MakeBuiltinError(ps, "Direction can be just asc or desc.", "sort-by!") } switch spr := arg0.(type) { case env.Table: copied := make([]env.TableRow, len(spr.Rows)) copy(copied, spr.Rows) newSpr := env.NewTable(spr.Cols) newSpr.Rows = copied switch col := arg1.(type) { case env.String: if dirAsc { SortByColumn(ps, newSpr, col.Value) } else { SortByColumnDesc(ps, newSpr, col.Value) } return *newSpr case env.Word: if dirAsc { SortByColumn(ps, newSpr, ps.Idx.GetWord(col.Index)) } else { SortByColumnDesc(ps, newSpr, ps.Idx.GetWord(col.Index)) } return *newSpr default: return MakeArgError(ps, 2, []env.Type{env.WordType}, "sort-by!") } default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "sort-by!") } }, }, "add-indexes!": { Argsn: 2, Doc: "Creates an index for all values in the provided columns. Changes in-place and returns the new table.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch spr := arg0.(type) { case env.Table: switch col := arg1.(type) { case env.Block: colWords := make([]env.Word, col.Series.Len()) for c := range col.Series.S { switch ww := col.Series.S[c].(type) { case env.Word: colWords[c] = ww default: return MakeError(ps, "Block of tagwords needed") } } err := AddIndexes(ps, &spr, colWords) if err != nil { return err } return spr default: return MakeArgError(ps, 2, []env.Type{env.BlockType}, "add-indexes!") } default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "add-indexes!") } }, }, "indexes?": { Argsn: 1, Doc: "Returns the columns that are indexed in a table.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) (res env.Object) { switch spr := arg0.(type) { case env.Table: res := make([]env.Object, 0) for col := range spr.Indexes { res = append(res, *env.NewString(col)) } return *env.NewBlock(*env.NewTSeries(res)) default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "indexes?") } }, }, "autotype": { Argsn: 2, Doc: "Takes a table and tries to determine and change the types of columns.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) (res env.Object) { switch spr := arg0.(type) { case env.Table: switch percent := arg1.(type) { case env.Decimal: return AutoType(ps, &spr, percent.Value) default: return MakeArgError(ps, 2, []env.Type{env.DecimalType}, "autotype") } default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "autotype") } }, }, "left-join": { Argsn: 4, Doc: "Left joins two tables on the given columns.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) (res env.Object) { switch spr1 := arg0.(type) { case env.Table: switch spr2 := arg1.(type) { case env.Table: switch col1 := arg2.(type) { case env.Word: col2, ok := arg3.(env.Word) if !ok { return MakeArgError(ps, 4, []env.Type{env.WordType}, "left-join") } return LeftJoin(ps, spr1, spr2, ps.Idx.GetWord(col1.Index), ps.Idx.GetWord(col2.Index), false) case env.String: col2, ok := arg3.(env.String) if !ok { MakeArgError(ps, 4, []env.Type{env.StringType}, "left-join") } return LeftJoin(ps, spr1, spr2, col1.Value, col2.Value, false) default: return MakeArgError(ps, 3, []env.Type{env.WordType, env.StringType}, "left-join") } default: return MakeArgError(ps, 2, []env.Type{env.TableType}, "left-join") } default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "left-join") } }, }, "inner-join": { Argsn: 4, Doc: "Inner joins two tables on the given columns.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) (res env.Object) { switch spr1 := arg0.(type) { case env.Table: switch spr2 := arg1.(type) { case env.Table: switch col1 := arg2.(type) { case env.Word: col2, ok := arg3.(env.Word) if !ok { return MakeArgError(ps, 4, []env.Type{env.WordType}, "inner-join") } return LeftJoin(ps, spr1, spr2, ps.Idx.GetWord(col1.Index), ps.Idx.GetWord(col2.Index), true) case env.String: col2, ok := arg3.(env.String) if !ok { MakeArgError(ps, 4, []env.Type{env.StringType}, "inner-join") } return LeftJoin(ps, spr1, spr2, col1.Value, col2.Value, true) default: return MakeArgError(ps, 3, []env.Type{env.WordType, env.StringType}, "inner-join") } default: return MakeArgError(ps, 2, []env.Type{env.TableType}, "inner-join") } default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "inner-join") } }, }, "group-by": { Argsn: 3, Doc: "Groups a table by the given column and (optional) aggregations.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) (res env.Object) { switch spr := arg0.(type) { case env.Table: switch aggBlock := arg2.(type) { case env.Block: if len(aggBlock.Series.S)%2 != 0 { return MakeBuiltinError(ps, "Aggregation block must contain pairs of column name and function for each aggregation.", "group-by") } aggregations := make(map[string][]string) for i := 0; i < len(aggBlock.Series.S); i += 2 { col := aggBlock.Series.S[i] fun, ok := aggBlock.Series.S[i+1].(env.Word) if !ok { return MakeBuiltinError(ps, "Aggregation function must be a word", "group-by") } colStr := "" switch col := col.(type) { case env.Tagword: colStr = ps.Idx.GetWord(col.Index) case env.String: colStr = col.Value default: return MakeBuiltinError(ps, "Aggregation column must be a word or string", "group-by") } funStr := ps.Idx.GetWord(fun.Index) aggregations[colStr] = append(aggregations[colStr], funStr) } switch col := arg1.(type) { case env.Word: return GroupBy(ps, spr, ps.Idx.GetWord(col.Index), aggregations) case env.String: return GroupBy(ps, spr, col.Value, aggregations) default: return MakeArgError(ps, 2, []env.Type{env.WordType, env.StringType}, "group-by") } default: return MakeArgError(ps, 3, []env.Type{env.BlockType}, "group-by") } default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "group-by") } }, }, "A1": { Argsn: 1, Doc: "Accepts a Table and returns the first row first column cell.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s0 := arg0.(type) { case env.Table: r := s0.Rows[0].Values[0] return env.ToRyeValue(r) default: ps.ErrorFlag = true return env.NewError("first arg not table") } }, }, "B1": { Argsn: 1, Doc: "Accepts a Table and returns the first row second column cell.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s0 := arg0.(type) { case env.Table: r := s0.Rows[0].Values[1] return env.ToRyeValue(r) default: ps.ErrorFlag = true return env.NewError("first arg not table") } }, }, "A2": { Argsn: 1, Doc: "Accepts a Table and returns the first row first column cell.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s0 := arg0.(type) { case env.Table: r := s0.Rows[1].Values[0] return env.ToRyeValue(r) default: ps.ErrorFlag = true return env.NewError("first arg not table") } }, }, "B2": { Argsn: 1, Doc: "Accepts a Table and returns the first row second column cell.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch s0 := arg0.(type) { case env.Table: r := s0.Rows[1].Values[1] return env.ToRyeValue(r) default: ps.ErrorFlag = true return env.NewError("first arg not table") } }, }, "load\\csv": { 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 MakeBuiltinError(ps, "Unable to read input file:"+err.Error(), "load\\csv") } defer f.Close() csvReader := csv.NewReader(f) rows, err := csvReader.ReadAll() if err != nil { return MakeBuiltinError(ps, "Unable to parse file as CSV: "+err.Error(), "load\\csv") } if len(rows) == 0 { return MakeBuiltinError(ps, "File 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 MakeArgError(ps, 1, []env.Type{env.UriType}, "load\\csv") } }, }, "load\\tsv": { 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 MakeBuiltinError(ps, "Unable to read input file:"+err.Error(), "load\\csv") } defer f.Close() csvReader := csv.NewReader(f) csvReader.Comma = '\t' rows, err := csvReader.ReadAll() if err != nil { return MakeBuiltinError(ps, "Unable to parse file as CSV: "+err.Error(), "load\\csv") } if len(rows) == 0 { return MakeBuiltinError(ps, "File 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 MakeArgError(ps, 1, []env.Type{env.UriType}, "load\\csv") } }, }, "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 spr := arg0.(type) { case env.Table: switch file := arg1.(type) { case env.Uri: f, err := os.Create(file.GetPath()) if err != nil { return MakeBuiltinError(ps, "Unable to create input file.", "save\\csv") } defer f.Close() cLen := len(spr.Cols) csvWriter := csv.NewWriter(f) err1 := csvWriter.Write(spr.Cols) if err1 != nil { return MakeBuiltinError(ps, "Unable to create write header.", "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 MakeBuiltinError(ps, "Unable to write line: "+strconv.Itoa(ir), "save\\csv") } } csvWriter.Flush() f.Close() return spr default: return MakeArgError(ps, 1, []env.Type{env.UriType}, "save\\csv") } default: return MakeArgError(ps, 1, []env.Type{env.UriType}, "save\\csv") } }, }, "save\\tsv": { 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 spr := arg0.(type) { case env.Table: switch file := arg1.(type) { case env.Uri: f, err := os.Create(file.GetPath()) if err != nil { return MakeBuiltinError(ps, "Unable to create input file.", "save\\csv") } defer f.Close() cLen := len(spr.Cols) csvWriter := csv.NewWriter(f) csvWriter.Comma = '\t' err1 := csvWriter.Write(spr.Cols) if err1 != nil { return MakeBuiltinError(ps, "Unable to create write header.", "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 MakeBuiltinError(ps, "Unable to write line: "+strconv.Itoa(ir), "save\\csv") } } csvWriter.Flush() f.Close() return spr default: return MakeArgError(ps, 1, []env.Type{env.UriType}, "save\\csv") } default: return MakeArgError(ps, 1, []env.Type{env.UriType}, "save\\csv") } }, }, "load\\xlsx": { Argsn: 1, Doc: "Loads the first sheet in an .xlsx file to a Table.", 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 MakeBuiltinError(ps, fmt.Sprintf("Unable to open file: %s", err), "load\\xlsx") } defer f.Close() sheetMap := f.GetSheetMap() if len(sheetMap) == 0 { return MakeBuiltinError(ps, "No sheets found in file", "load\\xlsx") } sheetName := sheetMap[1] rows, err := f.Rows(sheetName) if err != nil { return MakeBuiltinError(ps, fmt.Sprintf("Unable to get rows from sheet: %s", err), "load\\xlsx") } rows.Next() header, err := rows.Columns() if err != nil { return MakeBuiltinError(ps, fmt.Sprintf("Unable to get columns from sheet: %s", err), "load\\xlsx") } if len(header) == 0 { return MakeBuiltinError(ps, "Header row is empty", "load\\xlsx") } spr := env.NewTable(header) for rows.Next() { row, err := rows.Columns() if err != nil { return MakeBuiltinError(ps, fmt.Sprintf("Unable to get row: %s", err), "load\\xlsx") } anyRow := make([]any, len(row)) for i, v := range row { anyRow[i] = *env.NewString(v) } for i := len(row); i < len(spr.Cols); i++ { anyRow[i] = *env.NewString("") } spr.AddRow(*env.NewTableRow(anyRow, spr)) } return *spr default: return MakeArgError(ps, 1, []env.Type{env.UriType}, "load\\xlsx") } }, }, "save\\xlsx": { Argsn: 2, Doc: "Saves a Table to a .xlsx file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch spr := arg0.(type) { case env.Table: switch file := arg1.(type) { case env.Uri: sheetName := "Sheet1" f := excelize.NewFile() index, err := f.NewSheet(sheetName) if err != nil { return MakeBuiltinError(ps, fmt.Sprintf("Unable to create new sheet: %s", err), "save\\xlsx") } err = f.SetSheetRow(sheetName, "A1", &spr.Cols) if err != nil { return MakeBuiltinError(ps, fmt.Sprintf("Unable to set header row: %s", err), "save\\xlsx") } for i, row := range spr.Rows { rowIndex := i + 2 vals := make([]any, len(row.Values)) for j, v := range row.Values { switch val := v.(type) { case env.String: vals[j] = val.Value case string: vals[j] = val case env.Integer: vals[j] = val.Value case int64: vals[j] = val case env.Decimal: vals[j] = val.Value case float64: vals[j] = val default: return MakeBuiltinError(ps, fmt.Sprintf("Unable to save table: unsupported type %T", val), "save\\xlsx") } } err = f.SetSheetRow(sheetName, fmt.Sprintf("A%d", rowIndex), &vals) if err != nil { return MakeBuiltinError(ps, fmt.Sprintf("Unable to set row %d: %s", rowIndex, err), "save\\xlsx") } } f.SetActiveSheet(index) err = f.SaveAs(file.GetPath()) if err != nil { return MakeBuiltinError(ps, fmt.Sprintf("Unable to save table: %s", err), "save\\xlsx") } return spr default: return MakeArgError(ps, 1, []env.Type{env.UriType}, "save\\xlsx") } default: return MakeArgError(ps, 1, []env.Type{env.TableType}, "save\\xlsx") } }, }, }
var Builtins_telegrambot = map[string]*env.Builtin{ "bot": { Argsn: 1, Doc: "Create new telegram bot using API value.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch arg := arg0.(type) { case env.String: bot, err := tgm.NewBotAPI(arg.Value) if err != nil { return MakeBuiltinError(ps, "Error in NewBotAPI function.", "new-telegram-bot") } return *env.NewNative(ps.Idx, bot, "telegram-bot") default: return MakeArgError(ps, 1, []env.Type{env.StringType}, "new-telegram-bot") } }, }, "telegram-bot//on-update": { Argsn: 2, Doc: "Get telegram update and add to Rye dictionary", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch bot := arg0.(type) { case env.Native: switch code := arg1.(type) { case env.Block: u := tgm.NewUpdate(0) u.Timeout = 60 updates, _ := bot.Value.(*tgm.BotAPI).GetUpdatesChan(u) ser := ps.Ser ps.Ser = code.Series for update := range updates { dict := TelegramUpdateToRyeDict(update) ps = EvalBlockInj(ps, dict, true) if ps.ErrorFlag { return ps.Res } ps.Ser.Reset() } ps.Ser = ser return env.NewInteger(1) case env.Function: u := tgm.NewUpdate(0) u.Timeout = 60 updates, _ := bot.Value.(*tgm.BotAPI).GetUpdatesChan(u) for update := range updates { dict := TelegramUpdateToRyeDict(update) ps.FailureFlag = false ps.ErrorFlag = false ps.ReturnFlag = false psTemp := env.ProgramState{} err := copier.Copy(&psTemp, &ps) if err != nil { fmt.Println(err.Error()) } CallFunctionArgsN(code, ps, nil, dict) } return env.NewInteger(1) default: return MakeArgError(ps, 2, []env.Type{env.BlockType}, "telegram-bot//on-update") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "telegram-bot//on-update") } }, }, "telegram-message//send": { Argsn: 2, Doc: "Send message in telegram bot.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch msg := arg0.(type) { case env.Native: switch bot := arg1.(type) { case env.Native: _, err := bot.Value.(*tgm.BotAPI).Send(msg.Value.(*tgm.MessageConfig)) if err != nil { return makeError(ps, err.Error()) } return arg0 default: return MakeArgError(ps, 2, []env.Type{env.NativeType}, "telegram-message//send") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "telegram-message//send") } }, }, "telegram-message//parse-mode!": { Argsn: 2, Doc: "Set the parse mode of the message", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch msg := arg0.(type) { case env.Native: switch mode := arg1.(type) { case env.String: message, _ := msg.Value.(tgm.MessageConfig) message.ParseMode = mode.Value return msg default: return MakeArgError(ps, 2, []env.Type{env.NativeType}, "telegram-message//send") } default: return MakeArgError(ps, 1, []env.Type{env.NativeType}, "telegram-message//send") } }, }, "message": { Argsn: 2, Doc: "Create new telegram bot message.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch cid := arg0.(type) { case env.Integer: switch txt := arg1.(type) { case env.String: msg := tgm.NewMessage(cid.Value, txt.Value) msg.ParseMode = "HTML" return *env.NewNative(ps.Idx, &msg, "telegram-message") default: return MakeArgError(ps, 2, []env.Type{env.StringType}, "new-telegram-message") } default: return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "new-telegram-message") } }, }, }
var Builtins_term = map[string]*env.Builtin{ "wrap": { Argsn: 2, Doc: "Wraps string to certain width", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { text, ok := arg0.(env.String) if !ok { return MakeArgError(ps, 1, []env.Type{env.StringType}, "wrap") } wdth, ok := arg1.(env.Integer) if !ok { return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "wrap") } mkd := wrap.String(text.Value, int(wdth.Value)) return *env.NewString(mkd) }, }, "wrap\\words": { Argsn: 2, Doc: "Wraps string to certain width", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { text, ok := arg0.(env.String) if !ok { return MakeArgError(ps, 1, []env.Type{env.StringType}, "wrap\\words") } wdth, ok := arg1.(env.Integer) if !ok { return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "wrap\\words") } mkd := wordwrap.String(text.Value, int(wdth.Value)) return *env.NewString(mkd) }, }, "indent": { Argsn: 2, Doc: "Wraps string to certain width", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { text, ok := arg0.(env.String) if !ok { return MakeArgError(ps, 1, []env.Type{env.StringType}, "indent") } wdth, ok := arg1.(env.Integer) if !ok { return MakeArgError(ps, 1, []env.Type{env.IntegerType}, "indent") } mkd := indent.String(text.Value, uint(wdth.Value)) return *env.NewString(mkd) }, }, "width?": { Argsn: 0, Doc: "Get the terminal width", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { fd := int(os.Stdout.Fd()) width, _, err := goterm.GetSize(fd) if err != nil { return MakeBuiltinError(ps, err.Error(), "width?") } return env.NewInteger(int64(width)) }, }, "black": { Argsn: 0, Doc: "Take input from a user.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorBlack() return env.NewInteger(1) }, }, "red": { Argsn: 0, Doc: "Take input from a user.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorRed() return env.NewInteger(1) }, }, "blue": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorBlue() return env.NewInteger(1) }, }, "green": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorGreen() return env.NewInteger(1) }, }, "yellow": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorYellow() return env.NewInteger(1) }, }, "magenta": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorMagenta() return env.NewInteger(1) }, }, "cyan": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorBlue() return env.NewInteger(1) }, }, "white": { Argsn: 0, Doc: "Take input from a user.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorWhite() return env.NewInteger(1) }, }, "str\\black": { Argsn: 0, Doc: "Take input from a user.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return *env.NewString(term.StrColorBlack()) }, }, "str\\red": { Argsn: 0, Doc: "Take input from a user.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return *env.NewString(term.StrColorRed()) }, }, "str\\blue": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return *env.NewString(term.StrColorBlue()) }, }, "str\\green": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return *env.NewString(term.StrColorGreen()) }, }, "str\\yellow": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return *env.NewString(term.StrColorYellow()) }, }, "str\\magenta": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return *env.NewString(term.StrColorMagenta()) }, }, "str\\cyan": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return *env.NewString(term.StrColorCyan()) }, }, "str\\white": { Argsn: 0, Doc: "Take input from a user.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return *env.NewString(term.StrColorWhite()) }, }, "br-black": { Argsn: 0, Doc: "Take input from a user.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorBrBlack() return env.NewInteger(1) }, }, "str\\br-black": { Argsn: 0, Doc: "Take input from a user.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return *env.NewString(term.StrColorBrBlack()) return env.NewInteger(1) }, }, "br-red": { Argsn: 0, Doc: "Take input from a user.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorBrRed() return env.NewInteger(1) }, }, "br-blue": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorBrBlue() return env.NewInteger(1) }, }, "br-green": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorBrGreen() return env.NewInteger(1) }, }, "br-yellow": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorBrYellow() return env.NewInteger(1) }, }, "br-magenta": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorBrMagenta() return env.NewInteger(1) }, }, "br-cyan": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorBrBlue() return env.NewInteger(1) }, }, "br-white": { Argsn: 0, Doc: "Take input from a user.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorBrWhite() return env.NewInteger(1) }, }, "bg-black": { Argsn: 0, Doc: "Take input from a user.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorBgBlack() return env.NewInteger(1) }, }, "bg-red": { Argsn: 0, Doc: "Take input from a user.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorBgRed() return env.NewInteger(1) }, }, "bg-blue": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorBgBlue() return env.NewInteger(1) }, }, "bg-green": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorBgGreen() return env.NewInteger(1) }, }, "bg-yellow": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorBgYellow() return env.NewInteger(1) }, }, "bg-magenta": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorBgMagenta() return env.NewInteger(1) }, }, "bg-cyan": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorBgBlue() return env.NewInteger(1) }, }, "bg-white": { Argsn: 0, Doc: "Take input from a user.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ColorBgWhite() return env.NewInteger(1) }, }, "bold": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.Bold() return env.NewInteger(1) }, }, "underline": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.Underline() return env.NewInteger(1) }, }, "reset\\bold": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.ResetBold() return env.NewInteger(1) }, }, "reset\\all": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.CloseProps() return env.NewInteger(1) }, }, "reset": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { term.CloseProps() return env.NewInteger(1) }, }, "str\\reset": { Argsn: 0, Doc: "Open file.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return *env.NewString(term.StrCloseProps()) }, }, }
var Builtins_validation = map[string]*env.Builtin{ "validate": { Argsn: 2, Doc: "Validates Dictionary using the Validation dialect and returns result or a Failure.", Fn: func(env1 *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { return BuiValidate(env1, arg0, arg1) }, }, "validate>ctx": { Argsn: 2, Doc: "Validates Dictionary using the Validation dialect and returns result as a Context or a Failure.", Fn: func(env1 *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { obj := BuiValidate(env1, arg0, arg1) switch obj1 := obj.(type) { case env.Dict: return util.Dict2Context(env1, obj1) default: return obj1 } }, }, }
var Builtins_vector = map[string]*env.Builtin{ "vector": { Argsn: 1, Doc: "Creates vector 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.Block: data := ArrayFloat32FromSeries(s.Series) val, err := govector.AsVector(data) if err != nil { return MakeError(ps, err.Error()) } return *env.NewVector(val) default: return MakeArgError(ps, 1, []env.Type{env.BlockType}, "vector") } }, }, "normalize": { Argsn: 1, Doc: "Normalize vector.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Vector: return *env.NewDecimal(govector.Norm(val.Value, 2.0)) default: return MakeArgError(ps, 1, []env.Type{env.VectorType}, "normalize") } }, }, "std-deviation?": { Argsn: 1, Doc: "Calculate standard deviation of a vector", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch val := arg0.(type) { case env.Vector: return *env.NewDecimal(val.Value.Sd()) default: return MakeArgError(ps, 1, []env.Type{env.VectorType}, "std-deviation?") } }, }, "cosine-similarity?": { Argsn: 2, Doc: "Calculate cosine similarity.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch v1 := arg0.(type) { case env.Vector: switch v2 := arg1.(type) { case env.Vector: res, err := govector.Cosine(v1.Value, v2.Value) if err != nil { return MakeBuiltinError(ps, err.Error(), "cosine-similarity?") } return *env.NewDecimal(res) default: return MakeArgError(ps, 2, []env.Type{env.VectorType}, "cosine-similarity?") } default: return MakeArgError(ps, 1, []env.Type{env.VectorType}, "cosine-similarity?") } }, }, "correlation": { Argsn: 2, Doc: "Get correlation between two vectors", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch v1 := arg0.(type) { case env.Vector: switch v2 := arg1.(type) { case env.Vector: res, err := govector.Cor(v1.Value, v2.Value) if err != nil { return MakeError(ps, err.Error()) } return *env.NewDecimal(res) default: return MakeArgError(ps, 2, []env.Type{env.VectorType}, "correlation") } default: return MakeArgError(ps, 1, []env.Type{env.VectorType}, "correlation") } }, }, "dot-product": { Argsn: 2, Doc: "Calculate dot product between two vectors.", Fn: func(ps *env.ProgramState, arg0 env.Object, arg1 env.Object, arg2 env.Object, arg3 env.Object, arg4 env.Object) env.Object { switch v1 := arg0.(type) { case env.Vector: switch v2 := arg1.(type) { case env.Vector: res, err := govector.DotProduct(v1.Value, v2.Value) if err != nil { return MakeError(ps, err.Error()) } return *env.NewDecimal(res) default: return MakeArgError(ps, 2, []env.Type{env.VectorType}, "dot-product") } default: return MakeArgError(ps, 1, []env.Type{env.VectorType}, "dot-product") } }, }, }
var Builtins_web = map[string]*env.Builtin{}
var OutBuffer = "" // how does this work with multiple threads / ... in server use ... probably we would need some per environment variable, not global / global?
var ShowResults bool
Functions ¶
func AddIndexes ¶
func ArrayFloat32FromSeries ¶
func BsonToValue_Map ¶ added in v0.0.21
func BsonToValue_Val ¶ added in v0.0.21
func BuiConvert ¶
func BuiValidate ¶
func CallBuiltin ¶
func CallFunction ¶
func CallFunctionArgs2 ¶
func CallFunctionArgs4 ¶
func CallFunctionArgsN ¶ added in v0.0.21
func CallFunctionArgsN(fn env.Function, ps *env.ProgramState, ctx *env.RyeCtx, args ...env.Object) *env.ProgramState
func CompileRyeToEyr ¶ added in v0.0.21
func CompileStepRyeToEyr ¶ added in v0.0.21
func CompileWord ¶ added in v0.0.21
func Conversion_EvalBlockCtx ¶
func DetermineContext ¶ added in v0.0.22
func DialectMath ¶ added in v0.0.11
func DictToJSON ¶ added in v0.0.20
Inspect returns a string representation of the Integer.
func DirectlyCallBuiltin ¶
func DropColumn ¶ added in v0.0.24
func DropColumnBlock ¶ added in v0.0.24
func DropColumns ¶ added in v0.0.24
Drop one or more columns from a table, returning a new table
func EscapeJson ¶ added in v0.0.20
func EvalBlock ¶
func EvalBlock(ps *env.ProgramState) *env.ProgramState
DESCR: the most general EvalBlock
func EvalBlockInCtx ¶
func EvalBlockInCtx(ps *env.ProgramState, ctx *env.RyeCtx) *env.ProgramState
DESCR: eval a block in specific context
func EvalBlockInCtxInj ¶
func EvalBlockInCtxInj(ps *env.ProgramState, ctx *env.RyeCtx, inj env.Object, injnow bool) *env.ProgramState
DESCR: eval a block in specific context
func EvalBlockInj ¶
func EvalBlockInj(ps *env.ProgramState, inj env.Object, injnow bool) *env.ProgramState
DESCR: the main evaluator of block
func EvalBlockInjMultiDialect ¶ added in v0.0.22
func EvalBlockInjMultiDialect(ps *env.ProgramState, inj env.Object, injnow bool) *env.ProgramState
func EvalExpression2 ¶
func EvalExpression2(ps *env.ProgramState, limited bool) *env.ProgramState
this functions is used to evaluate expression in the middle of block currently it's called to collect arguments for builtins and functions
func EvalExpressionConcrete ¶
func EvalExpressionConcrete(ps *env.ProgramState) *env.ProgramState
the main part of evaluator, if it were a polish only we would need almost only this switches over all rye values and acts on them
func EvalExpressionInj ¶
func EvalExpressionInj(ps *env.ProgramState, inj env.Object, injnow bool) (*env.ProgramState, bool)
I don't fully get this function in this review ... it's this way so it handles op and pipe words mainly, but I need to get deeper again to write a proper explanation TODO -- return to this and explain
func EvalExpressionInjLimited ¶
func EvalExpressionInjLimited(ps *env.ProgramState, inj env.Object, injnow bool) (*env.ProgramState, bool)
REFATOR THIS WITH CODE ABOVE when seeing bigger picture, just adding fow eval-with
func EvalGenword ¶
func EvalGenword(ps *env.ProgramState, word env.Genword, leftVal env.Object, toLeft bool) *env.ProgramState
if word is defined to be generic ... I am not sure we will keep this ... we will decide with more use then if explicitly treats it as generic word
func EvalGetword ¶
func EvalGetword(ps *env.ProgramState, word env.Getword, leftVal env.Object, toLeft bool) *env.ProgramState
evaluates a get-word . it retrieves rye value behid it w/o evaluation
func EvalModword ¶ added in v0.0.20
func EvalModword(ps *env.ProgramState, word env.Modword) *env.ProgramState
evaluates expression to the right and sets the result of it to a word in current context
func EvalObject ¶
func EvalObject(ps *env.ProgramState, object env.Object, leftVal env.Object, toLeft bool, ctx *env.RyeCtx, pipeSecond bool, firstVal env.Object) *env.ProgramState
evaluates a rye value, most of them just get returned, except builtins, functions and context paths
func EvalSetword ¶
func EvalSetword(ps *env.ProgramState, word env.Setword) *env.ProgramState
evaluates expression to the right and sets the result of it to a word in current context
func EvalWord ¶
func EvalWord(ps *env.ProgramState, word env.Object, leftVal env.Object, toLeft bool, pipeSecond bool) *env.ProgramState
Evaluates a word first tries to find a value in normal context. If there were no generic words this would be mostly it if word is not found then it tries to get the value of next expression and find a generic word based on that, it here is leftval already present it can dispatc on it otherwise
func EvaluateLoadedValue ¶ added in v0.0.20
func Eyr_CallBuiltin ¶
func Eyr_CallBuiltin(bi env.Builtin, ps *env.ProgramState, arg0_ env.Object, toLeft bool) *env.ProgramState
func Eyr_CallBuiltinPipe ¶ added in v0.0.22
func Eyr_CallBuiltinPipe(bi env.Builtin, ps *env.ProgramState, arg0_ env.Object) *env.ProgramState
func Eyr_CallFunction ¶ added in v0.0.22
func Eyr_CallFunction(fn env.Function, es *env.ProgramState, leftVal env.Object, toLeft bool, session *env.RyeCtx) *env.ProgramState
This is separate from CallFuncitonArgsN so it can manage pulling args directly off of the eyr stack
func Eyr_EvalBlock ¶
func Eyr_EvalBlock(ps *env.ProgramState, full bool) *env.ProgramState
func Eyr_EvalBlockInside ¶ added in v0.0.22
func Eyr_EvalBlockInside(ps *env.ProgramState, inj env.Object, injnow bool) *env.ProgramState
func Eyr_EvalExpression ¶
func Eyr_EvalExpression(ps *env.ProgramState) *env.ProgramState
func Eyr_EvalLSetword ¶ added in v0.0.20
func Eyr_EvalLSetword(ps *env.ProgramState, word env.LSetword, leftVal env.Object, toLeft bool) *env.ProgramState
func Eyr_EvalObject ¶
func Eyr_EvalWord ¶
func Eyr_EvalWord(ps *env.ProgramState, word env.Object, leftVal env.Object, pipeWord bool) *env.ProgramState
func FileExists ¶ added in v0.0.23
func GenerateColumn ¶
func GenerateColumnRegexReplace ¶ added in v0.0.17
func GetNumRowsFrom ¶ added in v0.0.31
func IntersectBlocksCustom ¶ added in v0.0.34
func IntersectStringsCustom ¶ added in v0.0.34
func ListToJSON ¶ added in v0.0.20
Inspect returns a string representation of the Integer.
func LoadColumnData ¶ added in v0.0.31
func LoadScriptLocalFile ¶ added in v0.0.20
func MakeArgError ¶
func MakeArgErrorMessage ¶ added in v0.0.25
func MakeBuiltinError ¶
func MakeColError ¶ added in v0.0.31
func MakeNativeArgError ¶ added in v0.0.19
func MakeNeedsThawedArgError ¶ added in v0.0.25
func MakeNeedsThawedArgError(env1 *env.ProgramState, fn string) *env.Error
func MakeRyeError ¶
func Math_EvalBlock ¶ added in v0.0.11
func Math_EvalBlock(es *env.ProgramState) []env.Object
func MaybeAcceptComma ¶
func MaybeAcceptComma(ps *env.ProgramState, inj env.Object, injnow bool) (*env.ProgramState, bool)
comma (expression guard) can be present between block-level expressions, in case of injected block they reinject the value
func MaybeDisplayFailureOrError ¶
func MaybeDisplayFailureOrError(es *env.ProgramState, genv *env.Idxs, tag string)
func MaybeDisplayFailureOrErrorWASM ¶ added in v0.0.13
func MaybeEvalOpwordOnRight ¶
func MaybeEvalOpwordOnRight(nextObj env.Object, ps *env.ProgramState, limited bool) *env.ProgramState
this function get's the next object (unevaluated), progra state, limited bool (op or pipe) first if there is return flag it returns (not sure if this is necesarry here) TODO -- figure out if next object is opword it steps to next and evaluates the word then recurse to maybe again if next object is pipeword
on limited return (what is limited exactly ? TODO) step to next word and evaluate it again check for return flag check for failure flag and cwitch to error ... doesn't one of checkFlags do this or similar? .TODO recurse again
if next is lsetword
set the value to word and recurse
func MoveCursorBackward ¶
func MoveCursorBackward(bias int)
Move cursor backward relative the current position
func MoveCursorForward ¶
func MoveCursorForward(bias int)
Move cursor forward relative the current position
func NameOfRyeType ¶ added in v0.0.25
func PopOutBuffer ¶
func PopOutBuffer() string
func RegisterBuiltins ¶
func RegisterBuiltins(ps *env.ProgramState)
func RegisterBuiltins2 ¶
func RegisterBuiltinsInContext ¶ added in v0.0.16
func RegisterBuiltinsInSubContext ¶ added in v0.0.23
func RenameColumn ¶ added in v0.0.32
func RenameColumn(ps *env.ProgramState, s *env.Table, oldName env.String, newName env.String) env.Object
Drop one or more columns from a table, returning a new table
func RyeToJSONLines ¶ added in v0.0.20
func RyeValueToTableRow ¶ added in v0.0.33
func SQL_EvalBlock ¶ added in v0.0.21
func SQL_EvalBlock(es *env.ProgramState, mode int, values []any) (*env.ProgramState, []any)
func SQL_EvalExpression ¶ added in v0.0.21
func SQL_EvalExpression(es *env.ProgramState, vals []any, mode int) (*env.ProgramState, string, []any)
func SheetFromColumns ¶ added in v0.0.31
func SheetFromColumnsMapData ¶ added in v0.0.31
func SortByColumn ¶
func SortByColumn(ps *env.ProgramState, s *env.Table, name string)
func SortByColumnDesc ¶
func SortByColumnDesc(ps *env.ProgramState, s *env.Table, name string)
func Stck_CallBuiltin ¶
func Stck_CallBuiltin(bi env.Builtin, ps *env.ProgramState, arg0_ env.Object, toLeft bool) *env.ProgramState
func Stck_EvalBlock ¶
func Stck_EvalBlock(ps *env.ProgramState) *env.ProgramState
func Stck_EvalExpression ¶
func Stck_EvalExpression(ps *env.ProgramState) *env.ProgramState
func Stck_EvalObject ¶
func Stck_EvalWord ¶
func Stck_EvalWord(ps *env.ProgramState, word env.Object, leftVal env.Object, toLeft bool) *env.ProgramState
func TableRowToJSON ¶ added in v0.0.33
Inspect returns a string representation of the Integer.
func TableRowsFromBlockOrList ¶ added in v0.0.33
func TableToJSON ¶ added in v0.0.33
Inspect returns a string representation of the Integer.
func TableToJSONLines ¶ added in v0.0.33
func TelegramUpdateToRyeDict ¶ added in v0.0.21
func Validation_EvalBlock ¶
func VectorToJSON ¶ added in v0.0.24
func WhereBetween ¶ added in v0.0.17
func WhereContains ¶ added in v0.0.17
func WhereEquals ¶
func WhereGreater ¶
func WhereLesser ¶
Types ¶
type ConversionError ¶
type ConversionError struct {
// contains filtered or unexported fields
}
Integer represents an integer.
type HtmlDialectNode ¶ added in v0.0.21
type HtmlNavigCondition ¶ added in v0.0.21
type HtmlNavigCondition struct {}
type RyeBlockCustomSort ¶ added in v0.0.34
type RyeBlockCustomSort struct {
// contains filtered or unexported fields
}
Custom Sort object interface
func (RyeBlockCustomSort) Len ¶ added in v0.0.34
func (s RyeBlockCustomSort) Len() int
func (RyeBlockCustomSort) Less ¶ added in v0.0.34
func (s RyeBlockCustomSort) Less(i, j int) bool
func (RyeBlockCustomSort) Swap ¶ added in v0.0.34
func (s RyeBlockCustomSort) Swap(i, j int)
type RyeBlockSort ¶
Sort object interface
func (RyeBlockSort) Len ¶
func (s RyeBlockSort) Len() int
func (RyeBlockSort) Less ¶
func (s RyeBlockSort) Less(i, j int) bool
func (RyeBlockSort) Swap ¶
func (s RyeBlockSort) Swap(i, j int)
type RyeListCustomSort ¶ added in v0.0.34
type RyeListCustomSort struct {
// contains filtered or unexported fields
}
Custom Sort object interface
func (RyeListCustomSort) Len ¶ added in v0.0.34
func (s RyeListCustomSort) Len() int
func (RyeListCustomSort) Less ¶ added in v0.0.34
func (s RyeListCustomSort) Less(i, j int) bool
func (RyeListCustomSort) Swap ¶ added in v0.0.34
func (s RyeListCustomSort) Swap(i, j int)
type RyeListSort ¶
type RyeListSort []any
Sort list interface
func (RyeListSort) Len ¶
func (s RyeListSort) Len() int
func (RyeListSort) Less ¶
func (s RyeListSort) Less(i, j int) bool
func (RyeListSort) Swap ¶
func (s RyeListSort) Swap(i, j int)
type RyeStringSort ¶ added in v0.0.35
type RyeStringSort []rune
Sort list interface
func (RyeStringSort) Len ¶ added in v0.0.35
func (s RyeStringSort) Len() int
func (RyeStringSort) Less ¶ added in v0.0.35
func (s RyeStringSort) Less(i, j int) bool
func (RyeStringSort) Swap ¶ added in v0.0.35
func (s RyeStringSort) Swap(i, j int)
type ValidationError ¶
type ValidationError struct {
// contains filtered or unexported fields
}
Integer represents an integer.
Source Files
¶
- builtins.go
- builtins_bcrypt.go
- builtins_bson.go
- builtins_console.go
- builtins_conversion.go
- builtins_crypto.go
- builtins_email.go
- builtins_eyr.go
- builtins_goroutines.go
- builtins_html.go
- builtins_http.go
- builtins_io.go
- builtins_json.go
- builtins_mail.go
- builtins_math.go
- builtins_mysql.go
- builtins_os.go
- builtins_pipes.go
- builtins_psql.go
- builtins_regexp.go
- builtins_smtpd.go
- builtins_spreadsheet.go
- builtins_sqlite.go
- builtins_ssh_not.go
- builtins_stackless.go
- builtins_structures.go
- builtins_sxml.go
- builtins_telegrambot.go
- builtins_term.go
- builtins_validation.go
- builtins_vector.go
- builtins_web_not.go
- evaldo.go
- generic.go
- repl.go
- translator_eyr.go