// // rhctl // // Copyright (C) 2009-2016 Christian Pointner // // This file is part of rhctl. // // rhctl is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // any later version. // // rhctl is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with rhctl. If not, see . // package main import ( "errors" "os" "sort" "strings" "time" "github.com/naoina/toml" ) type ConfigSwitchInputs []struct { Number SwitchInputNum `toml:"number"` Server string `toml:"server"` Channel string `toml:"channel"` } func (p ConfigSwitchInputs) Len() int { return len(p) } func (p ConfigSwitchInputs) Swap(i, j int) { p[i], p[j] = p[j], p[i] } func (p ConfigSwitchInputs) Less(i, j int) bool { return p[i].Number < p[j].Number } type Config struct { Audioswitch struct { Device string `toml:"dev"` Baudrate Baudrate `toml:"baud"` Timeout Duration `toml:"timeout"` Unit SwitchUnitID `toml:"unit"` Inputs ConfigSwitchInputs `toml:"inputs"` } Servers map[string]struct { ControlDevice string `toml:"ctrl_dev"` ControlBaudrate Baudrate `toml:"ctrl_baud"` HeartbeatDevice string `toml:"heartbeat_dev"` HeartbeatBaudrate Baudrate `toml:"heartbeat_baud"` HeartbeatTimeout Duration `toml:"heartbeat_timeout"` HeartbeatThreshold uint `toml:"heartbeat_threshold"` } Clients struct { Web struct { Address string `toml:"addr"` } Telnet struct { Address string `toml:"addr"` } } } type Duration struct { time.Duration } func (d *Duration) UnmarshalTOML(data []byte) (err error) { ds := strings.Trim(string(data), "\"") d.Duration, err = time.ParseDuration(ds) return } func ReadConfig(configfile string) (conf *Config, err error) { conf = &Config{} var f *os.File if f, err = os.Open(configfile); err != nil { return } defer f.Close() decoder := toml.NewDecoder(f) if err = decoder.Decode(conf); err != nil { return } sort.Sort(conf.Audioswitch.Inputs) for i := 1; i < len(conf.Audioswitch.Inputs); i++ { if conf.Audioswitch.Inputs[i].Number == conf.Audioswitch.Inputs[i-1].Number { return nil, errors.New("audioswitch port assignments must be unique") } } return }