2025-05-05 22:15:44 +02:00

47 lines
1.3 KiB
Go

package protocolstate
import (
"context"
"github.com/rs/xid"
)
// contextKey is a type for context keys
type ContextKey string
type ExecutionContext struct {
ExecutionID string
}
// executionIDKey is the key used to store execution ID in context
const executionIDKey ContextKey = "execution_id"
// WithExecutionID adds an execution ID to the context
func WithExecutionID(ctx context.Context, executionContext *ExecutionContext) context.Context {
return context.WithValue(ctx, executionIDKey, executionContext)
}
// HasExecutionID checks if the context has an execution ID
func HasExecutionContext(ctx context.Context) bool {
_, ok := ctx.Value(executionIDKey).(*ExecutionContext)
return ok
}
// GetExecutionID retrieves the execution ID from the context
// Returns empty string if no execution ID is set
func GetExecutionContext(ctx context.Context) *ExecutionContext {
if id, ok := ctx.Value(executionIDKey).(*ExecutionContext); ok {
return id
}
return nil
}
// WithAutoExecutionContext creates a new context with an automatically generated execution ID
// If the input context already has an execution ID, it will be preserved
func WithAutoExecutionContext(ctx context.Context) context.Context {
if HasExecutionContext(ctx) {
return ctx
}
return WithExecutionID(ctx, &ExecutionContext{ExecutionID: xid.New().String()})
}