diff --git a/object/builtin_read.go b/object/builtin_read.go new file mode 100644 index 0000000..9386d1b --- /dev/null +++ b/object/builtin_read.go @@ -0,0 +1,26 @@ +package object + +import ( + "os" +) + +// Read ... +func Read(args ...Object) Object { + if len(args) != 1 { + return newError("wrong number of arguments. got=%d, want=1", + len(args)) + } + + arg, ok := args[0].(*String) + if !ok { + return newError("argument to `read` expected to be `str` got=%T", args[0].Type()) + } + + filename := arg.Value + data, err := os.ReadFile(filename) + if err != nil { + return newError("error reading file: %s", err) + } + + return &String{Value: string(data)} +} diff --git a/object/builtin_write.go b/object/builtin_write.go new file mode 100644 index 0000000..2e1eb6a --- /dev/null +++ b/object/builtin_write.go @@ -0,0 +1,32 @@ +package object + +import ( + "os" +) + +// Write ... +func Write(args ...Object) Object { + if len(args) != 2 { + return newError("wrong number of arguments. got=%d, want=2", + len(args)) + } + + arg, ok := args[0].(*String) + if !ok { + return newError("argument #1 to `write` expected to be `str` got=%T", args[0].Type()) + } + filename := arg.Value + + arg, ok = args[1].(*String) + if !ok { + return newError("argument #2 to `write` expected to be `str` got=%T", args[1].Type()) + } + data := []byte(arg.Value) + + err := os.WriteFile(filename, data, 0755) + if err != nil { + return newError("error writing file: %s", err) + } + + return &Null{} +} diff --git a/object/builtins.go b/object/builtins.go index da2d473..f063a66 100644 --- a/object/builtins.go +++ b/object/builtins.go @@ -27,6 +27,8 @@ var Builtins = map[string]*Builtin{ "join": {Name: "join", Fn: Join}, "split": {Name: "split", Fn: Split}, "find": {Name: "find", Fn: Find}, + "read": {Name: "read", Fn: Read}, + "write": {Name: "write", Fn: Write}, } // BuiltinsIndex ...