vendor/github.com/spf13/viper/internal/encoding/dotenv/codec.go
changeset 260 445e01aede7e
equal deleted inserted replaced
259:db4911b0c721 260:445e01aede7e
       
     1 package dotenv
       
     2 
       
     3 import (
       
     4 	"bytes"
       
     5 	"fmt"
       
     6 	"sort"
       
     7 	"strings"
       
     8 
       
     9 	"github.com/subosito/gotenv"
       
    10 )
       
    11 
       
    12 const keyDelimiter = "_"
       
    13 
       
    14 // Codec implements the encoding.Encoder and encoding.Decoder interfaces for encoding data containing environment variables
       
    15 // (commonly called as dotenv format).
       
    16 type Codec struct{}
       
    17 
       
    18 func (Codec) Encode(v map[string]interface{}) ([]byte, error) {
       
    19 	flattened := map[string]interface{}{}
       
    20 
       
    21 	flattened = flattenAndMergeMap(flattened, v, "", keyDelimiter)
       
    22 
       
    23 	keys := make([]string, 0, len(flattened))
       
    24 
       
    25 	for key := range flattened {
       
    26 		keys = append(keys, key)
       
    27 	}
       
    28 
       
    29 	sort.Strings(keys)
       
    30 
       
    31 	var buf bytes.Buffer
       
    32 
       
    33 	for _, key := range keys {
       
    34 		_, err := buf.WriteString(fmt.Sprintf("%v=%v\n", strings.ToUpper(key), flattened[key]))
       
    35 		if err != nil {
       
    36 			return nil, err
       
    37 		}
       
    38 	}
       
    39 
       
    40 	return buf.Bytes(), nil
       
    41 }
       
    42 
       
    43 func (Codec) Decode(b []byte, v map[string]interface{}) error {
       
    44 	var buf bytes.Buffer
       
    45 
       
    46 	_, err := buf.Write(b)
       
    47 	if err != nil {
       
    48 		return err
       
    49 	}
       
    50 
       
    51 	env, err := gotenv.StrictParse(&buf)
       
    52 	if err != nil {
       
    53 		return err
       
    54 	}
       
    55 
       
    56 	for key, value := range env {
       
    57 		v[key] = value
       
    58 	}
       
    59 
       
    60 	return nil
       
    61 }