package config import ( "io/ioutil" "os" "path/filepath" "gopkg.in/yaml.v2" ) var projectRoot string var dockerAvailable, pandocAvailable bool const ( // UseDocker invokes pandoc within Docker UseDocker = "docker" // UsePandoc invokes pandoc directly UsePandoc = "pandoc" ) // SetProjectRoot is used by the test suite. func SetProjectRoot(dir string) { projectRoot = dir } type Project struct { Name string `yaml:"name"` Pandoc string `yaml:"pandoc,omitempty"` FilePrefix string `yaml:"filePrefix"` Tickets map[string]interface{} `yaml:"tickets"` } // SetPandoc records pandoc availability during initialization func SetPandoc(pandoc bool, docker bool) { pandocAvailable = pandoc dockerAvailable = docker } // WhichPandoc indicates which pandoc invocation path should be used func WhichPandoc() string { cfg := Config() if cfg.Pandoc == UsePandoc { return UsePandoc } if cfg.Pandoc == UseDocker { return UseDocker } if pandocAvailable { return UsePandoc } return UseDocker } // YAML is the parsed contents of ProjectRoot()/config.yml. func YAML() map[interface{}]interface{} { m := make(map[interface{}]interface{}) cfgBytes, err := ioutil.ReadFile(filepath.Join(ProjectRoot(), "comply.yml")) if err != nil { panic("unable to load config.yml: " + err.Error()) } yaml.Unmarshal(cfgBytes, &m) return m } // Exists tests for the presence of a comply configuration file. func Exists() bool { _, err := ioutil.ReadFile(filepath.Join(ProjectRoot(), "comply.yml")) if err != nil { return false } return true } // Config is the parsed contents of ProjectRoot()/config.yml. func Config() Project { p := Project{} cfgBytes, err := ioutil.ReadFile(filepath.Join(ProjectRoot(), "comply.yml")) if err != nil { panic("unable to load config.yml: " + err.Error()) } yaml.Unmarshal(cfgBytes, &p) return p } // ProjectRoot is the fully-qualified path to the root directory. func ProjectRoot() string { if projectRoot == "" { dir, err := os.Getwd() if err != nil { panic(err) } projectRoot = dir } return projectRoot }