Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 19 additions & 13 deletions cmd/oapi-codegen/oapi-codegen.go
Original file line number Diff line number Diff line change
Expand Up @@ -320,21 +320,27 @@ func main() {
opts.NoVCSVersionOverride = &noVCSVersionOverride
}

code, err := codegen.Generate(swagger, opts.Configuration)
if err != nil {
errExit("error generating code: %s\n", err)
code, genErr := codegen.Generate(swagger, opts.Configuration)

// Always emit any generated code to the requested destination, even when
// generation returned an error (e.g. the formatter rejected the output).
// Writing to the output file lets the user inspect the broken source
// directly instead of having it interleaved with stderr.
if code != "" {
if opts.OutputFile != "" {
if err := os.MkdirAll(filepath.Dir(opts.OutputFile), 0o755); err != nil {
errExit("error unable to create directory: %s\n", err)
}
if err := os.WriteFile(opts.OutputFile, []byte(code), 0o644); err != nil {
errExit("error writing generated code to file: %s\n", err)
}
} else {
fmt.Print(code)
}
}

if opts.OutputFile != "" {
if err := os.MkdirAll(filepath.Dir(opts.OutputFile), 0o755); err != nil {
errExit("error unable to create directory: %s\n", err)
}
err = os.WriteFile(opts.OutputFile, []byte(code), 0o644)
if err != nil {
errExit("error writing generated code to file: %s\n", err)
}
} else {
fmt.Print(code)
if genErr != nil {
errExit("error generating code: %s\n", genErr)
}
}

Expand Down
25 changes: 4 additions & 21 deletions pkg/codegen/codegen.go
Original file line number Diff line number Diff line change
Expand Up @@ -517,34 +517,17 @@ func Generate(spec *openapi3.T, opts Configuration) (string, error) {

outBytes, err := imports.Process(opts.PackageName+".go", []byte(goCode), nil)
if err != nil {
// if we don't get a line number
errLine := -1
var scanErr scanner.ErrorList
if errors.As(err, &scanErr) && scanErr.Len() > 0 {
// for now, only return the first error's information
errLine = scanErr[0].Pos.Line
}
return "", fmt.Errorf("error formatting Go code:\n%s\nerror was: %w", addLineNumbers(goCode, errLine), err)
}
return string(outBytes), nil
}

func addLineNumbers(goCode string, lineWithError int) string {
var out []string
lines := strings.Split(goCode, "\n")
for i, line := range lines {
// lines for humans start at 1
lineNumber := i + 1

errLine := " "
if lineNumber == lineWithError {
errLine = "❗"
if errLine > 0 {
return goCode, fmt.Errorf("error formatting Go code at line %d: %w", errLine, err)
}

out = append(out, fmt.Sprintf("%s%5d: %s", errLine, lineNumber, line))
return goCode, fmt.Errorf("error formatting Go code: %w", err)
}

return strings.Join(out, "\n")
return string(outBytes), nil
}

func GenerateTypeDefinitions(t *template.Template, swagger *openapi3.T, ops []OperationDefinition, excludeSchemas []string) (string, error) {
Expand Down
Loading