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 }