-
Notifications
You must be signed in to change notification settings - Fork 0
/
context.go
49 lines (41 loc) · 1.1 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
package subcmd
import (
"context"
"flag"
)
type ctxkey int
const (
fsKey ctxkey = iota + 1
subcmdPairListKey
)
func withFlagSet(ctx context.Context, fs *flag.FlagSet) context.Context {
return context.WithValue(ctx, fsKey, fs)
}
// FlagSet produces the [flag.FlagSet] used in a call to a [Subcmd] function.
func FlagSet(ctx context.Context) *flag.FlagSet {
val := ctx.Value(fsKey)
return val.(*flag.FlagSet)
}
type subcmdPair struct {
name string
subcmd Subcmd
}
func subcmdPairList(ctx context.Context) []subcmdPair {
pairListPtr := ctx.Value(subcmdPairListKey)
if pairListPtr == nil {
return nil
}
return *(pairListPtr.(*[]subcmdPair))
}
func addSubcmdPair(ctx context.Context, name string, subcmd Subcmd) context.Context {
var pairListPtr *[]subcmdPair
if pairListPtrVal := ctx.Value(subcmdPairListKey); pairListPtrVal == nil {
var pairList []subcmdPair
pairListPtr = &pairList
ctx = context.WithValue(ctx, subcmdPairListKey, pairListPtr)
} else {
pairListPtr = pairListPtrVal.(*[]subcmdPair)
}
*pairListPtr = append(*pairListPtr, subcmdPair{name: name, subcmd: subcmd})
return ctx
}