func wrapDefaultValue(fd *pbmeta.FieldDescriptor, typestr string) string { v := strings.TrimSpace(fd.DefaultValue()) if v != "" { return fmt.Sprintf("(%s)%s", typestr, v) } return fmt.Sprintf("default(%s)", typestr) }
// 设置单一值 func (self *DynamicMessage) SetValue(fd *pbmeta.FieldDescriptor, value string) bool { if fd == nil || !self.Desc.Contains(fd) { log.Errorf("field not found: '%s' in '%s', value: '%s'", fd.Name(), self.Desc.Name(), value) return false } if fd.Type() == pbprotos.FieldDescriptorProto_TYPE_MESSAGE { log.Errorf("field is message not value: '%s' in '%s', value: '%s'", fd.Name(), self.Desc.Name(), value) return false } fv := self.fetchValue(fd, false) if fd.IsRepeated() { log.Errorf("field is repeated by used like non-repeated value", fd.Name()) return false } // 可选字段 if fd.IsOptional() { var existValue string if fv != nil { existValue = fv.value } // 有指派默认值 if fd.DefaultValue() != "" { existValue = fd.DefaultValue() } else { // 没有指派默认值, 取值的默认值 existValue = GetDefaultValue(fd) } // 输入值和已经存在的值一致, 就无需设置了 if existValue == value { return true } } if fv == nil { fv = self.addValue(fd) } fv.value = value return true }
func getDefaultValue(fd *pbmeta.FieldDescriptor) string { switch fd.Type() { case pbprotos.FieldDescriptorProto_TYPE_INT32: return wrapDefaultValue(fd, "int") case pbprotos.FieldDescriptorProto_TYPE_UINT32: return wrapDefaultValue(fd, "uint") case pbprotos.FieldDescriptorProto_TYPE_BOOL: return wrapDefaultValue(fd, "bool") case pbprotos.FieldDescriptorProto_TYPE_FLOAT: return wrapDefaultValue(fd, "float") case pbprotos.FieldDescriptorProto_TYPE_DOUBLE: return wrapDefaultValue(fd, "double") case pbprotos.FieldDescriptorProto_TYPE_INT64: return wrapDefaultValue(fd, "long") case pbprotos.FieldDescriptorProto_TYPE_UINT64: return wrapDefaultValue(fd, "ulong") case pbprotos.FieldDescriptorProto_TYPE_BYTES: return wrapDefaultValue(fd, "byte[]") case pbprotos.FieldDescriptorProto_TYPE_STRING: v := strings.TrimSpace(fd.DefaultValue()) if v != "" { return "@" + strconv.Quote(fd.DefaultValue()) } return strconv.Quote(fd.DefaultValue()) case pbprotos.FieldDescriptorProto_TYPE_ENUM: ed := fd.EnumDesc() if ed == nil { return fd.DefaultValue() } if ed.ValueCount() > 0 { var defaultValue string // 有defaultvalue, 直接取值, 否则取枚举第一个 if v := strings.TrimSpace(fd.DefaultValue()); v != "" { defaultValue = v } else { defaultValue = ed.Value(0).Name() } return fmt.Sprintf("%s.%s", fd.FullTypeName(), defaultValue) } case pbprotos.FieldDescriptorProto_TYPE_MESSAGE: return "null" } return "unknown" }
func GetDefaultValue(fd *pbmeta.FieldDescriptor) string { switch fd.Type() { case pbprotos.FieldDescriptorProto_TYPE_FLOAT, pbprotos.FieldDescriptorProto_TYPE_INT64, pbprotos.FieldDescriptorProto_TYPE_UINT64, pbprotos.FieldDescriptorProto_TYPE_INT32, pbprotos.FieldDescriptorProto_TYPE_UINT32: if fd.DefaultValue() != "" && fd.DefaultValue() != "0" { break } return "0" case pbprotos.FieldDescriptorProto_TYPE_BOOL: if fd.DefaultValue() != "" && fd.DefaultValue() != "false" { break } return "false" case pbprotos.FieldDescriptorProto_TYPE_STRING: if fd.DefaultValue() != "" { break } return "" case pbprotos.FieldDescriptorProto_TYPE_ENUM: ed := fd.EnumDesc() // 好奇葩 if ed.ValueCount() == 0 { return "" } evd := ed.Value(0) if fd.DefaultValue() != "" && fd.DefaultValue() != evd.Name() { break } return evd.Name() } return fd.DefaultValue() }