79 lines
1.6 KiB
Go
79 lines
1.6 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/BurntSushi/toml"
|
|
)
|
|
|
|
type Config struct {
|
|
Server ServerConfig `toml:"server"`
|
|
SMTP SMTPConfig `toml:"smtp"`
|
|
IMAP IMAPConfig `toml:"imap"`
|
|
TLS TLSConfig `toml:"tls"`
|
|
Storage StorageConfig `toml:"storage"`
|
|
Logging LoggingConfig `toml:"logging"`
|
|
}
|
|
|
|
type ServerConfig struct {
|
|
Hostname string `toml:"hostname"`
|
|
}
|
|
|
|
type SMTPConfig struct {
|
|
InboundAddr string `toml:"inbound_addr"`
|
|
SubmissionAddr string `toml:"submission_addr"`
|
|
SubmissionTLSAddr string `toml:"submission_tls_addr"`
|
|
}
|
|
|
|
type IMAPConfig struct {
|
|
Addr string `toml:"addr"`
|
|
TLSAddr string `toml:"tls_addr"`
|
|
}
|
|
|
|
type TLSConfig struct {
|
|
CertFile string `toml:"cert_file"`
|
|
KeyFile string `toml:"key_file"`
|
|
}
|
|
|
|
type StorageConfig struct {
|
|
MaildirRoot string `toml:"maildir_root"`
|
|
}
|
|
|
|
type LoggingConfig struct {
|
|
Level string `toml:"level"` // debug, info, warn, error
|
|
Format string `toml:"format"` // json, text
|
|
}
|
|
|
|
// Load reads the TOML config file at path, applying defaults for any missing fields.
|
|
func Load(path string) (*Config, error) {
|
|
cfg := defaults()
|
|
if _, err := toml.DecodeFile(path, cfg); err != nil {
|
|
return nil, fmt.Errorf("decode %s: %w", path, err)
|
|
}
|
|
return cfg, nil
|
|
}
|
|
|
|
func defaults() *Config {
|
|
return &Config{
|
|
Server: ServerConfig{
|
|
Hostname: "localhost",
|
|
},
|
|
SMTP: SMTPConfig{
|
|
InboundAddr: ":25",
|
|
SubmissionAddr: ":587",
|
|
SubmissionTLSAddr: ":465",
|
|
},
|
|
IMAP: IMAPConfig{
|
|
Addr: ":143",
|
|
TLSAddr: ":993",
|
|
},
|
|
Storage: StorageConfig{
|
|
MaildirRoot: "/var/mail",
|
|
},
|
|
Logging: LoggingConfig{
|
|
Level: "info",
|
|
Format: "json",
|
|
},
|
|
}
|
|
}
|