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 } }