aboutsummaryrefslogtreecommitdiff
path: root/error/error.go
diff options
context:
space:
mode:
Diffstat (limited to 'error/error.go')
-rw-r--r--error/error.go52
1 files changed, 46 insertions, 6 deletions
diff --git a/error/error.go b/error/error.go
index 1745c52..cc4fed5 100644
--- a/error/error.go
+++ b/error/error.go
@@ -1,15 +1,55 @@
package error
-import "fmt"
+import (
+ "bufio"
+ "fmt"
+ "os"
+ "strings"
+)
type SpecError struct {
- Cause error
- Row int
+ Cause error
+ FilePath string
+ SourceName string
+ Row int
}
func (e *SpecError) Error() string {
- if e.Row == 0 {
- return fmt.Sprintf("error: %v", e.Cause)
+ var b strings.Builder
+ if e.SourceName != "" {
+ fmt.Fprintf(&b, "%v: ", e.SourceName)
}
- return fmt.Sprintf("%v: error: %v", e.Row, e.Cause)
+ if e.Row != 0 {
+ fmt.Fprintf(&b, "%v: ", e.Row)
+ }
+ fmt.Fprintf(&b, "error: %v", e.Cause)
+
+ line := readLine(e.FilePath, e.Row)
+ if line != "" {
+ fmt.Fprintf(&b, "\n %v", line)
+ }
+
+ return b.String()
+}
+
+func readLine(filePath string, row int) string {
+ if filePath == "" || row <= 0 {
+ return ""
+ }
+
+ f, err := os.Open(filePath)
+ if err != nil {
+ return ""
+ }
+
+ i := 1
+ s := bufio.NewScanner(f)
+ for s.Scan() {
+ if i == row {
+ return s.Text()
+ }
+ i++
+ }
+
+ return ""
}