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 }