@@ -91,134 +91,172 @@ func getStorage(rootCfg ConfigProvider, name, typ string, sec ConfigSection) (*S
91
91
return nil , errors .New ("no name for storage" )
92
92
}
93
93
94
- var targetSec ConfigSection
95
- // check typ first
96
- if typ != "" {
97
- var err error
98
- targetSec , err = rootCfg .GetSection (storageSectionName + "." + typ )
99
- if err != nil {
100
- if ! IsValidStorageType (StorageType (typ )) {
101
- return nil , fmt .Errorf ("get section via storage type %q failed: %v" , typ , err )
102
- }
94
+ targetSec , tp , err := getStorageTargetSection (rootCfg , name , typ , sec )
95
+ if err != nil {
96
+ return nil , err
97
+ }
98
+
99
+ overrideSec := getStorageOverrideSection (rootCfg , targetSec , sec , tp , name )
100
+
101
+ targetType := targetSec .Key ("STORAGE_TYPE" ).String ()
102
+ switch targetType {
103
+ case string (LocalStorageType ):
104
+ return getStorageForLocal (targetSec , overrideSec , tp , name )
105
+ case string (MinioStorageType ):
106
+ return getStorageForMinio (targetSec , overrideSec , tp , name )
107
+ default :
108
+ return nil , fmt .Errorf ("unsupported storage type %q" , targetType )
109
+ }
110
+ }
111
+
112
+ type targetSecType int
113
+
114
+ const (
115
+ targetSecIsTyp targetSecType = iota // target section is [storage.type] which the type from parameter
116
+ targetSecIsStorage // target section is [storage]
117
+ targetSecIsDefault // target section is the default value
118
+ targetSecIsStorageWithName // target section is [storage.name]
119
+ targetSecIsSec // target section is from the name seciont [name]
120
+ )
121
+
122
+ func getStorageSectionByType (rootCfg ConfigProvider , typ string ) (ConfigSection , targetSecType , error ) {
123
+ targetSec , err := rootCfg .GetSection (storageSectionName + "." + typ )
124
+ if err != nil {
125
+ if ! IsValidStorageType (StorageType (typ )) {
126
+ return nil , 0 , fmt .Errorf ("get section via storage type %q failed: %v" , typ , err )
103
127
}
104
- if targetSec != nil {
105
- targetType := targetSec .Key ("STORAGE_TYPE" ).String ()
106
- if targetType == "" {
107
- if ! IsValidStorageType (StorageType (typ )) {
108
- return nil , fmt .Errorf ("unknow storage type %q" , typ )
109
- }
110
- targetSec .Key ("STORAGE_TYPE" ).SetValue (typ )
111
- } else if ! IsValidStorageType (StorageType (targetType )) {
112
- return nil , fmt .Errorf ("unknow storage type %q for section storage.%v" , targetType , typ )
113
- }
128
+ // if typ is a valid storage type, but there is no [storage.local] or [storage.minio] section
129
+ // it's not an error
130
+ return nil , 0 , nil
131
+ }
132
+
133
+ targetType := targetSec .Key ("STORAGE_TYPE" ).String ()
134
+ if targetType == "" {
135
+ if ! IsValidStorageType (StorageType (typ )) {
136
+ return nil , 0 , fmt .Errorf ("unknow storage type %q" , typ )
114
137
}
138
+ targetSec .Key ("STORAGE_TYPE" ).SetValue (typ )
139
+ } else if ! IsValidStorageType (StorageType (targetType )) {
140
+ return nil , 0 , fmt .Errorf ("unknow storage type %q for section storage.%v" , targetType , typ )
115
141
}
116
142
117
- if targetSec == nil && sec != nil {
118
- secTyp := sec .Key ("STORAGE_TYPE" ).String ()
119
- if IsValidStorageType (StorageType (secTyp )) {
120
- targetSec = sec
121
- } else if secTyp != "" {
122
- targetSec , _ = rootCfg .GetSection (storageSectionName + "." + secTyp )
143
+ return targetSec , targetSecIsTyp , nil
144
+ }
145
+
146
+ func getStorageTargetSection (rootCfg ConfigProvider , name , typ string , sec ConfigSection ) (ConfigSection , targetSecType , error ) {
147
+ // check typ first
148
+ if typ == "" {
149
+ if sec != nil { // check sec's type secondly
150
+ typ = sec .Key ("STORAGE_TYPE" ).String ()
151
+ if IsValidStorageType (StorageType (typ )) {
152
+ if targetSec , _ := rootCfg .GetSection (storageSectionName + "." + typ ); targetSec == nil {
153
+ return sec , targetSecIsSec , nil
154
+ }
155
+ }
123
156
}
124
157
}
125
158
126
- targetSecIsStoragename := false
127
- storageNameSec , _ := rootCfg . GetSection ( storageSectionName + "." + name )
128
- if targetSec = = nil {
129
- targetSec = storageNameSec
130
- targetSecIsStoragename = storageNameSec != nil
159
+ if typ != "" {
160
+ targetSec , tp , err := getStorageSectionByType ( rootCfg , typ )
161
+ if targetSec != nil || err ! = nil {
162
+ return targetSec , tp , err
163
+ }
131
164
}
132
165
133
- if targetSec == nil {
134
- targetSec = getDefaultStorageSection ( rootCfg )
135
- } else {
166
+ // check stoarge name thirdly
167
+ targetSec , _ := rootCfg . GetSection ( storageSectionName + "." + name )
168
+ if targetSec != nil {
136
169
targetType := targetSec .Key ("STORAGE_TYPE" ).String ()
137
170
switch {
138
171
case targetType == "" :
139
- if targetSec != storageNameSec && storageNameSec != nil {
140
- targetSec = storageNameSec
141
- targetSecIsStoragename = true
142
- if targetSec .Key ("STORAGE_TYPE" ).String () == "" {
143
- return nil , fmt .Errorf ("storage section %s.%s has no STORAGE_TYPE" , storageSectionName , name )
144
- }
145
- } else {
146
- if targetSec .Key ("PATH" ).String () == "" {
147
- targetSec = getDefaultStorageSection (rootCfg )
148
- } else {
149
- targetSec .Key ("STORAGE_TYPE" ).SetValue ("local" )
150
- }
172
+ if targetSec .Key ("PATH" ).String () == "" { // both storage type and path are empty, use default
173
+ return getDefaultStorageSection (rootCfg ), targetSecIsDefault , nil
151
174
}
175
+
176
+ targetSec .Key ("STORAGE_TYPE" ).SetValue ("local" )
152
177
default :
153
- newTargetSec , _ := rootCfg .GetSection (storageSectionName + "." + targetType )
154
- if newTargetSec == nil {
155
- if ! IsValidStorageType (StorageType (targetType )) {
156
- return nil , fmt .Errorf ("invalid storage section %s.%q" , storageSectionName , targetType )
157
- }
158
- } else {
159
- targetSec = newTargetSec
160
- if IsValidStorageType (StorageType (targetType )) {
161
- tp := targetSec .Key ("STORAGE_TYPE" ).String ()
162
- if tp == "" {
163
- targetSec .Key ("STORAGE_TYPE" ).SetValue (targetType )
164
- }
165
- }
178
+ targetSec , tp , err := getStorageSectionByType (rootCfg , targetType )
179
+ if targetSec != nil || err != nil {
180
+ return targetSec , tp , err
166
181
}
167
182
}
183
+
184
+ return targetSec , targetSecIsStorageWithName , nil
168
185
}
169
186
170
- targetType := targetSec .Key ("STORAGE_TYPE" ).String ()
171
- if ! IsValidStorageType (StorageType (targetType )) {
172
- return nil , fmt .Errorf ("invalid storage type %q" , targetType )
187
+ return getDefaultStorageSection (rootCfg ), targetSecIsDefault , nil
188
+ }
189
+
190
+ // getStorageOverrideSection override section will be read SERVE_DIRECT, PATH, MINIO_BASE_PATH, MINIO_BUCKET to override the targetsec when possible
191
+ func getStorageOverrideSection (rootConfig ConfigProvider , targetSec , sec ConfigSection , targetSecType targetSecType , name string ) ConfigSection {
192
+ if targetSecType == targetSecIsSec {
193
+ return nil
173
194
}
174
195
175
- // extra config section will be read SERVE_DIRECT, PATH, MINIO_BASE_PATH, MINIO_BUCKET to override the targetsec when possible
176
- extraConfigSec := sec
177
- if extraConfigSec == nil {
178
- extraConfigSec = storageNameSec
196
+ if sec != nil {
197
+ return sec
179
198
}
180
199
181
- var storage Storage
182
- storage .Type = StorageType (targetType )
200
+ if targetSecType != targetSecIsStorageWithName {
201
+ nameSec , _ := rootConfig .GetSection (storageSectionName + "." + name )
202
+ return nameSec
203
+ }
204
+ return nil
205
+ }
183
206
184
- switch targetType {
185
- case string (LocalStorageType ):
186
- targetPath := ConfigSectionKeyString (targetSec , "PATH" , "" )
187
- if targetPath == "" {
188
- targetPath = AppDataPath
189
- } else if ! filepath .IsAbs (targetPath ) {
190
- targetPath = filepath .Join (AppDataPath , targetPath )
191
- }
207
+ func getStorageForLocal (targetSec , overrideSec ConfigSection , tp targetSecType , name string ) (* Storage , error ) {
208
+ storage := Storage {
209
+ Type : StorageType (targetSec .Key ("STORAGE_TYPE" ).String ()),
210
+ }
192
211
193
- var fallbackPath string
194
- if targetSecIsStoragename {
195
- fallbackPath = targetPath
196
- } else {
212
+ targetPath := ConfigSectionKeyString (targetSec , "PATH" , "" )
213
+ var fallbackPath string
214
+ if targetPath == "" { // no path
215
+ fallbackPath = filepath .Join (AppDataPath , name )
216
+ } else {
217
+ if tp == targetSecIsStorage || tp == targetSecIsDefault {
197
218
fallbackPath = filepath .Join (targetPath , name )
219
+ } else {
220
+ fallbackPath = targetPath
221
+ }
222
+ if ! filepath .IsAbs (fallbackPath ) {
223
+ fallbackPath = filepath .Join (AppDataPath , fallbackPath )
198
224
}
225
+ }
199
226
200
- if extraConfigSec == nil {
227
+ if overrideSec == nil { // no override section
228
+ storage .Path = fallbackPath
229
+ } else {
230
+ storage .Path = ConfigSectionKeyString (overrideSec , "PATH" , "" )
231
+ if storage .Path == "" { // overrideSec has no path
201
232
storage .Path = fallbackPath
202
- } else {
203
- storage .Path = ConfigSectionKeyString (extraConfigSec , "PATH" , fallbackPath )
204
- if ! filepath .IsAbs (storage .Path ) {
233
+ } else if ! filepath .IsAbs (storage .Path ) {
234
+ if targetPath == "" {
235
+ storage .Path = filepath .Join (AppDataPath , storage .Path )
236
+ } else {
205
237
storage .Path = filepath .Join (targetPath , storage .Path )
206
238
}
207
239
}
240
+ }
208
241
209
- case string (MinioStorageType ):
210
- if err := targetSec .MapTo (& storage .MinioConfig ); err != nil {
211
- return nil , fmt .Errorf ("map minio config failed: %v" , err )
212
- }
242
+ return & storage , nil
243
+ }
213
244
214
- storage .MinioConfig .BasePath = name + "/"
245
+ func getStorageForMinio (targetSec , overrideSec ConfigSection , tp targetSecType , name string ) (* Storage , error ) {
246
+ var storage Storage
247
+ storage .Type = StorageType (targetSec .Key ("STORAGE_TYPE" ).String ())
248
+ if err := targetSec .MapTo (& storage .MinioConfig ); err != nil {
249
+ return nil , fmt .Errorf ("map minio config failed: %v" , err )
250
+ }
215
251
216
- if extraConfigSec != nil {
217
- storage .MinioConfig .ServeDirect = ConfigSectionKeyBool (extraConfigSec , "SERVE_DIRECT" , storage .MinioConfig .ServeDirect )
218
- storage .MinioConfig .BasePath = ConfigSectionKeyString (extraConfigSec , "MINIO_BASE_PATH" , storage .MinioConfig .BasePath )
219
- storage .MinioConfig .Bucket = ConfigSectionKeyString (extraConfigSec , "MINIO_BUCKET" , storage .MinioConfig .Bucket )
220
- }
252
+ if storage .MinioConfig .BasePath == "" {
253
+ storage .MinioConfig .BasePath = name + "/"
221
254
}
222
255
256
+ if overrideSec != nil {
257
+ storage .MinioConfig .ServeDirect = ConfigSectionKeyBool (overrideSec , "SERVE_DIRECT" , storage .MinioConfig .ServeDirect )
258
+ storage .MinioConfig .BasePath = ConfigSectionKeyString (overrideSec , "MINIO_BASE_PATH" , storage .MinioConfig .BasePath )
259
+ storage .MinioConfig .Bucket = ConfigSectionKeyString (overrideSec , "MINIO_BUCKET" , storage .MinioConfig .Bucket )
260
+ }
223
261
return & storage , nil
224
262
}
0 commit comments