diff options
| author | 2025-08-01 16:52:52 +0700 | |
|---|---|---|
| committer | 2025-08-01 16:52:52 +0700 | |
| commit | 0c0900cdea12364a25ebf9bb8205a795416e8d6d (patch) | |
| tree | 7052b25fb404afbfe51c27cdaceca5452c697cb0 /config/config.go | |
| parent | a1f511368b898ba53ca685dd3f41f2901f295fd3 (diff) | |
| download | web-0c0900cdea12364a25ebf9bb8205a795416e8d6d.tar.gz web-0c0900cdea12364a25ebf9bb8205a795416e8d6d.zip | |
feat: support of multi-page blog via b2
feat: use markdown + frontmatter for page content
feat: add main page with dynamic page lookup
feat: add night theme
feat: extract timestamp of photo taken from picture name
Diffstat (limited to 'config/config.go')
| -rw-r--r-- | config/config.go | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/config/config.go b/config/config.go new file mode 100644 index 0000000..67c0c4d --- /dev/null +++ b/config/config.go @@ -0,0 +1,67 @@ +package config + +import ( + "log/slog" + "os" + + "github.com/go-playground/validator/v10" + "gopkg.in/yaml.v3" +) + +type Config struct { + LogLevel slog.Level `json:"LogLevel" yaml:"logLevel" validate:"required"` + BlogPages BlogPagesConfig `json:"BlogPages" yaml:"blogPages" validate:"required"` +} + +type BlogPagesConfig struct { + Storage StorageConfig `json:"Storage" yaml:"storage" validate:"required"` + AvailableLanguages []AvailableLanguageConfig `json:"AvailableLanguages" yaml:"availableLanguages" validate:"required"` +} + +type StorageConfig struct { + Type string `json:"type" yaml:"type"` + Config B2Config `json:"Config" yaml:"config" validate:"required"` +} + +type B2Config struct { + BucketName string `json:"BucketName" yaml:"bucketName" validate:"required,min=1"` + Region string `json:"Region" yaml:"region" validate:"required,min=1"` + Prefix string `json:"Prefix" yaml:"prefix"` + KeyID string `json:"KeyID" yaml:"keyID"` + ApplicationKey string `json:"ApplicationKey" yaml:"applicationKey"` +} + +type AvailableLanguageConfig struct { + Name string `json:"Name" yaml:"name" validate:"required"` + Alt string `json:"Alt" yaml:"alt"` + Flag string `json:"Flag" yaml:"flag" validate:"url"` +} + +func LoadConfig(path string, config *Config) error { + fileBytes, err := os.ReadFile(path) + if err != nil { + return err + } + + expandedFileBytes := []byte(os.ExpandEnv(string(fileBytes))) + + if err = yaml.Unmarshal(expandedFileBytes, config); err != nil { + return err + } + + return nil +} + +func InitConfig(path string) (*Config, error) { + config := &Config{} + if err := LoadConfig(path, config); err != nil { + return nil, err + } + + validate := validator.New(validator.WithRequiredStructEnabled()) + if err := validate.Struct(config); err != nil { + return nil, err + } + + return config, nil +} |