config.go 1.4 KB

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