package conf import ( "encoding/json" "errors" "fmt" "github.com/dballard/warren/lib/warren" "os" ) type MsgType int const ( AddDeployment MsgType = iota RmDeploymen ) type Msg struct { mType MsgType reply chan error args map[string]string } func NewMsg(mType MsgType, args map[string]string) *Msg { var m = &Msg{mType, make(chan error), args} return m } func (m *Msg) Call() error { confChan <- *m err := <-m.reply return err } // Conf package - thread safe conf // All write ops are public API functions // that internall use channels to thread safely queue writes // all write ops cause FS conf writes so that state is preserved // Reads return copies of data type Conf struct { // name : path Deployments map[string]string } var conf *Conf = nil var Init = make(chan bool) var confChan = make(chan Msg) func loadConf() { file, err := os.Open(warren.WarrendConf) if err != nil { fmt.Println("Error loading ", warren.WarrendConf, ": ", err) return } defer file.Close() decoder := json.NewDecoder(file) conf = new(Conf) err = decoder.Decode(conf) if err != nil { conf = nil fmt.Println("Error parsing ", warren.WarrendConf, ": ", err) } if conf.Deployments == nil { conf.Deployments = make(map[string]string) } // populate reverse map for nick, dir := range conf.Deployments { dirToNick[dir] = nick } } func saveConf() error { file, err := os.Create(warren.WarrendConf) if err != nil { // TODO: Um, more than noting we might want to do something more drastic return errors.New("Error: could not open conf file for saving: " + err.Error()) } defer file.Close() jdata, err := json.MarshalIndent(conf, "", "\t") if err != nil { return errors.New("Error: Could not enocde to json: " + err.Error()) } if _, err := file.Write(jdata); err != nil { return errors.New("Error: Could not write to file: " + err.Error()) } return ni l } func GetConf() Conf { return *conf } func Run() { loadConf() if conf == nil { fmt.Println("failed to load conf") Init <- false } // set up comm chans Init <- true // loop for Writes for { m := <- confChan select (m.mType) { case dm := <-addDeploymentChan: addDeployment(&dm) } } }