@@ -16,24 +16,43 @@ var _ interface {
1616
1717// LocationError is a wrapper for an error that has a location.
1818type 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.
2425func (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.
2948func (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.
3554func (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
3958func (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}
0 commit comments