68 lines
1.1 KiB
Go
68 lines
1.1 KiB
Go
|
package dotsql
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"regexp"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
type Scanner struct {
|
||
|
line string
|
||
|
queries map[string]string
|
||
|
current string
|
||
|
}
|
||
|
|
||
|
type stateFn func(*Scanner) stateFn
|
||
|
|
||
|
func getTag(line string) string {
|
||
|
re := regexp.MustCompile("^\\s*--\\s*name:\\s*(\\S+)")
|
||
|
matches := re.FindStringSubmatch(line)
|
||
|
if matches == nil {
|
||
|
return ""
|
||
|
}
|
||
|
return matches[1]
|
||
|
}
|
||
|
|
||
|
func initialState(s *Scanner) stateFn {
|
||
|
if tag := getTag(s.line); len(tag) > 0 {
|
||
|
s.current = tag
|
||
|
return queryState
|
||
|
}
|
||
|
return initialState
|
||
|
}
|
||
|
|
||
|
func queryState(s *Scanner) stateFn {
|
||
|
if tag := getTag(s.line); len(tag) > 0 {
|
||
|
s.current = tag
|
||
|
} else {
|
||
|
s.appendQueryLine()
|
||
|
}
|
||
|
return queryState
|
||
|
}
|
||
|
|
||
|
func (s *Scanner) appendQueryLine() {
|
||
|
current := s.queries[s.current]
|
||
|
line := strings.Trim(s.line, " \t")
|
||
|
if len(line) == 0 {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
if len(current) > 0 {
|
||
|
current = current + "\n"
|
||
|
}
|
||
|
|
||
|
current = current + line
|
||
|
s.queries[s.current] = current
|
||
|
}
|
||
|
|
||
|
func (s *Scanner) Run(io *bufio.Scanner) map[string]string {
|
||
|
s.queries = make(map[string]string)
|
||
|
|
||
|
for state := initialState; io.Scan(); {
|
||
|
s.line = io.Text()
|
||
|
state = state(s)
|
||
|
}
|
||
|
|
||
|
return s.queries
|
||
|
}
|