From 924c717ed86c9f6fa23973d8b36cc2b3904ebb4c Mon Sep 17 00:00:00 2001 From: SayaAndy Date: Wed, 30 Jul 2025 20:58:44 +0700 Subject: feat: basic metadata extractor --- config/config.go | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ config/config.json | 13 +++++++++ 2 files changed, 96 insertions(+) create mode 100644 config/config.go create mode 100644 config/config.json (limited to 'config') 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 -- cgit v1.3.1+13