1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
package stdlib
import (
"os"
"github.com/d5/tengo/v2"
)
func makeOSFile(file *os.File) *tengo.ImmutableMap {
return &tengo.ImmutableMap{
Value: map[string]tengo.Object{
// chdir() => true/error
"chdir": &tengo.UserFunction{
Name: "chdir",
Value: FuncARE(file.Chdir),
}, //
// chown(uid int, gid int) => true/error
"chown": &tengo.UserFunction{
Name: "chown",
Value: FuncAIIRE(file.Chown),
}, //
// close() => error
"close": &tengo.UserFunction{
Name: "close",
Value: FuncARE(file.Close),
}, //
// name() => string
"name": &tengo.UserFunction{
Name: "name",
Value: FuncARS(file.Name),
}, //
// readdirnames(n int) => array(string)/error
"readdirnames": &tengo.UserFunction{
Name: "readdirnames",
Value: FuncAIRSsE(file.Readdirnames),
}, //
// sync() => error
"sync": &tengo.UserFunction{
Name: "sync",
Value: FuncARE(file.Sync),
}, //
// write(bytes) => int/error
"write": &tengo.UserFunction{
Name: "write",
Value: FuncAYRIE(file.Write),
}, //
// write(string) => int/error
"write_string": &tengo.UserFunction{
Name: "write_string",
Value: FuncASRIE(file.WriteString),
}, //
// read(bytes) => int/error
"read": &tengo.UserFunction{
Name: "read",
Value: FuncAYRIE(file.Read),
}, //
// chmod(mode int) => error
"chmod": &tengo.UserFunction{
Name: "chmod",
Value: func(args ...tengo.Object) (tengo.Object, error) {
if len(args) != 1 {
return nil, tengo.ErrWrongNumArguments
}
i1, ok := tengo.ToInt64(args[0])
if !ok {
return nil, tengo.ErrInvalidArgumentType{
Name: "first",
Expected: "int(compatible)",
Found: args[0].TypeName(),
}
}
return wrapError(file.Chmod(os.FileMode(i1))), nil
},
},
// seek(offset int, whence int) => int/error
"seek": &tengo.UserFunction{
Name: "seek",
Value: func(args ...tengo.Object) (tengo.Object, error) {
if len(args) != 2 {
return nil, tengo.ErrWrongNumArguments
}
i1, ok := tengo.ToInt64(args[0])
if !ok {
return nil, tengo.ErrInvalidArgumentType{
Name: "first",
Expected: "int(compatible)",
Found: args[0].TypeName(),
}
}
i2, ok := tengo.ToInt(args[1])
if !ok {
return nil, tengo.ErrInvalidArgumentType{
Name: "second",
Expected: "int(compatible)",
Found: args[1].TypeName(),
}
}
res, err := file.Seek(i1, i2)
if err != nil {
return wrapError(err), nil
}
return &tengo.Int{Value: res}, nil
},
},
// stat() => imap(fileinfo)/error
"stat": &tengo.UserFunction{
Name: "stat",
Value: func(args ...tengo.Object) (tengo.Object, error) {
if len(args) != 0 {
return nil, tengo.ErrWrongNumArguments
}
return osStat(&tengo.String{Value: file.Name()})
},
},
},
}
}
|