yaml.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package orderedmap
  2. import (
  3. "fmt"
  4. "gopkg.in/yaml.v3"
  5. )
  6. var (
  7. _ yaml.Marshaler = &OrderedMap[int, any]{}
  8. _ yaml.Unmarshaler = &OrderedMap[int, any]{}
  9. )
  10. // MarshalYAML implements the yaml.Marshaler interface.
  11. func (om *OrderedMap[K, V]) MarshalYAML() (interface{}, error) {
  12. if om == nil {
  13. return []byte("null"), nil
  14. }
  15. node := yaml.Node{
  16. Kind: yaml.MappingNode,
  17. }
  18. for pair := om.Oldest(); pair != nil; pair = pair.Next() {
  19. key, value := pair.Key, pair.Value
  20. keyNode := &yaml.Node{}
  21. // serialize key to yaml, then deserialize it back into the node
  22. // this is a hack to get the correct tag for the key
  23. if err := keyNode.Encode(key); err != nil {
  24. return nil, err
  25. }
  26. valueNode := &yaml.Node{}
  27. if err := valueNode.Encode(value); err != nil {
  28. return nil, err
  29. }
  30. node.Content = append(node.Content, keyNode, valueNode)
  31. }
  32. return &node, nil
  33. }
  34. // UnmarshalYAML implements the yaml.Unmarshaler interface.
  35. func (om *OrderedMap[K, V]) UnmarshalYAML(value *yaml.Node) error {
  36. if value.Kind != yaml.MappingNode {
  37. return fmt.Errorf("pipeline must contain YAML mapping, has %v", value.Kind)
  38. }
  39. if om.list == nil {
  40. om.initialize(0)
  41. }
  42. for index := 0; index < len(value.Content); index += 2 {
  43. var key K
  44. var val V
  45. if err := value.Content[index].Decode(&key); err != nil {
  46. return err
  47. }
  48. if err := value.Content[index+1].Decode(&val); err != nil {
  49. return err
  50. }
  51. om.Set(key, val)
  52. }
  53. return nil
  54. }