-
Notifications
You must be signed in to change notification settings - Fork 3
/
context.go
57 lines (51 loc) · 1.41 KB
/
context.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
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}})
}
t.tags[key] = val
return ctx
}
// 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
}