From cb16b63b19fa5786717b850bb6eb5c9ccc3d14c8 Mon Sep 17 00:00:00 2001 From: Snider Date: Fri, 20 Mar 2026 13:38:53 +0000 Subject: [PATCH] refactor: replace fmt.Sprintf in errors with Join/Concat All error message string building now uses core string primitives. Remaining fmt usage: code generation (%q quoting) and log formatting (%v). Co-Authored-By: Virgil --- pkg/core/embed.go | 16 ++++++++-------- pkg/core/error.go | 8 ++++---- pkg/core/runtime.go | 4 ++-- pkg/core/service.go | 4 ++-- pkg/core/task.go | 7 ++++--- 5 files changed, 20 insertions(+), 19 deletions(-) diff --git a/pkg/core/embed.go b/pkg/core/embed.go index 259a7dc..c474d79 100644 --- a/pkg/core/embed.go +++ b/pkg/core/embed.go @@ -70,11 +70,11 @@ func GetAsset(group, name string) (string, error) { g, ok := assetGroups[group] assetGroupsMu.RUnlock() if !ok { - return "", E("core.GetAsset", fmt.Sprintf("asset group %q not found", group), nil) + return "", E("core.GetAsset", Join(" ", "asset group", group, "not found"), nil) } data, ok := g.assets[name] if !ok { - return "", E("core.GetAsset", fmt.Sprintf("asset %q not found in group %q", name, group), nil) + return "", E("core.GetAsset", Join(" ", "asset", name, "not found in group", group), nil) } return decompress(data) } @@ -158,7 +158,7 @@ func ScanAssets(filenames []string) ([]ScannedPackage, error) { } fullPath, err := filepath.Abs(filepath.Join(baseDir, group, path)) if err != nil { - scanErr = Wrap(err, "core.ScanAssets", fmt.Sprintf("could not determine absolute path for asset %q in group %q", path, group)) + scanErr = Wrap(err, "core.ScanAssets", Join(" ", "could not determine absolute path for asset", path, "in group", group)) return false } pkg.Assets = append(pkg.Assets, AssetRef{ @@ -176,7 +176,7 @@ func ScanAssets(filenames []string) ([]ScannedPackage, error) { path := strings.Trim(lit.Value, "\"") fullPath, err := filepath.Abs(filepath.Join(baseDir, path)) if err != nil { - scanErr = Wrap(err, "core.ScanAssets", fmt.Sprintf("could not determine absolute path for group %q", path)) + scanErr = Wrap(err, "core.ScanAssets", Join(" ", "could not determine absolute path for group", path)) return false } pkg.Groups = append(pkg.Groups, fullPath) @@ -219,7 +219,7 @@ func GeneratePack(pkg ScannedPackage) (string, error) { for _, groupPath := range pkg.Groups { files, err := getAllFiles(groupPath) if err != nil { - return "", Wrap(err, "core.GeneratePack", fmt.Sprintf("failed to scan asset group %q", groupPath)) + return "", Wrap(err, "core.GeneratePack", Join(" ", "failed to scan asset group", groupPath)) } for _, file := range files { if packed[file] { @@ -227,12 +227,12 @@ func GeneratePack(pkg ScannedPackage) (string, error) { } data, err := compressFile(file) if err != nil { - return "", Wrap(err, "core.GeneratePack", fmt.Sprintf("failed to compress asset %q in group %q", file, groupPath)) + return "", Wrap(err, "core.GeneratePack", Join(" ", "failed to compress asset", file, "in group", groupPath)) } localPath := strings.TrimPrefix(file, groupPath+"/") relGroup, err := filepath.Rel(pkg.BaseDir, groupPath) if err != nil { - return "", Wrap(err, "core.GeneratePack", fmt.Sprintf("could not determine relative path for group %q (base %q)", groupPath, pkg.BaseDir)) + return "", Wrap(err, "core.GeneratePack", Join(" ", "could not determine relative path for group", groupPath, "(base", Concat(pkg.BaseDir, ")"))) } b.WriteString(fmt.Sprintf("\tcore.AddAsset(%q, %q, %q)\n", relGroup, localPath, data)) packed[file] = true @@ -246,7 +246,7 @@ func GeneratePack(pkg ScannedPackage) (string, error) { } data, err := compressFile(asset.FullPath) if err != nil { - return "", Wrap(err, "core.GeneratePack", fmt.Sprintf("failed to compress asset %q", asset.FullPath)) + return "", Wrap(err, "core.GeneratePack", Join(" ", "failed to compress asset", asset.FullPath)) } b.WriteString(fmt.Sprintf("\tcore.AddAsset(%q, %q, %q)\n", asset.Group, asset.Name, data)) packed[asset.FullPath] = true diff --git a/pkg/core/error.go b/pkg/core/error.go index 925c444..1131278 100644 --- a/pkg/core/error.go +++ b/pkg/core/error.go @@ -47,14 +47,14 @@ func (e *Err) Error() string { } if e.Err != nil { if e.Code != "" { - return fmt.Sprintf("%s%s [%s]: %v", prefix, e.Msg, e.Code, e.Err) + return Concat(prefix, e.Msg, " [", e.Code, "]: ", e.Err.Error()) } - return fmt.Sprintf("%s%s: %v", prefix, e.Msg, e.Err) + return Concat(prefix, e.Msg, ": ", e.Err.Error()) } if e.Code != "" { - return fmt.Sprintf("%s%s [%s]", prefix, e.Msg, e.Code) + return Concat(prefix, e.Msg, " [", e.Code, "]") } - return fmt.Sprintf("%s%s", prefix, e.Msg) + return Concat(prefix, e.Msg) } // Unwrap returns the underlying error for use with errors.Is and errors.As. diff --git a/pkg/core/runtime.go b/pkg/core/runtime.go index 4fbbf6f..16334d8 100644 --- a/pkg/core/runtime.go +++ b/pkg/core/runtime.go @@ -25,8 +25,8 @@ func NewServiceRuntime[T any](c *Core, opts T) *ServiceRuntime[T] { return &ServiceRuntime[T]{core: c, opts: opts} } -func (r *ServiceRuntime[T]) Core() *Core { return r.core } -func (r *ServiceRuntime[T]) Opts() T { return r.opts } +func (r *ServiceRuntime[T]) Core() *Core { return r.core } +func (r *ServiceRuntime[T]) Opts() T { return r.opts } func (r *ServiceRuntime[T]) Config() *Config { return r.core.Config() } // --- Lifecycle --- diff --git a/pkg/core/service.go b/pkg/core/service.go index 1c02287..072e1e3 100644 --- a/pkg/core/service.go +++ b/pkg/core/service.go @@ -13,7 +13,7 @@ package core -import "fmt" +// No imports needed — uses package-level string helpers. // Service is a managed component with optional lifecycle. type Service struct { @@ -60,7 +60,7 @@ func (c *Core) Service(name string, service ...Service) Result { return Result{Value: E("core.Service", Concat("service \"", name, "\" not permitted — registry locked"), nil)} } if _, exists := c.services.services[name]; exists { - return Result{Value: E("core.Service", fmt.Sprintf("service %q already registered", name), nil)} + return Result{Value: E("core.Service", Join(" ", "service", name, "already registered"), nil)} } srv := &service[0] diff --git a/pkg/core/task.go b/pkg/core/task.go index 5420d8b..94488c5 100644 --- a/pkg/core/task.go +++ b/pkg/core/task.go @@ -5,8 +5,9 @@ package core import ( - "fmt" + "reflect" "slices" + "strconv" ) // TaskState holds background task state. @@ -22,7 +23,7 @@ func (c *Core) PerformAsync(t Task) string { if c.shutdown.Load() { return "" } - taskID := fmt.Sprintf("task-%d", c.taskIDCounter.Add(1)) + taskID := Concat("task-", strconv.FormatUint(c.taskIDCounter.Add(1), 10)) if tid, ok := t.(TaskWithID); ok { tid.SetTaskID(taskID) } @@ -30,7 +31,7 @@ func (c *Core) PerformAsync(t Task) string { c.wg.Go(func() { result, handled, err := c.PERFORM(t) if !handled && err == nil { - err = E("core.PerformAsync", fmt.Sprintf("no handler found for task type %T", t), nil) + err = E("core.PerformAsync", Join(" ", "no handler found for task type", reflect.TypeOf(t).String()), nil) } _ = c.ACTION(ActionTaskCompleted{TaskID: taskID, Task: t, Result: result, Error: err}) })