github.com/dfcfw/lua@v0.0.0-20230325031207-0cc7ffb7b8b9/luar/map.go (about)

     1  package luar
     2  
     3  import (
     4  	"reflect"
     5  
     6  	"github.com/dfcfw/lua"
     7  )
     8  
     9  func mapIndex(L *lua.LState) int {
    10  	ref, mt := check(L, 1)
    11  	key := L.CheckAny(2)
    12  
    13  	convertedKey, err := lValueToReflect(L, key, ref.Type().Key(), nil)
    14  	if err == nil {
    15  		item := ref.MapIndex(convertedKey)
    16  		if item.IsValid() {
    17  			L.Push(New(L, item.Interface()))
    18  			return 1
    19  		}
    20  	}
    21  
    22  	if lstring, ok := key.(lua.LString); ok {
    23  		if fn := mt.method(string(lstring)); fn != nil {
    24  			L.Push(fn)
    25  			return 1
    26  		}
    27  	}
    28  
    29  	return 0
    30  }
    31  func mapNewIndex(L *lua.LState) int {
    32  	ref, _ := check(L, 1)
    33  	key := L.CheckAny(2)
    34  	value := L.CheckAny(3)
    35  
    36  	keyHint := ref.Type().Key()
    37  	convertedKey, err := lValueToReflect(L, key, keyHint, nil)
    38  	if err != nil {
    39  		L.ArgError(2, err.Error())
    40  	}
    41  	var convertedValue reflect.Value
    42  	if value != lua.LNil {
    43  		convertedValue, err = lValueToReflect(L, value, ref.Type().Elem(), nil)
    44  		if err != nil {
    45  			L.ArgError(3, err.Error())
    46  		}
    47  	}
    48  	ref.SetMapIndex(convertedKey, convertedValue)
    49  	return 0
    50  }
    51  func mapLen(L *lua.LState) int {
    52  	ref, _ := check(L, 1)
    53  
    54  	L.Push(lua.LNumber(ref.Len()))
    55  	return 1
    56  }