summaryrefslogtreecommitdiff
path: root/config/config.go
diff refs
from: back
to: back
| flip
diff options
context:
space:
mode:
Diffstat (limited to 'config/config.go')
-rw-r--r--config/config.go160
1 files changed, 127 insertions, 33 deletions
diff --git a/config/config.go b/config/config.go
index 5df29df..06fa94f 100644
--- a/config/config.go
+++ b/config/config.go
@@ -3,28 +3,33 @@ package config
import (
"encoding/json"
"fmt"
+ "log/slog"
"os"
"github.com/go-playground/validator/v10"
)
type Config struct {
- Input InputConfig `json:"Input" validate:"required"`
- Processor ProcessorConfig `json:"Processor" validate:"required"`
- Output OutputConfig `json:"Output" validate:"required"`
+ Input InputConfig `json:"Input" validate:"required"`
+ Converters []ConverterConfig `json:"Converters" validate:"required"`
+ MaxProcessThreads int `json:"MaxProcessThreads" validate:"required,min=1"`
+ MaxPreProcessThreads int `json:"MaxPreProcessThreads" validate:"min=1;gtefield=MaxProcessThreads"`
+ LogLevel slog.Level `json:"LogLevel" validate:"required"`
}
type InputConfig struct {
- Storage StorageConfig `json:"Storage" validate:"required"`
- KnownExtensions []string `json:"KnownExtensions" validate:"required,min=0,dive,min=1"`
+ Storage InputStorageConfig `json:"Storage" validate:"required"`
+ KnownExtensions []string `json:"KnownExtensions" validate:"required,min=0,dive,min=1"`
+ CacheProcessed bool `json:"CacheProcessed"`
+ CacheProcessedCsvPath string `json:"CacheProcessedCsvPath" validate:"filepath"`
}
-type StorageConfig struct {
- Type string `json:"Type" validate:"required,oneof=b2 local"`
+type InputStorageConfig struct {
+ Type string `json:"Type" validate:"required,oneof=b2 s3 local-unix"`
Config any `json:"Config" validate:"required"`
}
-func (sc *StorageConfig) UnmarshalJSON(data []byte) error {
+func (sc *InputStorageConfig) UnmarshalJSON(data []byte) error {
var tmp struct {
Type string `json:"Type"`
Config json.RawMessage `json:"Config"`
@@ -43,12 +48,18 @@ func (sc *StorageConfig) UnmarshalJSON(data []byte) error {
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)
+ case "s3":
+ var s3Config S3Config
+ if err := json.Unmarshal(tmp.Config, &s3Config); err != nil {
+ return fmt.Errorf("unmarshal S3Config: %w", err)
}
- sc.Config = &localConfig
+ sc.Config = &s3Config
+ case "local-unix":
+ var localUnixConfig InputLocalUnixConfig
+ if err := json.Unmarshal(tmp.Config, &localUnixConfig); err != nil {
+ return fmt.Errorf("unmarshal LocalUnixConfig: %w", err)
+ }
+ sc.Config = &localUnixConfig
default:
return fmt.Errorf("unsupported storage type: %s", tmp.Type)
}
@@ -56,27 +67,17 @@ func (sc *StorageConfig) UnmarshalJSON(data []byte) error {
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 ConverterConfig struct {
+ Type string `json:"Type" validate:"required,oneof=webp jpeg"`
+ Config any `json:"Config" validate:"required"`
+ Output OutputConfig `json:"Output" validate:"required"`
}
-type ProcessorConfig struct {
- Type string `json:"Type" validate:"required,oneof=webp"`
- Config any `json:"Config" validate:"required"`
-}
-
-func (pc *ProcessorConfig) UnmarshalJSON(data []byte) error {
+func (pc *ConverterConfig) UnmarshalJSON(data []byte) error {
var tmp struct {
Type string `json:"Type"`
Config json.RawMessage `json:"Config"`
+ Output OutputConfig `json:"Output"`
}
if err := json.Unmarshal(data, &tmp); err != nil {
@@ -84,6 +85,7 @@ func (pc *ProcessorConfig) UnmarshalJSON(data []byte) error {
}
pc.Type = tmp.Type
+ pc.Output = tmp.Output
switch tmp.Type {
case "webp":
@@ -92,6 +94,12 @@ func (pc *ProcessorConfig) UnmarshalJSON(data []byte) error {
return fmt.Errorf("unmarshal WebpConfig: %w", err)
}
pc.Config = &webpConfig
+ case "jpeg":
+ var jpegConfig JpegConfig
+ if err := json.Unmarshal(tmp.Config, &jpegConfig); err != nil {
+ return fmt.Errorf("unmarshal JpegConfig: %w", err)
+ }
+ pc.Config = &jpegConfig
default:
return fmt.Errorf("unsupported storage type: %s", tmp.Type)
}
@@ -101,16 +109,96 @@ func (pc *ProcessorConfig) UnmarshalJSON(data []byte) error {
type WebpConfig struct {
Quality int `json:"Quality" validate:"required,min=1,max=100"`
- Size SizeConfig `json:"Size" validate:"required"`
+ Size SizeConfig `json:"Size"`
+}
+
+type JpegConfig struct {
+ ExtensionName string `json:"ExtensionName" validate:"alpha"`
+ Quality int `json:"Quality" validate:"required,min=1,max=100"`
+ Size SizeConfig `json:"Size"`
}
type SizeConfig struct {
- MaxWidth int `json:"MaxWidth" validate:"required,min=0"`
- MaxHeight int `json:"MaxHeight" validate:"required,min=0"`
+ MaxWidth int `json:"MaxWidth"`
+ MaxHeight int `json:"MaxHeight"`
+}
+
+type OutputStorageConfig struct {
+ Type string `json:"Type" validate:"required,oneof=b2 s3 local-unix"`
+ Config any `json:"Config" validate:"required"`
+}
+
+func (sc *OutputStorageConfig) 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 "s3":
+ var s3Config S3Config
+ if err := json.Unmarshal(tmp.Config, &s3Config); err != nil {
+ return fmt.Errorf("unmarshal S3Config: %w", err)
+ }
+ sc.Config = &s3Config
+ case "local-unix":
+ var localUnixConfig OutputLocalUnixConfig
+ if err := json.Unmarshal(tmp.Config, &localUnixConfig); err != nil {
+ return fmt.Errorf("unmarshal LocalUnixConfig: %w", err)
+ }
+ sc.Config = &localUnixConfig
+ 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 S3Config struct {
+ BucketName string `json:"BucketName" validate:"required,min=1"`
+ Region string `json:"Region" validate:"required,min=1"`
+ Prefix string `json:"Prefix"`
+ Endpoint string `json:"Endpoint"`
+ UsePathStyle bool `json:"UsePathStyle"`
+ AccessKeyID string `json:"AccessKeyID"`
+ SecretAccessKey string `json:"SecretAccessKey"`
+}
+
+type InputLocalUnixConfig struct {
+ MaxDepth int `json:"MaxDepth" validate:"required,min=0"`
+ Path string `json:"Path" validate:"required,min=1"`
}
type OutputConfig struct {
- Storage StorageConfig `json:"Storage" validate:"required"`
+ RewriteOn string `json:"RewriteOn" validate:"oneof=Never UnequalHashInCache Always"`
+ Storage OutputStorageConfig `json:"Storage" validate:"required"`
+}
+
+type OutputLocalUnixConfig struct {
+ Path string `json:"Path" validate:"required,min=1,dirpath"`
+ DirPermissionMode string `json:"DirPermissionMode" validate:"required,min=3"`
+ FilePermissionMode string `json:"FilePermissionMode" validate:"required,min=3"`
+ AttributesImplementation string `json:"AttributesImplementation" validate:"required,oneof=xattr none"`
}
func LoadConfig(path string, config *Config) error {
@@ -125,6 +213,12 @@ func LoadConfig(path string, config *Config) error {
return err
}
+ for i := range config.Converters {
+ if config.Converters[i].Output.RewriteOn == "" {
+ config.Converters[i].Output.RewriteOn = "UnequalHashInCache"
+ }
+ }
+
return nil
}