summaryrefslogtreecommitdiffci
path: root/config/config.go
diff options
from:
to:
context:
space:
mode:
authorGravatar SayaAndy <montferrat@tuta.io> 2025-08-01 16:52:52 +0700
committerGravatar SayaAndy <montferrat@tuta.io> 2025-08-01 16:52:52 +0700
commit0c0900cdea12364a25ebf9bb8205a795416e8d6d (patch)
tree7052b25fb404afbfe51c27cdaceca5452c697cb0 /config/config.go
parenta1f511368b898ba53ca685dd3f41f2901f295fd3 (diff)
downloadweb-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.go67
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
+}