-
Notifications
You must be signed in to change notification settings - Fork 4
/
factory.go
49 lines (43 loc) · 1.02 KB
/
factory.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
package storage
import (
"fmt"
"net/url"
"strings"
"sync"
)
var (
factoriesMu sync.RWMutex
factories = make(map[string]BlobStoreFactory)
)
type BlobStoreFactory func(url.URL) (BlobStore, error)
func NewBlobStore(u url.URL) (BlobStore, error) {
scheme := strings.ToLower(u.Scheme)
factoriesMu.RLock()
factory, ok := factories[scheme]
factoriesMu.RUnlock()
if !ok {
return nil, fmt.Errorf("stroage: unknown scheme %q (forgotten import?)", scheme)
}
return factory(u)
}
func RegisterFactory(scheme string, factory BlobStoreFactory) {
scheme = strings.ToLower(scheme)
factoriesMu.Lock()
defer factoriesMu.Unlock()
if nil == factory {
panic("storage: RegisterFactory passed a nil factory")
}
if _, dup := factories[scheme]; dup {
panic("storage: RegisterFactory called twice for factory " + scheme)
}
factories[scheme] = factory
}
func SupportedSchemes() []string {
factoriesMu.RLock()
defer factoriesMu.RUnlock()
var list []string
for scheme := range factories {
list = append(list, scheme)
}
return list
}