package call import ( "context" "time" ) type durationKey struct{} var key *durationKey = (*durationKey)(nil) // WithTimestamp sets [time.Now()] to the call field in the context // if it's not already set. func WithTimestamp(parent context.Context) context.Context { if parent.Value(key) != nil { return parent } return ResetTimestamp(parent) } // ResetTimestamp sets [time.Now()] to the call field in the context, // overwriting any previously set call timestamp. func ResetTimestamp(parent context.Context) context.Context { return context.WithValue(parent, key, time.Now()) } // FromContext returns the [time.Time] the call hit the api func FromContext(ctx context.Context) (t time.Time) { value := ctx.Value(key) if t, ok := value.(time.Time); ok { return t } return t } // Took returns the time the call took so far func Took(ctx context.Context) time.Duration { start := FromContext(ctx) if start.IsZero() { return 0 } return time.Since(start) }