diff --git a/README.md b/README.md index dc42ec5..263b9f9 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ logger to carry `module` and `path` automatically. func NewPool(ctx context.Context, id string, handler slog.Handler) (*Pool, error) { ctx = component.MustNew(ctx, "honeybee", "outbound_pool") - c, _ := component.Get(ctx) + c := component.FromContext(ctx) logger := slog.New(handler).With(slog.Any("component", c), slog.String("pool_id", id)) return &Pool{ctx: ctx, logger: logger}, nil @@ -64,7 +64,7 @@ path. No parent identifiers need to be passed as arguments. func NewWorker(ctx context.Context, id string, handler slog.Handler) (*Worker, error) { ctx = component.MustExtend(ctx, "outbound_worker") - c, _ := component.Get(ctx) + c := component.FromContext(ctx) logger := slog.New(handler).With(slog.Any("component", c), slog.Any("peer_id", id)) return &Worker{ctx: ctx, logger: logger}, nil @@ -85,8 +85,8 @@ component is a programming error that should halt execution immediately. **Generic Output**: -`GetFields` provides the component fields as a `map[string]string` for non-slog -consumers such as OpenTelemetry or Prometheus. +`FieldsFromContext` provides the component fields as a `map[string]string` for non-slog +consumers such as OpenTelemetry or Prometheus. It returns `nil` if no component is present. ## Testing diff --git a/main.go b/main.go index f35c2fa..2683616 100644 --- a/main.go +++ b/main.go @@ -42,23 +42,25 @@ func insert(ctx context.Context, module string, name string, path []string) cont }) } -// Get retrieves the current component from the context; returns false if none is present. -func Get(ctx context.Context) (Component, bool) { - t, ok := ctx.Value(storageKey).(component) - return t, ok +// FromContext retrieves the current component from the context; returns nil if none is present. +func FromContext(ctx context.Context) Component { + c, ok := ctx.Value(storageKey).(component) + if !ok { + return nil + } + return c } -// GetFields returns the component as a string map with keys "module" and "path". -func GetFields(ctx context.Context) (map[string]string, bool) { - c, ok := Get(ctx) - if !ok { - return nil, false +// FieldsFromContext returns the component as a string map with keys "module" and "path"; returns nil if none is present. +func FieldsFromContext(ctx context.Context) map[string]string { + c := FromContext(ctx) + if c == nil { + return nil } - return map[string]string{ "module": c.Module(), "path": c.PathString(), - }, true + } } // New sets a new component on the context, resetting any existing component. @@ -81,8 +83,8 @@ func Extend(ctx context.Context, name string) (context.Context, error) { return nil, fmt.Errorf("context is nil") } - c, ok := Get(ctx) - if !ok { + c := FromContext(ctx) + if c == nil { return nil, fmt.Errorf("missing parent component") } @@ -113,8 +115,8 @@ func MustExtend(ctx context.Context, name string) context.Context { panic("context is nil") } - c, ok := Get(ctx) - if !ok { + c := FromContext(ctx) + if c == nil { panic("missing parent component") } diff --git a/main_test.go b/main_test.go index e1f7556..aaa7257 100644 --- a/main_test.go +++ b/main_test.go @@ -22,8 +22,8 @@ func TestNew(t *testing.T) { if err != nil { t.Fatalf("expected no error, got %v", err) } - c, ok := Get(ctx) - if !ok { + c := FromContext(ctx) + if c == nil { t.Fatal("expected component in context") } if c.Module() != "mymodule" { @@ -58,8 +58,8 @@ func TestExtend(t *testing.T) { if err != nil { t.Fatalf("expected no error, got %v", err) } - c, ok := Get(ctx) - if !ok { + c := FromContext(ctx) + if c == nil { t.Fatal("expected component in context") } if c.Module() != "mymodule" { @@ -87,28 +87,25 @@ func TestExtend(t *testing.T) { }) } -func TestGet(t *testing.T) { - _, ok := Get(context.Background()) - if ok { +func TestFromContext(t *testing.T) { + if FromContext(context.Background()) != nil { t.Fatal("expected no component on bare context") } ctx := MustNew(context.Background(), "mymodule", "mycomponent") - _, ok = Get(ctx) - if !ok { + if FromContext(ctx) == nil { t.Fatal("expected component in context") } } -func TestGetFields(t *testing.T) { - _, ok := GetFields(context.Background()) - if ok { +func TestFieldsFromContext(t *testing.T) { + if FieldsFromContext(context.Background()) != nil { t.Fatal("expected no fields on bare context") } ctx := MustNew(context.Background(), "mymodule", "mycomponent") - fields, ok := GetFields(ctx) - if !ok { + fields := FieldsFromContext(ctx) + if fields == nil { t.Fatal("expected fields in context") } if fields["module"] != "mymodule" { @@ -121,7 +118,7 @@ func TestGetFields(t *testing.T) { func TestLogValue(t *testing.T) { ctx := MustNew(context.Background(), "mymodule", "mycomponent") - c, _ := Get(ctx) + c := FromContext(ctx) v := c.LogValue() attrs := v.Group() if len(attrs) != 2 {