/
reader.go
109 lines (87 loc) · 1.97 KB
/
reader.go
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
package symbolic
import (
pprint "github.com/inoxlang/inox/internal/prettyprint"
)
var (
_ = []Readable{(*String)(nil), (*StringConcatenation)(nil)}
)
// A Readable represents a symbolic Readable.
type Readable interface {
Value
Reader() *Reader
}
// An AnyReadable represents a symbolic Readable we do not know the concrete type.
type AnyReadable struct {
_ int
}
func (r *AnyReadable) Test(v Value, state RecTestCallState) bool {
state.StartCall()
defer state.FinishCall()
switch val := v.(type) {
case Readable:
return true
default:
return extData.IsReadable(val)
}
}
func (r *AnyReadable) PrettyPrint(w pprint.PrettyPrintWriter, config *pprint.PrettyPrintConfig) {
w.WriteName("readable")
return
}
func (r *AnyReadable) Reader() *Reader {
return &Reader{}
}
func (r *AnyReadable) WidestOfType() Value {
return &AnyReadable{}
}
//
type Reader struct {
UnassignablePropsMixin
_ int
}
func (r *Reader) Test(v Value, state RecTestCallState) bool {
state.StartCall()
defer state.FinishCall()
switch v.(type) {
case *Reader:
return true
default:
return false
}
}
func (reader *Reader) ReadCtx(ctx *Context, b *ByteSlice) (*Int, *Error) {
return ANY_INT, nil
}
func (reader *Reader) ReadAll() (*ByteSlice, *Error) {
return &ByteSlice{}, nil
}
func (reader *Reader) Prop(name string) Value {
method, ok := reader.GetGoMethod(name)
if !ok {
panic(FormatErrPropertyDoesNotExist(name, reader))
}
return method
}
func (reader *Reader) GetGoMethod(name string) (*GoFunction, bool) {
switch name {
case "read":
return WrapGoMethod(reader.ReadCtx), true
case "read_all":
return WrapGoMethod(reader.ReadAll), true
}
return nil, false
}
func (reader *Reader) Reader() *Reader {
return reader
}
func (Reader) PropertyNames() []string {
return []string{"read", "read_all"}
}
func (r *Reader) PrettyPrint(w pprint.PrettyPrintWriter, config *pprint.PrettyPrintConfig) {
w.WriteName("reader")
return
}
func (r *Reader) WidestOfType() Value {
return &Reader{}
}
//