-
Notifications
You must be signed in to change notification settings - Fork 1
/
storage.go
82 lines (71 loc) · 1.79 KB
/
storage.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package config
import (
"encoding/json"
"fmt"
)
type StorageDriver string
const (
LocalStorageDriver StorageDriver = "local"
S3StorageDriver StorageDriver = "s3"
)
type StorageOptions interface {
Driver() StorageDriver
}
type LocalStorageOptions struct {
FilesDir string `json:"files_dir"`
}
func (o LocalStorageOptions) Driver() StorageDriver {
return LocalStorageDriver
}
type S3StorageOptions struct {
Region string `json:"region"`
AccessKeyID string `json:"access_key_id"`
SecretAccessKey string `json:"secret_access_key"`
Endpoint string `json:"endpoint"`
Bucket string `json:"bucket"`
PathPrefix string `json:"path_prefix,omitempty"`
UsePathStyle bool `json:"use_path_style,omitempty"`
}
func (o S3StorageOptions) Driver() StorageDriver {
return S3StorageDriver
}
// Storage contains storage config.
type Storage struct {
Options StorageOptions `json:"options"`
}
func (c Storage) MarshalJSON() ([]byte, error) {
cfg := struct {
Driver StorageDriver `json:"driver"`
Options StorageOptions `json:"options"`
}{
Driver: c.Options.Driver(),
Options: c.Options,
}
return json.Marshal(cfg)
}
func (c *Storage) UnmarshalJSON(bytes []byte) error {
var cfg struct {
Driver StorageDriver `json:"driver"`
Options json.RawMessage `json:"options"`
}
if err := json.Unmarshal(bytes, &cfg); err != nil {
return err
}
switch cfg.Driver {
case LocalStorageDriver:
var options LocalStorageOptions
if err := json.Unmarshal(cfg.Options, &options); err != nil {
return err
}
c.Options = options
case S3StorageDriver:
var options S3StorageOptions
if err := json.Unmarshal(cfg.Options, &options); err != nil {
return err
}
c.Options = options
default:
return fmt.Errorf("driver %q is not supported", cfg.Driver)
}
return nil
}