Skip to content

Commit 9abd50f

Browse files
committed
add type casting helpers
1 parent 2e55c0c commit 9abd50f

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

evaluator/type.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package evaluator
2+
3+
import (
4+
"strconv"
5+
6+
"github.com/NuruProgramming/Nuru/object"
7+
)
8+
9+
func convertToInteger(obj object.Object) object.Object {
10+
switch obj := obj.(type) {
11+
case *object.Integer:
12+
return obj
13+
case *object.Float:
14+
return &object.Integer{Value: int64(obj.Value)}
15+
case *object.String:
16+
i, err := strconv.ParseInt(obj.Value, 10, 64)
17+
if err != nil {
18+
return newError("Haiwezi kubadilisha '%s' kuwa NAMBA", obj.Value)
19+
}
20+
return &object.Integer{Value: i}
21+
case *object.Boolean:
22+
if obj.Value {
23+
return &object.Integer{Value: 1}
24+
}
25+
return &object.Integer{Value: 0}
26+
default:
27+
return newError("Haiwezi kubadilisha %s kuwa NAMBA", obj.Type())
28+
}
29+
}
30+
31+
func convertToFloat(obj object.Object) object.Object {
32+
switch obj := obj.(type) {
33+
case *object.Float:
34+
return obj
35+
case *object.Integer:
36+
return &object.Float{Value: float64(obj.Value)}
37+
case *object.String:
38+
f, err := strconv.ParseFloat(obj.Value, 64)
39+
if err != nil {
40+
return newError("Haiwezi kubadilisha '%s' kuwa DESIMALI", obj.Value)
41+
}
42+
return &object.Float{Value: f}
43+
case *object.Boolean:
44+
if obj.Value {
45+
return &object.Float{Value: 1.0}
46+
}
47+
return &object.Float{Value: 0.0}
48+
default:
49+
return newError("Haiwezi kubadilisha %s kuwa DESIMALI", obj.Type())
50+
}
51+
}
52+
53+
func convertToString(obj object.Object) object.Object {
54+
return &object.String{Value: obj.Inspect()}
55+
}
56+
57+
func convertToBoolean(obj object.Object) object.Object {
58+
switch obj := obj.(type) {
59+
case *object.Boolean:
60+
return obj
61+
case *object.Integer:
62+
return &object.Boolean{Value: obj.Value != 0}
63+
case *object.Float:
64+
return &object.Boolean{Value: obj.Value != 0}
65+
case *object.String:
66+
return &object.Boolean{Value: len(obj.Value) > 0}
67+
case *object.Null:
68+
return &object.Boolean{Value: false}
69+
default:
70+
return &object.Boolean{Value: true}
71+
}
72+
}

0 commit comments

Comments
 (0)