yaml_loader.go 1012 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. func LoadYamlFile(yamlFilePath string, retObjects *[]any) error {
  12. yamlFile, err := os.Open(yamlFilePath)
  13. if err != nil {
  14. return err
  15. }
  16. defer func(yamlFile *os.File) {
  17. err := yamlFile.Close()
  18. if err != nil {
  19. fmt.Println(err)
  20. }
  21. }(yamlFile)
  22. return loadYaml(yamlFile, retObjects)
  23. }
  24. func LoadYamlBytes(yamlBytes []byte, retObjects *[]any) error {
  25. return loadYaml(bytes.NewReader(yamlBytes), retObjects)
  26. }
  27. func loadYaml(r io.Reader, retObjects *[]any) error {
  28. decoder := yaml.NewDecoder(r)
  29. for i := 0; i < len(*retObjects); i++ {
  30. retObject := (*retObjects)[i]
  31. retObjectType := reflect.TypeOf(retObject)
  32. if retObjectType.Kind() != reflect.Ptr && retObjectType.Kind() != reflect.Map {
  33. return errors.New("返回对象slice元素需要指针或者map")
  34. }
  35. err := decoder.Decode(retObject)
  36. if err != nil {
  37. if err == io.EOF {
  38. break
  39. }
  40. return err
  41. }
  42. }
  43. return nil
  44. }