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 Err error } func (err Error) Error() string { var s []string switch { case err.Line > 0 || err.Column > 0: s = append(s, fmt.Sprintf("%s:%v:%v", err.Filename, err.Line, err.Column)) case err.Filename != "": s = append(s, err.Filename) } if err.Err != nil { s = append(s, err.Err.Error()) } if err.Content != "" { s = append(s, fmt.Sprintf("%q", err.Content)) } return strings.Join(s, ": ") } func (err Error) Unwrap() error { return err.Err }