From ead09ddc9cd9f2da74dfa088f85bdeba757a0f75 Mon Sep 17 00:00:00 2001 From: icc Date: Sun, 31 May 2026 23:04:56 +0800 Subject: [PATCH] fix(ai): default analyzer logger when omitted Signed-off-by: icc --- internal/ai/analyzer.go | 7 ++++++- internal/ai/analyzer_test.go | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/internal/ai/analyzer.go b/internal/ai/analyzer.go index 0ce422a..6d520c2 100644 --- a/internal/ai/analyzer.go +++ b/internal/ai/analyzer.go @@ -7,6 +7,7 @@ import ( "context" "encoding/json" "fmt" + "io" "log/slog" "github.com/optiqor/kerno/internal/doctor" @@ -35,11 +36,15 @@ func NewAnalyzer(cfg AnalyzerConfig) *DefaultAnalyzer { if privacy == "" { privacy = PrivacySummary } + logger := cfg.Logger + if logger == nil { + logger = slog.New(slog.NewTextHandler(io.Discard, nil)) + } return &DefaultAnalyzer{ provider: cfg.Provider, cache: cfg.Cache, privacy: privacy, - logger: cfg.Logger, + logger: logger, } } diff --git a/internal/ai/analyzer_test.go b/internal/ai/analyzer_test.go index 9a2af90..119c5e8 100644 --- a/internal/ai/analyzer_test.go +++ b/internal/ai/analyzer_test.go @@ -76,6 +76,22 @@ func TestAnalyzerHappyPath(t *testing.T) { } } +func TestAnalyzerUsesDiscardLoggerWhenNil(t *testing.T) { + prov := &scriptedProvider{text: `{"summary":"ok"}`} + + a := NewAnalyzer(AnalyzerConfig{Provider: prov}) + if a.logger == nil { + t.Fatal("logger should default when omitted") + } + resp, err := a.Analyze(context.Background(), doctor.AnalysisRequest{Signals: emptySignals()}) + if err != nil { + t.Fatalf("Analyze error: %v", err) + } + if resp.Summary != "ok" { + t.Errorf("Summary = %q, want ok", resp.Summary) + } +} + func TestAnalyzerMarkdownFencedJSON(t *testing.T) { prov := &scriptedProvider{text: "Here you go:\n```json\n{\"summary\":\"ok\"}\n```\n"}