github.com/keltia/go-ipfs@v0.3.8-0.20150909044612-210793031c63/thirdparty/eventlog/context.go (about) 1 package eventlog 2 3 import ( 4 "errors" 5 6 "github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context" 7 ) 8 9 type key int 10 11 const metadataKey key = 0 12 13 // ContextWithLoggable returns a derived context which contains the provided 14 // Loggable. Any Events logged with the derived context will include the 15 // provided Loggable. 16 func ContextWithLoggable(ctx context.Context, l Loggable) context.Context { 17 existing, err := MetadataFromContext(ctx) 18 if err != nil { 19 // context does not contain meta. just set the new metadata 20 child := context.WithValue(ctx, metadataKey, Metadata(l.Loggable())) 21 return child 22 } 23 24 merged := DeepMerge(existing, l.Loggable()) 25 child := context.WithValue(ctx, metadataKey, merged) 26 return child 27 } 28 29 func MetadataFromContext(ctx context.Context) (Metadata, error) { 30 value := ctx.Value(metadataKey) 31 if value != nil { 32 metadata, ok := value.(Metadata) 33 if ok { 34 return metadata, nil 35 } 36 } 37 return nil, errors.New("context contains no metadata") 38 }