mirror of
https://codeberg.org/superseriousbusiness/gotosocial.git
synced 2024-12-30 12:58:16 +03:00
72 lines
1.4 KiB
Go
72 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
|
||
|
}
|