woodpecker/vendor/github.com/bradrydzewski/togo/parser/parser.go
6543 194e01c9c6
[CI] Run "build" on pull too (#287)
* CI: run "build" on pull too

* vendor build tools too
2021-08-30 20:48:19 +02:00

84 lines
1.5 KiB
Go

package parser
import (
"bufio"
"fmt"
"io"
"os"
"strings"
)
const (
prefix = "-- name: "
comment = "--"
newline = "\n"
delimiter = ";"
)
// Statement represents a statment in the sql file.
type Statement struct {
Name string
Value string
Driver string
}
// Parser parses the sql file.
type Parser struct {
prefix string
}
// New returns a new parser.
func New() *Parser {
return NewPrefix(prefix)
}
// NewPrefix returns a new parser with the given prefix.
func NewPrefix(prefix string) *Parser {
return &Parser{prefix: prefix}
}
// ParseFile parses the sql file.
func (p *Parser) ParseFile(filepath string) ([]*Statement, error) {
f, err := os.Open(filepath)
if err != nil {
return nil, err
}
defer f.Close()
return p.Parse(f)
}
// Parse parses the sql file and returns a list of statements.
func (p *Parser) Parse(r io.Reader) ([]*Statement, error) {
var (
stmts []*Statement
stmt *Statement
)
scanner := bufio.NewScanner(r)
for scanner.Scan() {
line := scanner.Text()
if strings.HasPrefix(line, prefix) {
stmt = new(Statement)
stmt.Name, stmt.Driver = parsePrefix(line, p.prefix)
stmts = append(stmts, stmt)
}
if strings.HasPrefix(line, comment) {
continue
}
if stmt != nil {
stmt.Value += line + newline
}
}
for _, stmt := range stmts {
stmt.Value = strings.TrimSpace(stmt.Value)
}
return stmts, nil
}
func parsePrefix(line, prefix string) (name string, driver string) {
line = strings.TrimPrefix(line, prefix)
line = strings.TrimSpace(line)
fmt.Sscanln(line, &name, &driver)
return
}