// ------------------------------------------------------------------------ // Project atila // Active Thing (activething.com) git.activething.com/go // // File name rmap.go // Created by DEV // Modified 28/01/2024 // // Copyright 2024 activething.com // ------------------------------------------------------------------------ // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // ------------------------------------------------------------------------ package reflects import ( "activething.com/go/gogo/packs" "encoding" "reflect" "strconv" ) type ( RKeyValue struct { RKey reflect.Value RVal reflect.Value Key string } ) func NewRKeyValue(key reflect.Value, value reflect.Value, stringifyFn func(v reflect.Value) (string,error), scapeFn func(string) string) (*RKeyValue,error) { kv := &RKeyValue{ RKey : key, RVal : value, } if kv.RKey.Kind() == reflect.String { kv.Key = scapeFn(kv.RKey.String()) return kv,nil } if tm,hs := kv.RKey.Interface().(encoding.TextMarshaler); hs { if kv.RKey.Kind() == reflect.Pointer && kv.RKey.IsNil() { return nil,packs.G.ErrInvalidKey } b,e := tm.MarshalText() if e != nil { return nil,packs.G.ErrInvalidKey } kv.Key = string(b) return kv,nil } if stringifyFn != nil { b,e := stringifyFn(kv.RKey) if e != nil { return nil,packs.G.ErrInvalidKey.WithCause(e) } kv.Key = scapeFn(b) return kv,nil } switch key.Kind() { case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: kv.Key = strconv.FormatInt(kv.RKey.Int(), 10) return kv,nil case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: kv.Key= strconv.FormatUint(kv.RKey.Uint(), 10) return kv,nil } return nil,packs.G.ErrInvalidKey }