Skip to content

Commit 827267b

Browse files
authored
Merge pull request #148 from Flipez/string-format-array-hash-support
String format array hash support
2 parents db13aa7 + e3141f5 commit 827267b

5 files changed

Lines changed: 81 additions & 17 deletions

File tree

go.mod

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,10 @@ require (
77
github.com/spf13/pflag v1.0.5
88
)
99

10-
require golang.org/x/sys v0.0.0-20220818161305-2296e01440c6 // indirect
10+
require (
11+
github.com/davecgh/go-spew v1.1.1 // indirect
12+
github.com/pmezard/go-difflib v1.0.0 // indirect
13+
github.com/stretchr/testify v1.8.1 // indirect
14+
golang.org/x/sys v0.0.0-20220818161305-2296e01440c6 // indirect
15+
gopkg.in/yaml.v3 v3.0.1 // indirect
16+
)

go.sum

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,24 @@ github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI
44
github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk=
55
github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04=
66
github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8=
7+
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
8+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
9+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
10+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
11+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
712
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
813
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
14+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
15+
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
16+
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
17+
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
18+
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
19+
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
20+
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
921
golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
1022
golang.org/x/sys v0.0.0-20220818161305-2296e01440c6 h1:Sx/u41w+OwrInGdEckYmEuU5gHoGSL4QbDz3S9s6j4U=
1123
golang.org/x/sys v0.0.0-20220818161305-2296e01440c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
24+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
25+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
26+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
27+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

object/object.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,3 +429,32 @@ func AnyToObject(a any) Object {
429429
}
430430
return NIL
431431
}
432+
433+
func ObjectToAny(o Object) any {
434+
switch v := o.(type) {
435+
case *Boolean:
436+
return v.Value
437+
case *String:
438+
return v.Value
439+
case *Integer:
440+
return v.Value
441+
case *Float:
442+
return v.Value
443+
case *Array:
444+
array := make([]any, len(v.Elements))
445+
for idx, element := range v.Elements {
446+
array[idx] = ObjectToAny(element)
447+
}
448+
return array
449+
case *Hash:
450+
hash := make(map[any]any)
451+
for _, pair := range v.Pairs {
452+
key := ObjectToAny(pair.Key)
453+
if key != nil {
454+
hash[key] = ObjectToAny(pair.Value)
455+
}
456+
}
457+
return hash
458+
}
459+
return nil
460+
}

object/object_test.go

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ package object_test
22

33
import (
44
"errors"
5+
"testing"
6+
7+
"github.com/stretchr/testify/require"
58

69
"github.com/flipez/rocket-lang/evaluator"
710
"github.com/flipez/rocket-lang/lexer"
811
"github.com/flipez/rocket-lang/object"
912
"github.com/flipez/rocket-lang/parser"
10-
11-
"testing"
1213
)
1314

1415
type inputTestCase struct {
@@ -149,3 +150,25 @@ func TestAnyToObject(t *testing.T) {
149150
}
150151
}
151152
}
153+
154+
func TestObjectToAny(t *testing.T) {
155+
stringObj := object.NewString("a")
156+
intObj := object.NewInteger(1)
157+
floatObj := object.NewFloat(1.2)
158+
testcases := map[object.Object]any{
159+
stringObj: "a",
160+
intObj: int64(1),
161+
floatObj: float64(1.2),
162+
object.TRUE: true,
163+
object.NewArrayWithObjects(stringObj, intObj, floatObj): []any{"a", int64(1), float64(1.2)},
164+
object.NIL: nil,
165+
}
166+
167+
hash := object.NewHash(nil)
168+
hash.Set("a", int64(1))
169+
testcases[hash] = map[any]any{"a": int64(1)}
170+
171+
for input, expected := range testcases {
172+
require.Equal(t, expected, object.ObjectToAny(input))
173+
}
174+
}

object/string.go

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -71,28 +71,18 @@ func init() {
7171
🚀 » "test%s".format("test")
7272
» "testtest"`,
7373
ArgPattern: Args(
74-
OverloadArg(STRING_OBJ, INTEGER_OBJ, FLOAT_OBJ, BOOLEAN_OBJ),
74+
OverloadArg(STRING_OBJ, INTEGER_OBJ, FLOAT_OBJ, BOOLEAN_OBJ, ARRAY_OBJ, HASH_OBJ),
7575
),
7676
ReturnPattern: Args(
7777
Arg(STRING_OBJ),
7878
),
7979
},
8080
method: func(o Object, args []Object, _ Environment) Object {
8181
s := o.(*String)
82-
nativeObjects := []interface{}{}
83-
for _, arg := range args {
84-
switch e := arg.(type) {
85-
case *String:
86-
nativeObjects = append(nativeObjects, e.Value)
87-
case *Integer:
88-
nativeObjects = append(nativeObjects, e.Value)
89-
case *Float:
90-
nativeObjects = append(nativeObjects, e.Value)
91-
case *Boolean:
92-
nativeObjects = append(nativeObjects, e.Value)
93-
}
82+
nativeObjects := make([]any, len(args))
83+
for idx, arg := range args {
84+
nativeObjects[idx] = ObjectToAny(arg)
9485
}
95-
9686
return NewString(fmt.Sprintf(s.Value, nativeObjects...))
9787
},
9888
},

0 commit comments

Comments
 (0)