From 440c5e967c0a8d286fd338f741fc7d8cf0c595b0 Mon Sep 17 00:00:00 2001 From: Faissal Elamraoui Date: Thu, 3 Nov 2016 16:41:51 +0100 Subject: [PATCH] Rewrite configuration loading Rewrited loadConfig() function to walk the project directory looking for bee.json and Beefile. If no configuration file found, it fallbacks to the default configuration. In case of an error, a log message is printed to the console. --- conf.go | 103 ++++++++++++++++++++++++++++++++++++++++++-------------- run.go | 2 +- 2 files changed, 78 insertions(+), 27 deletions(-) diff --git a/conf.go b/conf.go index b26f26b..68422bb 100644 --- a/conf.go +++ b/conf.go @@ -19,6 +19,9 @@ import ( "io/ioutil" "os" + "io" + "path/filepath" + "gopkg.in/yaml.v2" ) @@ -75,42 +78,58 @@ var conf struct { } // loadConfig loads customized configuration. -func loadConfig() error { - foundConf := false - f, err := os.Open("bee.json") - if err == nil { - defer f.Close() - ColorLog("[INFO] Detected bee.json\n") - d := json.NewDecoder(f) - err = d.Decode(&conf) +func loadConfig() (err error) { + err = filepath.Walk(".", func(path string, fileInfo os.FileInfo, err error) error { if err != nil { - return err + return nil } - foundConf = true - } - byml, erryml := ioutil.ReadFile("Beefile") - if erryml == nil { - ColorLog("[INFO] Detected Beefile\n") - err = yaml.Unmarshal(byml, &conf) - if err != nil { - return err + + if fileInfo.IsDir() { + return nil } - foundConf = true - } - if !foundConf { - // Use default. + + if fileInfo.Name() == "bee.json" { + ColorLog("[INFO] Loading configuration from 'bee.json'...\n") + err = parseJSON(path, conf) + if err != nil { + ColorLog("[ERRO] Failed to parse JSON file: %v\n", err) + return err + } + return io.EOF + } + + if fileInfo.Name() == "Beefile" { + ColorLog("[INFO] Loading configuration from 'Beefile'...\n") + err = parseYAML(path, conf) + if err != nil { + ColorLog("[ERRO] Failed to parse YAML file: %v\n", err) + return err + } + return io.EOF + } + return nil + }) + + // In case no configuration file found or an error different than io.EOF, + // fallback to default configuration + if err != io.EOF { + ColorLog("[INFO] Loading default configuration...\n") err = json.Unmarshal([]byte(defaultConf), &conf) if err != nil { - return err + return } } - // Check format version. + + // No need to return io.EOF error + err = nil + + // Check format version if conf.Version != ConfVer { - ColorLog("[WARN] Your bee.json is out-of-date, please update!\n") + ColorLog("[WARN] Your bee.json is outdated. Please do consider updating it.\n") ColorLog("[HINT] Compare bee.json under bee source code path and yours\n") } - // Set variables. + // Set variables if len(conf.DirStruct.Controllers) == 0 { conf.DirStruct.Controllers = "controllers" } @@ -118,7 +137,39 @@ func loadConfig() error { conf.DirStruct.Models = "models" } - // Append watch exts. + // Append watch exts watchExts = append(watchExts, conf.WatchExt...) + return +} + +func parseJSON(path string, v interface{}) error { + var ( + data []byte + err error + ) + data, err = ioutil.ReadFile(path) + if err != nil { + return err + } + err = json.Unmarshal(data, &v) + if err != nil { + return err + } + return nil +} + +func parseYAML(path string, v interface{}) error { + var ( + data []byte + err error + ) + data, err = ioutil.ReadFile(path) + if err != nil { + return err + } + err = yaml.Unmarshal(data, &v) + if err != nil { + return err + } return nil } diff --git a/run.go b/run.go index b84e199..8f4d3a3 100644 --- a/run.go +++ b/run.go @@ -115,7 +115,7 @@ func runApp(cmd *Command, args []string) int { err := loadConfig() if err != nil { - ColorLog("[ERRO] Fail to parse bee.json[ %s ]\n", err) + ColorLog("[ERRO] Failed to load configuration [ %s ]\n", err) } var paths []string