diff options
| author | 2025-07-30 20:58:44 +0700 | |
|---|---|---|
| committer | 2025-07-30 20:58:44 +0700 | |
| commit | 924c717ed86c9f6fa23973d8b36cc2b3904ebb4c (patch) | |
| tree | 03345edbadc6426961b4501568315601d6114e30 /config | |
| parent | 68d671127bd03c019081599d069810a81f871095 (diff) | |
| download | articlator-924c717ed86c9f6fa23973d8b36cc2b3904ebb4c.tar.gz articlator-924c717ed86c9f6fa23973d8b36cc2b3904ebb4c.zip | |
feat: basic metadata extractor
Diffstat (limited to 'config')
| -rw-r--r-- | config/config.go | 83 | ||||
| -rw-r--r-- | config/config.json | 13 |
2 files changed, 96 insertions, 0 deletions
diff --git a/config/config.go b/config/config.go new file mode 100644 index 0000000..63c1e0c --- /dev/null +++ b/config/config.go @@ -0,0 +1,83 @@ +package config + +import ( + "encoding/json" + "fmt" + "log/slog" + "os" + + "github.com/go-playground/validator/v10" +) + +type Config struct { + LogLevel slog.Level `json:"LogLevel" validate:"required"` + Storage StorageConfig `json:"Storage" validate:"required"` +} + +type StorageConfig struct { + Type string `json:"Type" validate:"required,oneof=b2"` + Config any `json:"Config" validate:"required"` +} + +func (sc *StorageConfig) UnmarshalJSON(data []byte) error { + var tmp struct { + Type string `json:"Type"` + Config json.RawMessage `json:"Config"` + } + + if err := json.Unmarshal(data, &tmp); err != nil { + return err + } + + sc.Type = tmp.Type + + switch tmp.Type { + case "b2": + var b2Config B2Config + if err := json.Unmarshal(tmp.Config, &b2Config); err != nil { + return fmt.Errorf("unmarshal B2Config: %w", err) + } + sc.Config = &b2Config + default: + return fmt.Errorf("unsupported storage type: %s", tmp.Type) + } + + return nil +} + +type B2Config struct { + BucketName string `json:"BucketName" validate:"required,min=1"` + Region string `json:"Region" validate:"required,min=1"` + Prefix string `json:"Prefix"` + KeyID string `json:"KeyID"` + ApplicationKey string `json:"ApplicationKey"` +} + +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 = json.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 +} diff --git a/config/config.json b/config/config.json new file mode 100644 index 0000000..9a49b76 --- /dev/null +++ b/config/config.json @@ -0,0 +1,13 @@ +{ + "LogLevel": "debug", + "Storage": { + "Type": "b2", + "Config": { + "BucketName": "sayana-pages", + "Region": "eu-central-003", + "Prefix": "", + "KeyID": "${B2_KEY_ID}", + "ApplicationKey": "${B2_APPLICATION_KEY}" + } + } +}
\ No newline at end of file |