Skip to content

Commit 1e3fdc1

Browse files
committed
feat(parser): pass filename for making pretty-formatted line numbers
1 parent 236504d commit 1e3fdc1

File tree

8 files changed

+46
-9
lines changed

8 files changed

+46
-9
lines changed

cmd/ogen/main.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ func run() error {
114114
if flag.NArg() == 0 || specPath == "" {
115115
return errors.New("no spec provided")
116116
}
117+
specPath = filepath.Clean(specPath)
117118

118119
switch files, err := os.ReadDir(*targetDir); {
119120
case os.IsNotExist(err):
@@ -138,6 +139,7 @@ func run() error {
138139
_ = logger.Sync()
139140
}()
140141

142+
_, fileName := filepath.Split(specPath)
141143
opts := gen.Options{
142144
NoClient: *noClient,
143145
NoServer: *noServer,
@@ -146,6 +148,7 @@ func run() error {
146148
SkipUnimplemented: *skipUnimplemented,
147149
InferSchemaType: *inferTypes,
148150
AllowRemote: *allowRemote,
151+
Filename: fileName,
149152
Filters: gen.Filters{
150153
PathRegex: filterPath,
151154
Methods: filterMethods,

gen/generator.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ type Options struct {
4949
AllowRemote bool
5050
// Remote is remote reference resolver options.
5151
Remote RemoteOptions
52+
// Filename is a name of the spec file.
53+
//
54+
// Used for error messages.
55+
Filename string
5256
// Filters contains filters to skip operations.
5357
Filters Filters
5458
// IgnoreNotImplemented contains ErrNotImplemented messages to ignore.
@@ -98,6 +102,7 @@ func NewGenerator(spec *ogen.Spec, opts Options) (*Generator, error) {
98102
}
99103
api, err := parser.Parse(spec, parser.Settings{
100104
External: external,
105+
Filename: opts.Filename,
101106
InferTypes: opts.InferSchemaType,
102107
})
103108
if err != nil {

gen_test.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,11 +119,14 @@ func TestGenerate(t *testing.T) {
119119
func TestNegative(t *testing.T) {
120120
walkTestdata(t, "_testdata/negative", func(t *testing.T, file string, data []byte) {
121121
a := require.New(t)
122+
_, name := path.Split(file)
122123

123124
spec, err := ogen.Parse(data)
124125
a.NoError(err)
125126

126-
_, err = gen.NewGenerator(spec, gen.Options{})
127+
_, err = gen.NewGenerator(spec, gen.Options{
128+
Filename: name,
129+
})
127130
a.Error(err)
128131
t.Logf("%+v", err)
129132
})

json/location.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func (l Location) String() string {
4646
if l.Line == 0 {
4747
return strconv.Quote(l.JSONPointer)
4848
}
49-
return fmt.Sprintf("line %d:%d", l.Line, l.Column)
49+
return fmt.Sprintf("%d:%d", l.Line, l.Column)
5050
}
5151

5252
// Locatable is an interface for JSON value location store.

openapi/parser/errors.go

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,24 +16,43 @@ var _ interface {
1616

1717
// LocationError is a wrapper for an error that has a location.
1818
type LocationError struct {
19-
loc ogenjson.Location
20-
err error
19+
file string
20+
loc ogenjson.Location
21+
err error
2122
}
2223

2324
// Unwrap implements errors.Wrapper.
2425
func (e *LocationError) Unwrap() error {
2526
return e.err
2627
}
2728

29+
func (e *LocationError) fileName() string {
30+
filename := e.file
31+
if filename != "" {
32+
switch {
33+
case e.loc.Line != 0:
34+
// Line is set, so return "${filename}:".
35+
filename += ":"
36+
case e.loc.JSONPointer != "":
37+
// Line is not set, but JSONPointer is set, so return "${filename}#${JSONPointer}".
38+
filename += "#"
39+
default:
40+
// Neither line nor JSONPointer is set, so return empty string.
41+
return ""
42+
}
43+
}
44+
return filename
45+
}
46+
2847
// FormatError implements errors.Formatter.
2948
func (e *LocationError) FormatError(p errors.Printer) (next error) {
30-
p.Printf("at %s", e.loc)
49+
p.Printf("at %s%s", e.fileName(), e.loc)
3150
return e.err
3251
}
3352

3453
// Error implements error.
3554
func (e *LocationError) Error() string {
36-
return fmt.Sprintf("at %s: %s", e.loc, e.err)
55+
return fmt.Sprintf("at %s%s: %s", e.fileName(), e.loc, e.err)
3756
}
3857

3958
func (p *parser) wrapLocation(l ogenjson.Locatable, err error) error {
@@ -45,7 +64,8 @@ func (p *parser) wrapLocation(l ogenjson.Locatable, err error) error {
4564
return err
4665
}
4766
return &LocationError{
48-
loc: loc,
49-
err: err,
67+
file: p.filename,
68+
loc: loc,
69+
err: err,
5070
}
5171
}

openapi/parser/parser.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ type parser struct {
2626
external jsonschema.ExternalResolver
2727
schemas map[string][]byte
2828
depthLimit int
29+
filename string // optional, used for error messages
2930

3031
schemaParser *jsonschema.Parser
3132
}
@@ -58,6 +59,7 @@ func Parse(spec *ogen.Spec, s Settings) (*openapi.API, error) {
5859
"": spec.Raw,
5960
},
6061
depthLimit: s.DepthLimit,
62+
filename: s.Filename,
6163
schemaParser: jsonschema.NewParser(jsonschema.Settings{
6264
External: s.External,
6365
Resolver: componentsResolver{

openapi/parser/resolve.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ func resolvePointer(root []byte, ptr string, to interface{}) error {
3434
if err != nil {
3535
return err
3636
}
37-
3837
return json.Unmarshal(data, to)
3938
}
4039

openapi/parser/settings.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ type Settings struct {
77
// External is external JSON Schema resolver. If nil, NoExternal resolver is used.
88
External jsonschema.ExternalResolver
99

10+
// Filename is a name of the file being parsed.
11+
//
12+
// Used for error messages.
13+
Filename string
14+
1015
// DepthLimit limits the number of nested references. Default is 1000.
1116
DepthLimit int
1217

0 commit comments

Comments
 (0)