mirror of
https://github.com/goccy/go-yaml.git
synced 2025-12-08 06:09:57 +00:00
Add AutoInt option (#671)
This commit is contained in:
parent
abc70836f5
commit
944206aba5
3 changed files with 61 additions and 0 deletions
|
|
@ -38,6 +38,7 @@ type Encoder struct {
|
|||
anchorNameMap map[string]struct{}
|
||||
anchorCallback func(*ast.AnchorNode, interface{}) error
|
||||
customMarshalerMap map[reflect.Type]func(interface{}) ([]byte, error)
|
||||
autoInt bool
|
||||
useLiteralStyleIfMultiline bool
|
||||
commentMap map[*Path][]*Comment
|
||||
written bool
|
||||
|
|
@ -547,6 +548,9 @@ func (e *Encoder) encodeFloat(v float64, bitSize int) ast.Node {
|
|||
}
|
||||
value := strconv.FormatFloat(v, 'g', -1, bitSize)
|
||||
if !strings.Contains(value, ".") && !strings.Contains(value, "e") {
|
||||
if e.autoInt {
|
||||
return ast.Integer(token.New(value, value, e.pos(e.column)))
|
||||
}
|
||||
// append x.0 suffix to keep float value context
|
||||
value = fmt.Sprintf("%s.0", value)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1283,6 +1283,54 @@ func TestEncoder_CustomMarshaler(t *testing.T) {
|
|||
})
|
||||
}
|
||||
|
||||
func TestEncoder_AutoInt(t *testing.T) {
|
||||
for _, test := range []struct {
|
||||
desc string
|
||||
input any
|
||||
expected string
|
||||
}{
|
||||
{
|
||||
desc: "int-convertible float64",
|
||||
input: map[string]float64{
|
||||
"key": 1.0,
|
||||
},
|
||||
expected: "key: 1\n",
|
||||
},
|
||||
{
|
||||
desc: "non int-convertible float64",
|
||||
input: map[string]float64{
|
||||
"key": 1.1,
|
||||
},
|
||||
expected: "key: 1.1\n",
|
||||
},
|
||||
{
|
||||
desc: "int-convertible float32",
|
||||
input: map[string]float32{
|
||||
"key": 1.0,
|
||||
},
|
||||
expected: "key: 1\n",
|
||||
},
|
||||
{
|
||||
desc: "non int-convertible float32",
|
||||
input: map[string]float32{
|
||||
"key": 1.1,
|
||||
},
|
||||
expected: "key: 1.1\n",
|
||||
},
|
||||
} {
|
||||
t.Run(test.desc, func(t *testing.T) {
|
||||
var buf bytes.Buffer
|
||||
enc := yaml.NewEncoder(&buf, yaml.AutoInt())
|
||||
if err := enc.Encode(test.input); err != nil {
|
||||
t.Fatalf("failed to encode: %s", err)
|
||||
}
|
||||
if actual := buf.String(); actual != test.expected {
|
||||
t.Errorf("expect:\n%s\nactual\n%s\n", test.expected, actual)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestEncoder_MultipleDocuments(t *testing.T) {
|
||||
var buf bytes.Buffer
|
||||
enc := yaml.NewEncoder(&buf)
|
||||
|
|
|
|||
|
|
@ -206,6 +206,15 @@ func CustomMarshaler[T any](marshaler func(T) ([]byte, error)) EncodeOption {
|
|||
}
|
||||
}
|
||||
|
||||
// AutoInt automatically converts floating-point numbers to integers when the fractional part is zero.
|
||||
// For example, a value of 1.0 will be encoded as 1.
|
||||
func AutoInt() EncodeOption {
|
||||
return func(e *Encoder) error {
|
||||
e.autoInt = true
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// CommentPosition type of the position for comment.
|
||||
type CommentPosition int
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue