diff options
Diffstat (limited to 'config/config.go')
| -rw-r--r-- | config/config.go | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/config/config.go b/config/config.go new file mode 100644 index 0000000..6d37904 --- /dev/null +++ b/config/config.go @@ -0,0 +1,107 @@ +package config + +import ( + "encoding/json" + "fmt" + "os" + + "github.com/go-playground/validator/v10" +) + +type Config struct { + Input InputConfig `json:"Input" validate:"required"` + Output OutputConfig `json:"Output" validate:"required"` +} + +type InputConfig struct { + Storage StorageConfig `json:"Storage" validate:"required"` +} + +type OutputConfig struct { + Storage StorageConfig `json:"Storage" validate:"required"` + Quality int `json:"Quality" validate:"required,min=1,max=100"` + Size SizeConfig `json:"Size" validate:"required"` +} + +type StorageConfig struct { + Type string `json:"Type" validate:"required,oneof=b2 local"` + 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 + case "local": + var localConfig LocalConfig + if err := json.Unmarshal(tmp.Config, &localConfig); err != nil { + return fmt.Errorf("unmarshal LocalConfig: %w", err) + } + sc.Config = localConfig + 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"` +} + +type LocalConfig struct { + Path string `json:"Path" validate:"required,min=1"` +} + +type SizeConfig struct { + MaxWidth int `json:"MaxWidth" validate:"required,min=0"` + MaxHeight int `json:"MaxHeight" validate:"required,min=0"` +} + +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 +} |