f5/metautils.go
aozhiwei 9f7943ca94 1
2020-09-01 23:27:05 +08:00

103 lines
2.6 KiB
Go

package f5
import (
"q5"
"os"
"bufio"
"reflect"
"fmt"
"github.com/golang/protobuf/proto"
"github.com/golang/protobuf/jsonpb"
"google.golang.org/protobuf/reflect/protoreflect"
"google.golang.org/protobuf/reflect/protoregistry"
)
func ReadCsvMetaFile(fileName string, list interface{}) {
msgType := reflect.TypeOf(list).Elem().Elem().Elem()
csvReader := &q5.CsvReader{}
csvReader.Load(fileName)
for csvReader.NextLine() {
msg := reflect.New(msgType)
msgPb := msg.Interface().(proto.Message)
msgReflect := proto.MessageReflect(msgPb)
msgDesc := msgReflect.Descriptor()
fields := msgDesc.Fields()
for i := 0; i < fields.Len(); i++ {
field := fields.Get(i)
value := csvReader.GetValue(string(field.Name()))
xvalueToPBSampleField(value, field, msgReflect)
}
newList := reflect.Append(reflect.ValueOf(list), msg)
reflect.ValueOf(list).Elem().Set(newList)
}
}
func ReadJsonMetaFile(fileName string, list interface{}) {
msgType := reflect.TypeOf(list).Elem().Elem().Elem()
msg := reflect.New(msgType)
msgPb := msg.Interface().(proto.Message)
msgReflect := proto.MessageReflect(msgPb)
msgDesc := msgReflect.Descriptor()
meta, _ := protoregistry.GlobalTypes.FindMessageByName(msgDesc.FullName() + "Metas")
metaList := meta.New()
f, _ := os.Open(fileName)
data, _ := bufio.NewReader(f).ReadString(0)
data = "{\"values\":" + data
data += "}"
err := jsonpb.Unmarshal(f, proto.MessageV1(metaList))
if err == nil {
fmt.Println("json decode ok", data)
}
/* msgReflect = proto.MessageReflect(proto.MessageV1(metaList))
msgDesc = msgReflect.Descriptor()
valuesField := msgDesc.Fields().ByName("values")
values := msgReflect.Get(valuesField)
reflect.ValueOf(list).Elem().Set(reflect.ValueOf(values.List()))
_ = valuesField
fmt.Println(valuesField, values)*/
}
func xvalueToPBSampleField(
value *q5.XValue,
field protoreflect.FieldDescriptor,
msgReflect protoreflect.Message) {
switch field.Kind() {
case protoreflect.BoolKind:
msgReflect.Set(field, protoreflect.ValueOfBool(value.GetInt64() != 0))
break
case protoreflect.EnumKind:
break
case
protoreflect.Int32Kind, protoreflect.Sint32Kind,
protoreflect.Sfixed32Kind, protoreflect.Fixed32Kind:
break
case protoreflect.Uint32Kind:
break
case
protoreflect.Int64Kind, protoreflect.Sint64Kind,
protoreflect.Sfixed64Kind, protoreflect.Fixed64Kind:
break
case protoreflect.Uint64Kind:
break
case protoreflect.FloatKind:
break
case protoreflect.DoubleKind:
break
case protoreflect.StringKind:
break
case protoreflect.BytesKind:
break
case protoreflect.MessageKind:
break
case protoreflect.GroupKind:
break
}
}