Add float string functions when requested

Signed-off-by: Levi Gross <levi@levigross.com>
This commit is contained in:
Levi Gross
2017-11-26 18:36:47 -05:00
parent 32fa128f23
commit 4f31de8934
4 changed files with 40 additions and 4 deletions
+4 -2
View File
@@ -48,10 +48,12 @@ var primitiveStringDecoders = map[reflect.Kind]string{
reflect.Uint32: "in.Uint32Str()",
reflect.Uint64: "in.Uint64Str()",
reflect.Uintptr: "in.UintptrStr()",
reflect.Float32: "in.Float32()Str",
reflect.Float64: "in.Float64()Str",
}
var customDecoders = map[string]string{
"json.Number": "in.JsonNumber()",
"json.Number": "in.JsonNumber()",
}
// genTypeDecoder generates decoding code for the type t, but uses unmarshaler interface if implemented by t.
@@ -88,7 +90,7 @@ func (g *Generator) genTypeDecoder(t reflect.Type, out string, tags fieldTags, i
func (g *Generator) genTypeDecoderNoCheck(t reflect.Type, out string, tags fieldTags, indent int) error {
ws := strings.Repeat(" ", indent)
// Check whether type is primitive, needs to be done after interface check.
if dec := customDecoders[t.String()]; dec != "" {
if dec := customDecoders[t.String()]; dec != "" {
fmt.Fprintln(g.out, ws+out+" = "+dec)
return nil
} else if dec := primitiveStringDecoders[t.Kind()]; dec != "" && tags.asString {
+2
View File
@@ -45,6 +45,8 @@ var primitiveStringEncoders = map[reflect.Kind]string{
reflect.Uint32: "out.Uint32Str(uint32(%v))",
reflect.Uint64: "out.Uint64Str(uint64(%v))",
reflect.Uintptr: "out.UintptrStr(uintptr(%v))",
reflect.Float32: "out.Float32Str(float32(%v))",
reflect.Float64: "out.Float64Str(float64(%v))",
}
// fieldTags contains parsed version of json struct field tags.
+32
View File
@@ -997,6 +997,22 @@ func (r *Lexer) Float32() float32 {
return float32(n)
}
func (r *Lexer) Float32Str() float32 {
s, b := r.unsafeString()
if !r.Ok() {
return 0
}
n, err := strconv.ParseFloat(s, 32)
if err != nil {
r.addNonfatalError(&LexerError{
Offset: r.start,
Reason: err.Error(),
Data: string(b),
})
}
return float32(n)
}
func (r *Lexer) Float64() float64 {
s := r.number()
if !r.Ok() {
@@ -1014,6 +1030,22 @@ func (r *Lexer) Float64() float64 {
return n
}
func (r *Lexer) Float64Str() float64 {
s, b := r.unsafeString()
if !r.Ok() {
return 0
}
n, err := strconv.ParseFloat(s, 64)
if err != nil {
r.addNonfatalError(&LexerError{
Offset: r.start,
Reason: err.Error(),
Data: string(b),
})
}
return float64(n)
}
func (r *Lexer) Error() error {
return r.fatalError
}
+2 -2
View File
@@ -38,8 +38,8 @@ type PrimitiveTypes struct {
Uint32String uint32 `json:",string"`
Uint64String uint64 `json:",string"`
Float32 float32
Float64 float64
Float32 float32 `json:", string"`
Float64 float64 `json:", string"`
Ptr *string
PtrNil *string