config.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. }
  11. func (cfg *Config) validate() error {
  12. if err := cfg.Homeserver.validate(); err != nil {
  13. return err
  14. }
  15. if err := cfg.Appservice.validate(); err != nil {
  16. return err
  17. }
  18. if err := cfg.Bridge.validate(); err != nil {
  19. return err
  20. }
  21. return nil
  22. }
  23. func (cfg *Config) UnmarshalYAML(unmarshal func(interface{}) error) error {
  24. type rawConfig Config
  25. raw := rawConfig{}
  26. if err := unmarshal(&raw); err != nil {
  27. return err
  28. }
  29. *cfg = Config(raw)
  30. return cfg.validate()
  31. }
  32. func FromBytes(data []byte) (*Config, error) {
  33. cfg := Config{}
  34. if err := yaml.Unmarshal(data, &cfg); err != nil {
  35. return nil, err
  36. }
  37. if err := cfg.validate(); err != nil {
  38. return nil, err
  39. }
  40. return &cfg, nil
  41. }
  42. func FromString(str string) (*Config, error) {
  43. return FromBytes([]byte(str))
  44. }
  45. func FromFile(filename string) (*Config, error) {
  46. data, err := ioutil.ReadFile(filename)
  47. if err != nil {
  48. return nil, err
  49. }
  50. return FromBytes(data)
  51. }
  52. func (cfg *Config) Save(filename string) error {
  53. data, err := yaml.Marshal(cfg)
  54. if err != nil {
  55. return err
  56. }
  57. return ioutil.WriteFile(filename, data, 0600)
  58. }