yaml_loader.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package yaml_loader
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. "gopkg.in/yaml.v3"
  7. "io"
  8. "os"
  9. "reflect"
  10. )
  11. // LoadYamlFile 加载YAML文件,一个文件中可以有多个YAML对象
  12. // 参数:
  13. // yamlFilePath: YAML文件路径
  14. // retObjects: 用来接收YAML对象的指针或者map的slice
  15. // 返回值:
  16. // 错误
  17. func LoadYamlFile(yamlFilePath string, retObjects *[]any) error {
  18. yamlFile, err := os.Open(yamlFilePath)
  19. if err != nil {
  20. return err
  21. }
  22. defer func(yamlFile *os.File) {
  23. err := yamlFile.Close()
  24. if err != nil {
  25. fmt.Println(err)
  26. }
  27. }(yamlFile)
  28. return loadYaml(yamlFile, retObjects)
  29. }
  30. // LoadYamlBytes 加载YAML文件字节,一个文件中可以有多个YAML对象
  31. // 参数:
  32. // yamlBytes: YAML文件的字节
  33. // retObjects: 用来接收YAML对象的指针或者map的slice
  34. // 返回值:
  35. // 错误
  36. func LoadYamlBytes(yamlBytes []byte, retObjects *[]any) error {
  37. return loadYaml(bytes.NewReader(yamlBytes), retObjects)
  38. }
  39. func loadYaml(r io.Reader, retObjects *[]any) error {
  40. decoder := yaml.NewDecoder(r)
  41. for i := 0; i < len(*retObjects); i++ {
  42. retObject := (*retObjects)[i]
  43. retObjectType := reflect.TypeOf(retObject)
  44. if retObjectType.Kind() != reflect.Ptr && retObjectType.Kind() != reflect.Map {
  45. return errors.New("返回对象slice需要指针或者map")
  46. }
  47. err := decoder.Decode(retObject)
  48. if err != nil {
  49. if err == io.EOF {
  50. break
  51. }
  52. return err
  53. }
  54. }
  55. return nil
  56. }