github.com/hirochachacha/plua@v0.0.0-20170217012138-c82f520cc725/object/reflect/string.go (about)

     1  package reflect
     2  
     3  import (
     4  	"reflect"
     5  
     6  	"github.com/hirochachacha/plua/internal/tables"
     7  	"github.com/hirochachacha/plua/object"
     8  	"github.com/hirochachacha/plua/object/fnutil"
     9  )
    10  
    11  func buildStringMT() {
    12  	mt := tables.NewTableSize(0, 7)
    13  
    14  	mt.Set(object.TM_METATABLE, object.True)
    15  	mt.Set(object.TM_NAME, object.String("STRING*"))
    16  	mt.Set(object.TM_TOSTRING, tostring(toString))
    17  	mt.Set(object.TM_INDEX, index(toString))
    18  
    19  	mt.Set(object.TM_EQ, cmp(func(x, y reflect.Value) bool { return x.String() == y.String() }, toString))
    20  	mt.Set(object.TM_LT, cmp(func(x, y reflect.Value) bool { return x.String() < y.String() }, toString))
    21  	mt.Set(object.TM_LE, cmp(func(x, y reflect.Value) bool { return x.String() <= y.String() }, toString))
    22  
    23  	mt.Set(object.TM_CONCAT, binary(func(x, y reflect.Value) (reflect.Value, *object.RuntimeError) {
    24  		return reflect.ValueOf(x.String() + y.String()), nil
    25  	}, toString, mt))
    26  
    27  	stringMT = mt
    28  }
    29  
    30  func toString(ap *fnutil.ArgParser, n int) (reflect.Value, *object.RuntimeError) {
    31  	val, err := toValue(ap, n, "STRING*")
    32  	if err != nil {
    33  		return reflect.Value{}, err
    34  	}
    35  	if val.Kind() != reflect.String {
    36  		return reflect.Value{}, ap.TypeError(n, "STRING*")
    37  	}
    38  	return val, nil
    39  }