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
|
|
}
|