From ed5822058de26e8c53c20680b5d4fa0fe49389f4 Mon Sep 17 00:00:00 2001 From: Virgil Date: Thu, 2 Apr 2026 07:54:27 +0000 Subject: [PATCH] refactor(api): streamline spec export paths Co-Authored-By: Virgil --- cmd/api/cmd_sdk.go | 13 ++++++++----- export.go | 22 ++++++++++++++-------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/cmd/api/cmd_sdk.go b/cmd/api/cmd_sdk.go index 3559b6c..caa6b74 100644 --- a/cmd/api/cmd_sdk.go +++ b/cmd/api/cmd_sdk.go @@ -68,14 +68,17 @@ func addSDKCommand(parent *cli.Command) { if err != nil { return coreerr.E("sdk.Generate", "create temp spec file", err) } - defer coreio.Local.Delete(tmpFile.Name()) + tmpPath := tmpFile.Name() + if err := tmpFile.Close(); err != nil { + _ = coreio.Local.Delete(tmpPath) + return coreerr.E("sdk.Generate", "close temp spec file", err) + } + defer coreio.Local.Delete(tmpPath) - if err := goapi.ExportSpecIter(tmpFile, "json", builder, groups); err != nil { - tmpFile.Close() + if err := goapi.ExportSpecToFileIter(tmpPath, "json", builder, groups); err != nil { return coreerr.E("sdk.Generate", "generate spec", err) } - tmpFile.Close() - specFile = tmpFile.Name() + specFile = tmpPath } gen := &goapi.SDKGenerator{ diff --git a/export.go b/export.go index ba1c1db..d5d68d8 100644 --- a/export.go +++ b/export.go @@ -75,7 +75,9 @@ func writeSpec(w io.Writer, format string, data []byte, op string) error { // // _ = api.ExportSpecToFile("./api/openapi.yaml", "yaml", builder, engine.Groups()) func ExportSpecToFile(path, format string, builder *SpecBuilder, groups []RouteGroup) error { - return exportSpecToFile(path, format, builder, groups, "ExportSpecToFile") + return exportSpecToFile(path, "ExportSpecToFile", func(w io.Writer) error { + return ExportSpec(w, format, builder, groups) + }) } // ExportSpecToFileIter writes the OpenAPI spec from an iterator to the given path. @@ -85,10 +87,12 @@ func ExportSpecToFile(path, format string, builder *SpecBuilder, groups []RouteG // // _ = api.ExportSpecToFileIter("./api/openapi.json", "json", builder, api.RegisteredSpecGroupsIter()) func ExportSpecToFileIter(path, format string, builder *SpecBuilder, groups iter.Seq[RouteGroup]) error { - return exportSpecToFile(path, format, builder, collectRouteGroups(groups), "ExportSpecToFileIter") + return exportSpecToFile(path, "ExportSpecToFileIter", func(w io.Writer) error { + return ExportSpecIter(w, format, builder, groups) + }) } -func exportSpecToFile(path, format string, builder *SpecBuilder, groups []RouteGroup, op string) error { +func exportSpecToFile(path, op string, write func(io.Writer) error) (err error) { if err := coreio.Local.EnsureDir(filepath.Dir(path)); err != nil { return coreerr.E(op, "create directory", err) } @@ -96,12 +100,14 @@ func exportSpecToFile(path, format string, builder *SpecBuilder, groups []RouteG if err != nil { return coreerr.E(op, "create file", err) } - if err := ExportSpec(f, format, builder, groups); err != nil { - return err - } + defer func() { + if closeErr := f.Close(); closeErr != nil && err == nil { + err = coreerr.E(op, "close file", closeErr) + } + }() - if err := f.Close(); err != nil { - return coreerr.E(op, "close file", err) + if err = write(f); err != nil { + return err } return nil }