57 lines
1.3 KiB
Go
57 lines
1.3 KiB
Go
package typing
|
|
|
|
import (
|
|
"fmt"
|
|
"monkey/object"
|
|
)
|
|
|
|
type CheckFunc func(name string, args []object.Object) error
|
|
|
|
func Check(name string, args []object.Object, checks ...CheckFunc) error {
|
|
for _, check := range checks {
|
|
if err := check(name, args); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func ExactArgs(n int) CheckFunc {
|
|
return func(name string, args []object.Object) error {
|
|
if len(args) != n {
|
|
return fmt.Errorf("TypeError: %s() takes exactly %d argument (%d given)", name, n, len(args))
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func MinimumArgs(n int) CheckFunc {
|
|
return func(name string, args []object.Object) error {
|
|
if len(args) < n {
|
|
return fmt.Errorf("TypeError: %s() takes a minimum %d arguments (%d given)", name, n, len(args))
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func RangeOfArgs(n, m int) CheckFunc {
|
|
return func(name string, args []object.Object) error {
|
|
if len(args) < n || len(args) > m {
|
|
return fmt.Errorf("TypeError: %s() takes at least %d arguments at most %d (%d given)", name, n, m, len(args))
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
|
|
func WithTypes(types ...object.ObjectType) CheckFunc {
|
|
return func(name string, args []object.Object) error {
|
|
for i, t := range types {
|
|
if i < len(args) && args[i].Type() != t {
|
|
return fmt.Errorf("TypeError: %s() expected argument #%d to be `%s` got `%s`", name, i+1, t, args[i].Type())
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
}
|