vendor/github.com/spf13/viper/internal/encoding/decoder.go
changeset 260 445e01aede7e
equal deleted inserted replaced
259:db4911b0c721 260:445e01aede7e
       
     1 package encoding
       
     2 
       
     3 import (
       
     4 	"sync"
       
     5 )
       
     6 
       
     7 // Decoder decodes the contents of b into v.
       
     8 // It's primarily used for decoding contents of a file into a map[string]interface{}.
       
     9 type Decoder interface {
       
    10 	Decode(b []byte, v map[string]interface{}) error
       
    11 }
       
    12 
       
    13 const (
       
    14 	// ErrDecoderNotFound is returned when there is no decoder registered for a format.
       
    15 	ErrDecoderNotFound = encodingError("decoder not found for this format")
       
    16 
       
    17 	// ErrDecoderFormatAlreadyRegistered is returned when an decoder is already registered for a format.
       
    18 	ErrDecoderFormatAlreadyRegistered = encodingError("decoder already registered for this format")
       
    19 )
       
    20 
       
    21 // DecoderRegistry can choose an appropriate Decoder based on the provided format.
       
    22 type DecoderRegistry struct {
       
    23 	decoders map[string]Decoder
       
    24 
       
    25 	mu sync.RWMutex
       
    26 }
       
    27 
       
    28 // NewDecoderRegistry returns a new, initialized DecoderRegistry.
       
    29 func NewDecoderRegistry() *DecoderRegistry {
       
    30 	return &DecoderRegistry{
       
    31 		decoders: make(map[string]Decoder),
       
    32 	}
       
    33 }
       
    34 
       
    35 // RegisterDecoder registers a Decoder for a format.
       
    36 // Registering a Decoder for an already existing format is not supported.
       
    37 func (e *DecoderRegistry) RegisterDecoder(format string, enc Decoder) error {
       
    38 	e.mu.Lock()
       
    39 	defer e.mu.Unlock()
       
    40 
       
    41 	if _, ok := e.decoders[format]; ok {
       
    42 		return ErrDecoderFormatAlreadyRegistered
       
    43 	}
       
    44 
       
    45 	e.decoders[format] = enc
       
    46 
       
    47 	return nil
       
    48 }
       
    49 
       
    50 // Decode calls the underlying Decoder based on the format.
       
    51 func (e *DecoderRegistry) Decode(format string, b []byte, v map[string]interface{}) error {
       
    52 	e.mu.RLock()
       
    53 	decoder, ok := e.decoders[format]
       
    54 	e.mu.RUnlock()
       
    55 
       
    56 	if !ok {
       
    57 		return ErrDecoderNotFound
       
    58 	}
       
    59 
       
    60 	return decoder.Decode(b, v)
       
    61 }