"docs/vscode:/vscode.git/clone" did not exist on "fcf38946e423a306da5428a498ac98ecb7a0d757"
parser.go 1.6 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package parser

import (
	"bufio"
	"fmt"
	"io"
	"strings"
)

type Command struct {
	Name string
	Arg  string
}

func Parse(reader io.Reader) ([]Command, error) {
	var commands []Command
	var foundModel bool

	scanner := bufio.NewScanner(reader)
	multiline := false
	var multilineCommand *Command
	for scanner.Scan() {
		line := scanner.Text()
		if multiline {
			// If we're in a multiline string and the line is """, end the multiline string.
			if strings.TrimSpace(line) == `"""` {
				multiline = false
				commands = append(commands, *multilineCommand)
			} else {
				// Otherwise, append the line to the multiline string.
				multilineCommand.Arg += "\n" + line
			}
			continue
		}
		fields := strings.Fields(line)
		if len(fields) == 0 {
			continue
		}

		command := Command{}
41
		switch strings.ToUpper(fields[0]) {
42
43
44
45
46
47
48
		case "FROM":
			command.Name = "model"
			command.Arg = fields[1]
			if command.Arg == "" {
				return nil, fmt.Errorf("no model specified in FROM line")
			}
			foundModel = true
49
50
		case "PROMPT", "LICENSE":
			command.Name = strings.ToLower(fields[0])
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
			if fields[1] == `"""` {
				multiline = true
				multilineCommand = &command
				multilineCommand.Arg = ""
			} else {
				command.Arg = strings.Join(fields[1:], " ")
			}
		case "PARAMETER":
			command.Name = fields[1]
			command.Arg = strings.Join(fields[2:], " ")
		default:
			continue
		}
		if !multiline {
			commands = append(commands, command)
		}
	}

	if !foundModel {
		return nil, fmt.Errorf("no FROM line for the model was specified")
	}

	if multiline {
		return nil, fmt.Errorf("unclosed multiline string")
	}
	return commands, scanner.Err()
}