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 }