Skip to content

Commit c2d8bed

Browse files
committed
feat: Add an output buffer, instead of outputting the expression result
1 parent 1027d94 commit c2d8bed

4 files changed

Lines changed: 26 additions & 21 deletions

File tree

internal/evaluator/evaluate.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,8 @@ func (e *Evaluator) Evaluate(currentAst ast.ExprNode) (datavalue.Value, error) {
3838
)
3939
}
4040
}
41+
42+
// Output returns the current output buffer contents.
43+
func (e *Evaluator) Output() string {
44+
return e.buf.String()
45+
}

internal/evaluator/evaluator.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
11
// Package evaluator defines logic to evaluate an AST.
22
package evaluator
33

4+
import (
5+
"strings"
6+
)
7+
48
// Evaluator defines the actual evaluator struct.
5-
type Evaluator struct{}
9+
type Evaluator struct {
10+
buf strings.Builder
11+
}
612

713
// NewEvaluator creates a new evaluator.
814
func NewEvaluator() *Evaluator {
9-
return &Evaluator{}
15+
return &Evaluator{
16+
buf: strings.Builder{},
17+
}
1018
}

main.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"log/slog"
99
"os"
1010

11-
"github.com/Dobefu/DLiteScript/internal/datavalue"
1211
"github.com/Dobefu/DLiteScript/internal/evaluator"
1312
"github.com/Dobefu/DLiteScript/internal/parser"
1413
"github.com/Dobefu/DLiteScript/internal/tokenizer"
@@ -20,7 +19,7 @@ type Main struct {
2019
onError func(error)
2120
outFile io.Writer
2221

23-
result datavalue.Value
22+
result string
2423
}
2524

2625
// Run actually runs the application.
@@ -58,22 +57,22 @@ func (m *Main) Run() {
5857
}
5958

6059
e := evaluator.NewEvaluator()
61-
result, err := e.Evaluate(ast)
60+
_, err = e.Evaluate(ast)
6261

6362
if err != nil {
6463
m.onError(err)
6564

6665
return
6766
}
6867

69-
m.result = result
68+
m.result = e.Output()
7069

7170
// If the output file is io.Discard, we don't need to format the result.
7271
if m.outFile == io.Discard {
7372
return
7473
}
7574

76-
_, err = fmt.Fprintln(m.outFile, m.result.ToString())
75+
_, err = fmt.Fprint(m.outFile, m.result)
7776

7877
if err != nil {
7978
m.onError(err)
@@ -90,6 +89,6 @@ func main() {
9089
os.Exit(1)
9190
},
9291

93-
result: datavalue.Null(),
92+
result: "",
9493
}).Run()
9594
}

main_test.go

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"path/filepath"
99
"testing"
1010

11-
"github.com/Dobefu/DLiteScript/internal/datavalue"
1211
"github.com/Dobefu/DLiteScript/internal/errorutil"
1312
)
1413

@@ -70,19 +69,13 @@ func TestMainRun(t *testing.T) {
7069
t.Errorf("expected no error, got '%s'", err.Error())
7170
},
7271

73-
result: datavalue.Null(),
72+
result: "",
7473
}
7574

7675
main.Run()
7776

78-
result, err := main.result.AsNumber()
79-
80-
if err != nil {
81-
t.Fatalf("expected numeric result, got type error: %v", err)
82-
}
83-
84-
if result != test.expected {
85-
t.Errorf("expected '%f', got '%f'", test.expected, result)
77+
if main.result != "" {
78+
t.Errorf("expected empty output, got '%s'", main.result)
8679
}
8780
}
8881
}
@@ -135,7 +128,7 @@ func TestMainErr(t *testing.T) {
135128
}
136129
},
137130

138-
result: datavalue.Null(),
131+
result: "",
139132
}
140133

141134
main.Run()
@@ -174,7 +167,7 @@ func TestMainWriteError(t *testing.T) {
174167
mainErr = err
175168
}
176169
},
177-
result: datavalue.Null(),
170+
result: "",
178171
}
179172

180173
main.Run()
@@ -194,7 +187,7 @@ func BenchmarkMain(b *testing.B) {
194187
onError: func(err error) {
195188
b.Errorf("expected no error, got '%s'", err.Error())
196189
},
197-
result: datavalue.Null(),
190+
result: "",
198191
}
199192

200193
main.Run()

0 commit comments

Comments
 (0)