config.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. return cfg.validate()
  30. }
  31. func FromBytes(data []byte) (*Config, error) {
  32. cfg := Config{}
  33. if err := yaml.Unmarshal(data, &cfg); err != nil {
  34. return nil, err
  35. }
  36. if err := cfg.validate(); err != nil {
  37. return nil, err
  38. }
  39. return &cfg, nil
  40. }
  41. func FromString(str string) (*Config, error) {
  42. return FromBytes([]byte(str))
  43. }
  44. func FromFile(filename string) (*Config, error) {
  45. data, err := ioutil.ReadFile(filename)
  46. if err != nil {
  47. return nil, err
  48. }
  49. return FromBytes(data)
  50. }
  51. func (cfg *Config) Save(filename string) error {
  52. data, err := yaml.Marshal(cfg)
  53. if err != nil {
  54. return err
  55. }
  56. return ioutil.WriteFile(filename, data, 0600)
  57. }