1 package parser 2 3 import ( 4 // "bufio" 5 // "fmt" 6 // "os" 7 "github.com/pkg/errors" 8 "github.com/goph/emperror" 9 "github.com/noirbizarre/gonja/tokens" 10 ) 11 12 // Error produces a nice error message and returns an error-object. 13 // The 'token'-argument is optional. If provided, it will take 14 // the token's position information. If not provided, it will 15 // automatically use the CURRENT token's position information. 16 func (p *Parser) Error(msg string, token *tokens.Token) error { 17 // if token == nil { 18 // // Set current token 19 // token = p.Current() 20 // if token == nil { 21 // // Set to last token 22 // if len(p.tokens) > 0 { 23 // token = p.tokens[len(p.tokens)-1] 24 // } 25 // } 26 // } 27 // var line, col int 28 // if token != nil { 29 // line = token.Line 30 // col = token.Col 31 // } 32 // return &Error{ 33 // // Template: p.template, 34 // // Filename: p.name, 35 // Sender: "parser", 36 // Line: line, 37 // Column: col, 38 // Token: token, 39 // OrigError: errors.New(msg), 40 // } 41 // s += fmt.Sprintf(" | Line %d Col %d", e.Line, e.Column) 42 // if e.Token != nil { 43 // s += fmt.Sprintf(" near '%s'", e.Token.Val) 44 // } 45 if token == nil { 46 return errors.New(msg) 47 } else { 48 return emperror.With( 49 errors.Errorf(`%s (Line: %d Col: %d, near "%s")`, msg, token.Line, token.Col, token.Val), 50 "token", token, 51 ) 52 } 53 } 54 55 // // The Error type is being used to address an error during lexing, parsing or 56 // // execution. If you want to return an error object (for example in your own 57 // // tag or filter) fill this object with as much information as you have. 58 // // Make sure "Sender" is always given (if you're returning an error within 59 // // a filter, make Sender equals 'filter:yourfilter'; same goes for tags: 'tag:mytag'). 60 // // It's okay if you only fill in ErrorMsg if you don't have any other details at hand. 61 // type Error struct { 62 // // Template *Template 63 // // Filename string 64 // Line int 65 // Column int 66 // Token *tokens.Token 67 // Sender string 68 // OrigError error 69 // } 70 71 // // func (e *Error) updateFromTokenIfNeeded(template *Template, t *Token) *Error { 72 // // if e.Template == nil { 73 // // e.Template = template 74 // // } 75 76 // // if e.Token == nil { 77 // // e.Token = t 78 // // if e.Line <= 0 { 79 // // e.Line = t.Line 80 // // e.Column = t.Col 81 // // } 82 // // } 83 84 // // return e 85 // // } 86 87 // // Returns a nice formatted error string. 88 // func (e *Error) Error() string { 89 // s := "[Error" 90 // if e.Sender != "" { 91 // s += " (where: " + e.Sender + ")" 92 // } 93 // if e.Filename != "" { 94 // s += " in " + e.Filename 95 // } 96 // if e.Line > 0 { 97 // s += fmt.Sprintf(" | Line %d Col %d", e.Line, e.Column) 98 // if e.Token != nil { 99 // s += fmt.Sprintf(" near '%s'", e.Token.Val) 100 // } 101 // } 102 // s += "] " 103 // s += e.OrigError.Error() 104 // return s 105 // } 106 107 // // // RawLine returns the affected line from the original template, if available. 108 // // func (e *Error) RawLine() (line string, available bool, outErr error) { 109 // // if e.Line <= 0 || e.Filename == "<string>" { 110 // // return "", false, nil 111 // // } 112 113 // // filename := e.Filename 114 // // if e.Template != nil { 115 // // filename = e.Template.set.resolveFilename(e.Template, e.Filename) 116 // // } 117 // // file, err := os.Open(filename) 118 // // if err != nil { 119 // // return "", false, err 120 // // } 121 // // defer func() { 122 // // err := file.Close() 123 // // if err != nil && outErr == nil { 124 // // outErr = err 125 // // } 126 // // }() 127 128 // // scanner := bufio.NewScanner(file) 129 // // l := 0 130 // // for scanner.Scan() { 131 // // l++ 132 // // if l == e.Line { 133 // // return scanner.Text(), true, nil 134 // // } 135 // // } 136 // // return "", false, nil 137 // // } 138