39 lines
587 B
Go
39 lines
587 B
Go
|
package ln
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
)
|
||
|
|
||
|
type ctxKey int
|
||
|
|
||
|
const (
|
||
|
fKey = iota
|
||
|
)
|
||
|
|
||
|
// WithF stores or appends a given F instance into a context.
|
||
|
func WithF(ctx context.Context, f F) context.Context {
|
||
|
pf, ok := FFromContext(ctx)
|
||
|
if !ok {
|
||
|
return context.WithValue(ctx, fKey, f)
|
||
|
}
|
||
|
|
||
|
pf.Extend(f)
|
||
|
|
||
|
return context.WithValue(ctx, fKey, pf)
|
||
|
}
|
||
|
|
||
|
// FFromContext fetches the `F` out of the context if it exists.
|
||
|
func FFromContext(ctx context.Context) (F, bool) {
|
||
|
fvp := ctx.Value(fKey)
|
||
|
if fvp == nil {
|
||
|
return nil, false
|
||
|
}
|
||
|
|
||
|
f, ok := fvp.(F)
|
||
|
if !ok {
|
||
|
return nil, false
|
||
|
}
|
||
|
|
||
|
return f, true
|
||
|
}
|