Diffstat (limited to 'config')
| -rw-r--r-- | config/config.go | 75 | ||||
| -rw-r--r-- | config/config.json | 13 |
2 files changed, 73 insertions, 15 deletions
diff --git a/config/config.go b/config/config.go index 63c1e0c..64d2e76 100644 --- a/config/config.go +++ b/config/config.go @@ -10,12 +10,67 @@ import ( ) type Config struct { - LogLevel slog.Level `json:"LogLevel" validate:"required"` + LogLevel slog.Level `json:"LogLevel" validate:"required"` + MaxConcurrentJobs int `json:"MaxConcurrentJobs" validate:"required,min=1"` + DraftDir string `json:"DraftDir" validate:"required"` + DraftSuffix string `json:"DraftSuffix" validate:"required"` + Transcoders []TranscoderConfig `json:"Transcoders" validate:"required,min=1,dive"` +} + +type TranscoderConfig struct { + Type string `json:"Type" validate:"required,oneof=sayauz telegram"` + Config any `json:"Config" validate:"required"` +} + +func (tc *TranscoderConfig) 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 + } + + tc.Type = tmp.Type + + switch tmp.Type { + case "sayauz": + var sayauzConfig SayauzConfig + if err := json.Unmarshal(tmp.Config, &sayauzConfig); err != nil { + return fmt.Errorf("unmarshal SayauzConfig: %w", err) + } + tc.Config = &sayauzConfig + case "telegram": + var telegramConfig TelegramConfig + if err := json.Unmarshal(tmp.Config, &telegramConfig); err != nil { + return fmt.Errorf("unmarshal TelegramConfig: %w", err) + } + tc.Config = &telegramConfig + default: + return fmt.Errorf("unsupported transcoder type: %s", tmp.Type) + } + + return nil +} + +type SayauzConfig struct { + Category string `json:"Category" validate:"required,min=1"` Storage StorageConfig `json:"Storage" validate:"required"` } +type TelegramConfig struct { + BotToken string `json:"BotToken" validate:"required,min=1"` + ChannelID int `json:"ChannelID" validate:"required,ne=0"` + GroupID int `json:"GroupID"` + ImageBaseURL string `json:"ImageBaseURL" validate:"required,min=1"` + PreviewBaseURL string `json:"PreviewBaseURL"` + PreviewExtension string `json:"PreviewExtension"` + StateDir string `json:"StateDir" validate:"required,min=1"` +} + type StorageConfig struct { - Type string `json:"Type" validate:"required,oneof=b2"` + Type string `json:"Type" validate:"required,oneof=b2 s3"` Config any `json:"Config" validate:"required"` } @@ -38,6 +93,12 @@ func (sc *StorageConfig) UnmarshalJSON(data []byte) error { 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 default: return fmt.Errorf("unsupported storage type: %s", tmp.Type) } @@ -53,6 +114,16 @@ type B2Config struct { 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"` +} + func LoadConfig(path string, config *Config) error { fileBytes, err := os.ReadFile(path) if err != nil { diff --git a/config/config.json b/config/config.json deleted file mode 100644 index 9a49b76..0000000 --- a/config/config.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "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 |