asciigoat's core library
https://asciigoat.org/core
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.2 KiB
70 lines
1.2 KiB
package lexer |
|
|
|
import ( |
|
"errors" |
|
"fmt" |
|
"strings" |
|
) |
|
|
|
var ( |
|
_ error = (*Error)(nil) |
|
) |
|
|
|
var ( |
|
// ErrUnacceptableRune indicates the read rune isn't acceptable in the context |
|
ErrUnacceptableRune = errors.New("rune not acceptable in context") |
|
|
|
// ErrNotImplemented indicates something hasn't been implemented yet |
|
ErrNotImplemented = errors.New("not implemented") |
|
) |
|
|
|
// Error represents a generic parsing error |
|
type Error struct { |
|
Filename string |
|
Line int |
|
Column int |
|
|
|
Content string |
|
Hint string |
|
Err error |
|
} |
|
|
|
func (err Error) prefix() string { |
|
switch { |
|
case err.Line > 0 || err.Column > 0: |
|
if err.Filename != "" { |
|
return fmt.Sprintf("%s:%v:%v", err.Filename, err.Line, err.Column) |
|
} |
|
|
|
return fmt.Sprintf("%v:%v", err.Line, err.Column) |
|
default: |
|
return err.Filename |
|
} |
|
} |
|
|
|
func (err Error) Error() string { |
|
var s []string |
|
|
|
prefix := err.prefix() |
|
if prefix != "" { |
|
s = append(s, prefix) |
|
} |
|
|
|
if err.Err != nil { |
|
s = append(s, err.Err.Error()) |
|
} |
|
|
|
if err.Content != "" { |
|
s = append(s, fmt.Sprintf("%q", err.Content)) |
|
} |
|
|
|
if err.Hint != "" { |
|
s = append(s, err.Hint) |
|
} |
|
|
|
return strings.Join(s, ": ") |
|
} |
|
|
|
func (err Error) Unwrap() error { |
|
return err.Err |
|
}
|
|
|