summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/spf13/viper/internal/encoding/encoder.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/spf13/viper/internal/encoding/encoder.go')
-rw-r--r--vendor/github.com/spf13/viper/internal/encoding/encoder.go60
1 files changed, 60 insertions, 0 deletions
diff --git a/vendor/github.com/spf13/viper/internal/encoding/encoder.go b/vendor/github.com/spf13/viper/internal/encoding/encoder.go
new file mode 100644
index 00000000..82c7996c
--- /dev/null
+++ b/vendor/github.com/spf13/viper/internal/encoding/encoder.go
@@ -0,0 +1,60 @@
+package encoding
+
+import (
+ "sync"
+)
+
+// Encoder encodes the contents of v into a byte representation.
+// It's primarily used for encoding a map[string]interface{} into a file format.
+type Encoder interface {
+ Encode(v interface{}) ([]byte, error)
+}
+
+const (
+ // ErrEncoderNotFound is returned when there is no encoder registered for a format.
+ ErrEncoderNotFound = encodingError("encoder not found for this format")
+
+ // ErrEncoderFormatAlreadyRegistered is returned when an encoder is already registered for a format.
+ ErrEncoderFormatAlreadyRegistered = encodingError("encoder already registered for this format")
+)
+
+// EncoderRegistry can choose an appropriate Encoder based on the provided format.
+type EncoderRegistry struct {
+ encoders map[string]Encoder
+
+ mu sync.RWMutex
+}
+
+// NewEncoderRegistry returns a new, initialized EncoderRegistry.
+func NewEncoderRegistry() *EncoderRegistry {
+ return &EncoderRegistry{
+ encoders: make(map[string]Encoder),
+ }
+}
+
+// RegisterEncoder registers an Encoder for a format.
+// Registering a Encoder for an already existing format is not supported.
+func (e *EncoderRegistry) RegisterEncoder(format string, enc Encoder) error {
+ e.mu.Lock()
+ defer e.mu.Unlock()
+
+ if _, ok := e.encoders[format]; ok {
+ return ErrEncoderFormatAlreadyRegistered
+ }
+
+ e.encoders[format] = enc
+
+ return nil
+}
+
+func (e *EncoderRegistry) Encode(format string, v interface{}) ([]byte, error) {
+ e.mu.RLock()
+ encoder, ok := e.encoders[format]
+ e.mu.RUnlock()
+
+ if !ok {
+ return nil, ErrEncoderNotFound
+ }
+
+ return encoder.Encode(v)
+}