gf/encoding/gyaml/gyaml.go

83 lines
2.0 KiB
Go

// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
//
// This Source Code Form is subject to the terms of the MIT License.
// If a copy of the MIT was not distributed with this file,
// You can obtain one at https://github.com/gogf/gf.
// Package gyaml provides accessing and converting for YAML content.
package gyaml
import (
"bytes"
"strings"
"gopkg.in/yaml.v3"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/internal/json"
"github.com/gogf/gf/v2/util/gconv"
)
// Encode encodes `value` to an YAML format content as bytes.
func Encode(value interface{}) (out []byte, err error) {
if out, err = yaml.Marshal(value); err != nil {
err = gerror.Wrap(err, `yaml.Marshal failed`)
}
return
}
// EncodeIndent encodes `value` to an YAML format content with indent as bytes.
func EncodeIndent(value interface{}, indent string) (out []byte, err error) {
out, err = Encode(value)
if err != nil {
return
}
if indent != "" {
var (
buffer = bytes.NewBuffer(nil)
array = strings.Split(strings.TrimSpace(string(out)), "\n")
)
for _, v := range array {
buffer.WriteString(indent)
buffer.WriteString(v)
buffer.WriteString("\n")
}
out = buffer.Bytes()
}
return
}
// Decode parses `content` into and returns as map.
func Decode(content []byte) (map[string]interface{}, error) {
var (
result map[string]interface{}
err error
)
if err = yaml.Unmarshal(content, &result); err != nil {
err = gerror.Wrap(err, `yaml.Unmarshal failed`)
return nil, err
}
return gconv.MapDeep(result), nil
}
// DecodeTo parses `content` into `result`.
func DecodeTo(value []byte, result interface{}) (err error) {
err = yaml.Unmarshal(value, result)
if err != nil {
err = gerror.Wrap(err, `yaml.Unmarshal failed`)
}
return
}
// ToJson converts `content` to JSON format content.
func ToJson(content []byte) (out []byte, err error) {
var (
result interface{}
)
if result, err = Decode(content); err != nil {
return nil, err
} else {
return json.Marshal(result)
}
}