github.com/Cloud-Foundations/Dominator@v0.3.4/lib/decoders/impl.go (about)

     1  package decoders
     2  
     3  import (
     4  	"encoding/gob"
     5  	"encoding/json"
     6  	"fmt"
     7  	"io"
     8  	"os"
     9  	"path/filepath"
    10  
    11  	"github.com/Cloud-Foundations/Dominator/lib/uncommenter"
    12  )
    13  
    14  type decoderMap map[string]DecoderGenerator
    15  
    16  var defaultDecoders = decoderMap{
    17  	".gob":  func(r io.Reader) Decoder { return gob.NewDecoder(r) },
    18  	".json": func(r io.Reader) Decoder { return json.NewDecoder(r) },
    19  }
    20  
    21  func registerDecoder(extension string, decoderGenerator DecoderGenerator) {
    22  	defaultDecoders[extension] = decoderGenerator
    23  }
    24  
    25  func (decoders decoderMap) decodeFile(filename string,
    26  	value interface{}) error {
    27  	ext := filepath.Ext(filename)
    28  	if ext == "" {
    29  		return fmt.Errorf("no extension for file: %s", filename)
    30  	}
    31  	decoderGenerator, ok := decoders[filepath.Ext(filename)]
    32  	if !ok {
    33  		return fmt.Errorf("no decoder for .%s extension", ext)
    34  	}
    35  	if file, err := os.Open(filename); err != nil {
    36  		return err
    37  	} else {
    38  		defer file.Close()
    39  		reader := uncommenter.New(file, uncommenter.CommentTypeAll)
    40  		return decoderGenerator(reader).Decode(value)
    41  	}
    42  }
    43  
    44  func (decoders decoderMap) findAndDecodeFile(basename string,
    45  	value interface{}) error {
    46  	for ext, decoderGenerator := range decoders {
    47  		filename := basename + ext
    48  		if file, err := os.Open(filename); err != nil {
    49  			if os.IsNotExist(err) {
    50  				continue
    51  			}
    52  			return err
    53  		} else {
    54  			defer file.Close()
    55  			reader := uncommenter.New(file, uncommenter.CommentTypeAll)
    56  			if err := decoderGenerator(reader).Decode(value); err != nil {
    57  				return fmt.Errorf("%s: %s", filename, err)
    58  			}
    59  			return nil
    60  		}
    61  	}
    62  	return os.ErrNotExist
    63  }