config.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package config
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "gopkg.in/yaml.v2"
  6. )
  7. type Config struct {
  8. Homeserver homeserver `yaml:"homeserver"`
  9. Appservice appservice `yaml:"appservice"`
  10. Bridge bridge `yaml:"bridge"`
  11. Logging logging `yaml:"logging"`
  12. filename string `yaml:"-"`
  13. }
  14. var configUpdated bool
  15. func (cfg *Config) validate() error {
  16. if err := cfg.Homeserver.validate(); err != nil {
  17. return err
  18. }
  19. if err := cfg.Appservice.validate(); err != nil {
  20. return err
  21. }
  22. if err := cfg.Bridge.validate(); err != nil {
  23. return err
  24. }
  25. if err := cfg.Logging.validate(); err != nil {
  26. return err
  27. }
  28. if configUpdated {
  29. return cfg.Save(cfg.filename)
  30. }
  31. return nil
  32. }
  33. func (cfg *Config) UnmarshalYAML(unmarshal func(interface{}) error) error {
  34. type rawConfig Config
  35. raw := rawConfig{
  36. filename: cfg.filename,
  37. }
  38. if err := unmarshal(&raw); err != nil {
  39. return err
  40. }
  41. *cfg = Config(raw)
  42. return cfg.validate()
  43. }
  44. func FromBytes(filename string, data []byte) (*Config, error) {
  45. cfg := Config{
  46. filename: filename,
  47. }
  48. if err := yaml.Unmarshal(data, &cfg); err != nil {
  49. return nil, err
  50. }
  51. if err := cfg.validate(); err != nil {
  52. return nil, err
  53. }
  54. return &cfg, nil
  55. }
  56. func FromString(str string) (*Config, error) {
  57. return FromBytes("", []byte(str))
  58. }
  59. func FromFile(filename string) (*Config, error) {
  60. data, err := ioutil.ReadFile(filename)
  61. if err != nil {
  62. return nil, err
  63. }
  64. return FromBytes(filename, data)
  65. }
  66. func (cfg *Config) Save(filename string) error {
  67. if filename == "" {
  68. return fmt.Errorf("no filename specified yep")
  69. }
  70. data, err := yaml.Marshal(cfg)
  71. if err != nil {
  72. return err
  73. }
  74. return ioutil.WriteFile(filename, data, 0600)
  75. }