-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoption.go
94 lines (74 loc) · 2.24 KB
/
option.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
91
92
93
94
/*
* Copyright (c) 2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package spanner
import (
"cloud.google.com/go/spanner"
"google.golang.org/api/option"
)
const (
// DefaultTable is the default Spanner table name.
DefaultTable = "urls"
// DefaultNumChannels is the default number of channels in the Spanner client.
DefaultNumChannels = 10
)
type backendSettings struct {
table string
config *spanner.ClientConfig
options []option.ClientOption
}
// A BackendOption is an option for a Spanner-based backend.
type BackendOption interface {
Apply(*backendSettings)
}
// WithTable configures the Spanner table; default is "urls".
func WithTable(t string) BackendOption {
return withTable{t}
}
type withTable struct{ t string }
func (w withTable) Apply(o *backendSettings) {
o.table = w.t
}
// WithClientConfig returns a BackendOption that specifies configurations for
// the Spanner client.
func WithClientConfig(c spanner.ClientConfig) BackendOption {
cc := c
return withClientConfig{&cc}
}
type withClientConfig struct{ c *spanner.ClientConfig }
func (w withClientConfig) Apply(o *backendSettings) {
o.config = w.c
}
// WithClientOptions returns a BackendOption that specifies Google API client
// configurations for the Spanner client.
func WithClientOptions(o []option.ClientOption) BackendOption {
return withClientOptions{o}
}
type withClientOptions struct{ o []option.ClientOption }
func (w withClientOptions) Apply(o *backendSettings) {
o.options = w.o
}
func collectSettings(opts ...BackendOption) *backendSettings {
bs := &backendSettings{
table: DefaultTable,
config: &spanner.ClientConfig{
NumChannels: DefaultNumChannels,
},
}
for _, o := range opts {
o.Apply(bs)
}
return bs
}