config.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package config
  2. import (
  3. "fmt"
  4. "os"
  5. "gopkg.in/yaml.v3"
  6. )
  7. type Config struct {
  8. Server ServerConfig `yaml:"server"`
  9. Database DatabaseConfig `yaml:"database"`
  10. BasicAuth BasicAuth `yaml:"basic_auth"`
  11. Homepage string `yaml:"homepage"`
  12. }
  13. func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error {
  14. type rawConfig Config
  15. raw := rawConfig{
  16. Server: ServerConfig{},
  17. Database: DatabaseConfig{},
  18. }
  19. if err := unmarshal(&raw); err != nil {
  20. return err
  21. }
  22. *c = Config(raw)
  23. return nil
  24. }
  25. type ServerConfig struct {
  26. ListeningPort string `yaml:"port"`
  27. TlsConfig TlsConfig `yaml:"tls"`
  28. }
  29. func (c *ServerConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
  30. type rawServerConfig ServerConfig
  31. raw := rawServerConfig{
  32. TlsConfig: TlsConfig{},
  33. }
  34. if err := unmarshal(&raw); err != nil {
  35. return err
  36. }
  37. *c = ServerConfig(raw)
  38. return nil
  39. }
  40. type DatabaseConfig struct {
  41. File string `yaml:"file"`
  42. LogMode bool `yaml:"log_mode"`
  43. MaxOpenConns int `yaml:"max_open_conns"`
  44. MaxIdleConns int `yaml:"max_idle_conns"`
  45. ConnMaxLifetime int `yaml:"conn_max_lifetime"`
  46. Pragma []string `yaml:"pragma"`
  47. }
  48. func (c *DatabaseConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
  49. type rawDatabaseConfig DatabaseConfig
  50. raw := rawDatabaseConfig{}
  51. if err := unmarshal(&raw); err != nil {
  52. return err
  53. }
  54. if raw.File == "" {
  55. return fmt.Errorf("database file not provided")
  56. }
  57. *c = DatabaseConfig(raw)
  58. return nil
  59. }
  60. type TlsConfig struct {
  61. Enabled bool `yaml:"enabled"`
  62. CertFile string `yaml:"cert"`
  63. KeyFile string `yaml:"key"`
  64. }
  65. func (c *TlsConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
  66. type rawTlsConfig TlsConfig
  67. raw := rawTlsConfig{
  68. Enabled: false,
  69. }
  70. if err := unmarshal(&raw); err != nil {
  71. return err
  72. }
  73. if raw.Enabled && (raw.CertFile == "" || raw.KeyFile == "") {
  74. return fmt.Errorf("tls enabled but cert or key not provided")
  75. }
  76. *c = TlsConfig(raw)
  77. return nil
  78. }
  79. type BasicAuth struct {
  80. Username string `yaml:"username"`
  81. Password string `yaml:"password"`
  82. }
  83. func (c *BasicAuth) UnmarshalYAML(unmarshal func(interface{}) error) error {
  84. type rawBasicAuth BasicAuth
  85. raw := rawBasicAuth{}
  86. if err := unmarshal(&raw); err != nil {
  87. return err
  88. }
  89. if raw.Username == "" || raw.Password == "" {
  90. return fmt.Errorf("username or password not provided")
  91. }
  92. *c = BasicAuth(raw)
  93. return nil
  94. }
  95. func ReadConfig(cfgPath string) (*Config, error) {
  96. cfg, err := os.ReadFile(cfgPath)
  97. if err != nil {
  98. return nil, err
  99. }
  100. var config Config
  101. if err := yaml.Unmarshal(cfg, &config); err != nil {
  102. return nil, err
  103. }
  104. fmt.Println(config)
  105. return &config, nil
  106. }