Exemplo n.º 1
0
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)
}
Exemplo n.º 2
0
Arquivo: msg.go Projeto: davyxu/tabtoy
// 设置单一值
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
}
Exemplo n.º 3
0
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"
}
Exemplo n.º 4
0
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()
}