encoder.go 1.5 KB

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