generateDefaultConstants adds constants for default values if needed, which is only if the default value is. explicit in the proto.
(mc *msgCtx, topLevelFields []topLevelField)
| 1958 | // generateDefaultConstants adds constants for default values if needed, which is only if the default value is. |
| 1959 | // explicit in the proto. |
| 1960 | func (g *Generator) generateDefaultConstants(mc *msgCtx, topLevelFields []topLevelField) { |
| 1961 | // Collect fields that can have defaults |
| 1962 | dFields := []defField{} |
| 1963 | for _, pf := range topLevelFields { |
| 1964 | if f, ok := pf.(*oneofField); ok { |
| 1965 | for _, osf := range f.subFields { |
| 1966 | dFields = append(dFields, osf) |
| 1967 | } |
| 1968 | continue |
| 1969 | } |
| 1970 | dFields = append(dFields, pf.(defField)) |
| 1971 | } |
| 1972 | for _, df := range dFields { |
| 1973 | def := df.getProtoDef() |
| 1974 | if def == "" { |
| 1975 | continue |
| 1976 | } |
| 1977 | fieldname := g.defaultConstantName(mc.goName, df.getProtoName()) |
| 1978 | typename := df.getGoType() |
| 1979 | if typename[0] == '*' { |
| 1980 | typename = typename[1:] |
| 1981 | } |
| 1982 | kind := "const " |
| 1983 | switch { |
| 1984 | case typename == "bool": |
| 1985 | case typename == "string": |
| 1986 | def = strconv.Quote(def) |
| 1987 | case typename == "[]byte": |
| 1988 | def = "[]byte(" + strconv.Quote(unescape(def)) + ")" |
| 1989 | kind = "var " |
| 1990 | case def == "inf", def == "-inf", def == "nan": |
| 1991 | // These names are known to, and defined by, the protocol language. |
| 1992 | switch def { |
| 1993 | case "inf": |
| 1994 | def = "math.Inf(1)" |
| 1995 | case "-inf": |
| 1996 | def = "math.Inf(-1)" |
| 1997 | case "nan": |
| 1998 | def = "math.NaN()" |
| 1999 | } |
| 2000 | if df.getProtoType() == descriptor.FieldDescriptorProto_TYPE_FLOAT { |
| 2001 | def = "float32(" + def + ")" |
| 2002 | } |
| 2003 | kind = "var " |
| 2004 | case df.getProtoType() == descriptor.FieldDescriptorProto_TYPE_FLOAT: |
| 2005 | if f, err := strconv.ParseFloat(def, 32); err == nil { |
| 2006 | def = fmt.Sprint(float32(f)) |
| 2007 | } |
| 2008 | case df.getProtoType() == descriptor.FieldDescriptorProto_TYPE_DOUBLE: |
| 2009 | if f, err := strconv.ParseFloat(def, 64); err == nil { |
| 2010 | def = fmt.Sprint(f) |
| 2011 | } |
| 2012 | case df.getProtoType() == descriptor.FieldDescriptorProto_TYPE_ENUM: |
| 2013 | // Must be an enum. Need to construct the prefixed name. |
| 2014 | obj := g.ObjectNamed(df.getProtoTypeName()) |
| 2015 | var enum *EnumDescriptor |
| 2016 | if id, ok := obj.(*ImportedDescriptor); ok { |
| 2017 | // The enum type has been publicly imported. |
no test coverage detected