podman
1package encoding2
3import (4"sync"5)
6
7// Encoder encodes the contents of v into a byte representation.
8// It's primarily used for encoding a map[string]interface{} into a file format.
9type Encoder interface {10Encode(v map[string]interface{}) ([]byte, error)11}
12
13const (14// ErrEncoderNotFound is returned when there is no encoder registered for a format.15ErrEncoderNotFound = encodingError("encoder not found for this format")16
17// ErrEncoderFormatAlreadyRegistered is returned when an encoder is already registered for a format.18ErrEncoderFormatAlreadyRegistered = encodingError("encoder already registered for this format")19)
20
21// EncoderRegistry can choose an appropriate Encoder based on the provided format.
22type EncoderRegistry struct {23encoders map[string]Encoder24
25mu sync.RWMutex26}
27
28// NewEncoderRegistry returns a new, initialized EncoderRegistry.
29func NewEncoderRegistry() *EncoderRegistry {30return &EncoderRegistry{31encoders: make(map[string]Encoder),32}33}
34
35// RegisterEncoder registers an Encoder for a format.
36// Registering a Encoder for an already existing format is not supported.
37func (e *EncoderRegistry) RegisterEncoder(format string, enc Encoder) error {38e.mu.Lock()39defer e.mu.Unlock()40
41if _, ok := e.encoders[format]; ok {42return ErrEncoderFormatAlreadyRegistered43}44
45e.encoders[format] = enc46
47return nil48}
49
50func (e *EncoderRegistry) Encode(format string, v map[string]interface{}) ([]byte, error) {51e.mu.RLock()52encoder, ok := e.encoders[format]53e.mu.RUnlock()54
55if !ok {56return nil, ErrEncoderNotFound57}58
59return encoder.Encode(v)60}
61