mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 02:32:25 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			71 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 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
 | |
| }
 |