| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- package orderedmap
- import (
- "fmt"
- "gopkg.in/yaml.v3"
- )
- var (
- _ yaml.Marshaler = &OrderedMap[int, any]{}
- _ yaml.Unmarshaler = &OrderedMap[int, any]{}
- )
- // MarshalYAML implements the yaml.Marshaler interface.
- func (om *OrderedMap[K, V]) MarshalYAML() (interface{}, error) {
- if om == nil {
- return []byte("null"), nil
- }
- node := yaml.Node{
- Kind: yaml.MappingNode,
- }
- for pair := om.Oldest(); pair != nil; pair = pair.Next() {
- key, value := pair.Key, pair.Value
- keyNode := &yaml.Node{}
- // serialize key to yaml, then deserialize it back into the node
- // this is a hack to get the correct tag for the key
- if err := keyNode.Encode(key); err != nil {
- return nil, err
- }
- valueNode := &yaml.Node{}
- if err := valueNode.Encode(value); err != nil {
- return nil, err
- }
- node.Content = append(node.Content, keyNode, valueNode)
- }
- return &node, nil
- }
- // UnmarshalYAML implements the yaml.Unmarshaler interface.
- func (om *OrderedMap[K, V]) UnmarshalYAML(value *yaml.Node) error {
- if value.Kind != yaml.MappingNode {
- return fmt.Errorf("pipeline must contain YAML mapping, has %v", value.Kind)
- }
- if om.list == nil {
- om.initialize(0)
- }
- for index := 0; index < len(value.Content); index += 2 {
- var key K
- var val V
- if err := value.Content[index].Decode(&key); err != nil {
- return err
- }
- if err := value.Content[index+1].Decode(&val); err != nil {
- return err
- }
- om.Set(key, val)
- }
- return nil
- }
|