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  }