...
1
2
3
4
5
6
7
8
9
10
11
12
13 package couchdb
14
15 import (
16 "fmt"
17 "net/http"
18 "path"
19 "strings"
20
21 kivik "github.com/go-kivik/kivik/v4"
22 "github.com/go-kivik/kivik/v4/couchdb/chttp"
23 )
24
25 type optionHTTPClient struct {
26 *http.Client
27 }
28
29 func (c optionHTTPClient) Apply(target interface{}) {
30 if client, ok := target.(*http.Client); ok {
31 *client = *c.Client
32 }
33 }
34
35 func (optionHTTPClient) String() string { return "custom *http.Client" }
36
37
38
39
40 func OptionHTTPClient(client *http.Client) kivik.Option {
41 return optionHTTPClient{Client: client}
42 }
43
44
45
46
47 func OptionNoRequestCompression() kivik.Option {
48 return chttp.OptionNoRequestCompression()
49 }
50
51
52
53 func OptionUserAgent(ua string) kivik.Option {
54 return chttp.OptionUserAgent(ua)
55 }
56
57
58
59 func OptionFullCommit() kivik.Option {
60 return chttp.OptionFullCommit()
61 }
62
63
64
65 func OptionIfNoneMatch(value string) kivik.Option {
66 return chttp.OptionIfNoneMatch(value)
67 }
68
69 type partitionedPath struct {
70 path string
71 part string
72 }
73
74 func partPath(path string) *partitionedPath {
75 return &partitionedPath{
76 path: path,
77 }
78 }
79
80 func (pp partitionedPath) String() string {
81 if pp.part == "" {
82 return pp.path
83 }
84 return path.Join("_partition", pp.part, pp.path)
85 }
86
87 type optionPartition string
88
89 func (o optionPartition) Apply(target interface{}) {
90 if ppath, ok := target.(*partitionedPath); ok {
91 ppath.part = string(o)
92 }
93 }
94
95 func (o optionPartition) String() string {
96 return fmt.Sprintf("[partition:%s]", string(o))
97 }
98
99
100
101
102
103
104
105
106 func OptionPartition(partition string) kivik.Option {
107 return optionPartition(partition)
108 }
109
110 type optionNoMultipartPut struct{}
111
112 func (optionNoMultipartPut) Apply(target interface{}) {
113 if putOpts, ok := target.(*putOptions); ok {
114 putOpts.NoMultipartPut = true
115 }
116 }
117
118 func (optionNoMultipartPut) String() string {
119 return "[NoMultipartPut]"
120 }
121
122
123
124
125
126 func OptionNoMultipartPut() kivik.Option {
127 return optionNoMultipartPut{}
128 }
129
130 type optionNoMultipartGet struct{}
131
132 func (optionNoMultipartGet) Apply(target interface{}) {
133 if getOpts, ok := target.(*getOptions); ok {
134 getOpts.noMultipartGet = true
135 }
136 }
137
138 func (optionNoMultipartGet) String() string {
139 return "[NoMultipartGet]"
140 }
141
142
143
144
145
146 func OptionNoMultipartGet() kivik.Option {
147 return optionNoMultipartGet{}
148 }
149
150 type multiOptions []kivik.Option
151
152 var _ kivik.Option = (multiOptions)(nil)
153
154 func (o multiOptions) Apply(t interface{}) {
155 for _, opt := range o {
156 if opt != nil {
157 opt.Apply(t)
158 }
159 }
160 }
161
162 func (o multiOptions) String() string {
163 parts := make([]string, 0, len(o))
164 for _, opt := range o {
165 if part := fmt.Sprintf("%s", opt); part != "" {
166 parts = append(parts, part)
167 }
168 }
169 return strings.Join(parts, ",")
170 }
171
View as plain text