Diffstat (limited to 'config/config.go')
| -rw-r--r-- | config/config.go | 78 |
1 files changed, 74 insertions, 4 deletions
diff --git a/config/config.go b/config/config.go index 515047e..64d2e76 100644 --- a/config/config.go +++ b/config/config.go @@ -10,13 +10,67 @@ import ( ) type Config struct { - LogLevel slog.Level `json:"LogLevel" validate:"required"` - Storage StorageConfig `json:"Storage" validate:"required"` - MaxConcurrentJobs int `json:"MaxConcurrentJobs" validate:"required,min=1"` + 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"` } @@ -39,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) } @@ -54,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 { |