-
Notifications
You must be signed in to change notification settings - Fork 9
/
driver.go
90 lines (65 loc) · 1.73 KB
/
driver.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
83
84
85
86
87
88
89
90
package driver
import (
"errors"
"fmt"
"sort"
"strings"
"sync"
iiifcache "github.com/go-iiif/go-iiif/v6/cache"
iiifconfig "github.com/go-iiif/go-iiif/v6/config"
iiifimage "github.com/go-iiif/go-iiif/v6/image"
iiifsource "github.com/go-iiif/go-iiif/v6/source"
)
var (
driversMu sync.RWMutex
drivers = make(map[string]Driver)
)
type Driver interface {
NewImageFromConfigWithSource(*iiifconfig.Config, iiifsource.Source, string) (iiifimage.Image, error)
NewImageFromConfigWithCache(*iiifconfig.Config, iiifcache.Cache, string) (iiifimage.Image, error)
NewImageFromConfig(*iiifconfig.Config, string) (iiifimage.Image, error)
}
func RegisterDriver(name string, driver Driver) {
driversMu.Lock()
defer driversMu.Unlock()
if driver == nil {
panic("iiif: Register driver is nil")
}
nrml_name := normalizeName(name)
if _, dup := drivers[nrml_name]; dup {
panic("index: Register called twice for driver " + name)
}
drivers[nrml_name] = driver
}
func normalizeName(name string) string {
return strings.ToUpper(name)
}
func unregisterAllDrivers() {
driversMu.Lock()
defer driversMu.Unlock()
drivers = make(map[string]Driver)
}
func Drivers() []string {
driversMu.RLock()
defer driversMu.RUnlock()
var list []string
for name := range drivers {
list = append(list, name)
}
sort.Strings(list)
return list
}
func NewDriver(name string) (Driver, error) {
driversMu.RLock()
defer driversMu.RUnlock()
nrml_name := normalizeName(name)
dr, ok := drivers[nrml_name]
if !ok {
msg := fmt.Sprintf("Invalid go-iiif driver '%s' ('%s')", name, nrml_name)
return nil, errors.New(msg)
}
return dr, nil
}
func NewDriverFromConfig(config *iiifconfig.Config) (Driver, error) {
return NewDriver(config.Graphics.Source.Name)
}