-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathcontext.go
More file actions
62 lines (56 loc) · 1.61 KB
/
context.go
File metadata and controls
62 lines (56 loc) · 1.61 KB
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
package sqlcomment
import (
"context"
)
type (
// ctxOptions allows injecting runtime options.
ctxOptions struct {
skip bool // i.e. skip entry.
tags Tags
}
ctxKeyType struct{}
)
var ctxOptionsKey ctxKeyType
// Skip returns a new Context that tells the Driver
// to skip the commenting on Query.
//
// client.T.Query().All(sqlcomment.Skip(ctx))
func Skip(ctx context.Context) context.Context {
c, ok := ctx.Value(ctxOptionsKey).(*ctxOptions)
if !ok {
return context.WithValue(ctx, ctxOptionsKey, &ctxOptions{skip: true})
}
c.skip = true
return ctx
}
// WithTag stores the key and val pair on the context.
// for example, if you want to add `route` tag to your SQL comment, put the url path on request context:
//
// middleware := func(next http.Handler) http.Handler {
// fn := func(w http.ResponseWriter, r *http.Request) {
// ctx := sqlcomment.WithTag(r.Context(), "route", r.URL.Path)
// next.ServeHTTP(w, r.WithContext(ctx))
// }
// return http.HandlerFunc(fn)
// }
func WithTag(ctx context.Context, key, val string) context.Context {
t, ok := ctx.Value(ctxOptionsKey).(*ctxOptions)
if !ok {
return context.WithValue(ctx, ctxOptionsKey, &ctxOptions{tags: Tags{key: val}})
}
// Create a copy of the existing ctxOptions to avoid modifying the original
newTags := make(Tags)
for k, v := range t.tags {
newTags[k] = v
}
newTags[key] = val
return context.WithValue(ctx, ctxOptionsKey, &ctxOptions{tags: newTags})
}
// FromContext returns the tags stored in ctx, if any.
func FromContext(ctx context.Context) Tags {
t, ok := ctx.Value(ctxOptionsKey).(*ctxOptions)
if !ok {
return Tags{}
}
return t.tags
}