Multiline literal strings

This commit is contained in:
Thomas Pelletier
2021-02-06 08:01:38 -05:00
parent 736a75748b
commit a466f0ca79
2 changed files with 37 additions and 9 deletions
+25 -8
View File
@@ -92,25 +92,24 @@ func parseKeyval(b []byte) ([]byte, error) {
func parseVal(b []byte) ([]byte, error) {
// val = string / boolean / array / inline-table / date-time / float / integer
var err error
c := b[0]
switch c {
// strings
case '"':
var rest []byte
var err error
if scanFollowsMultilineBasicStringDelimiter(b) {
_, rest, err = parseMultilineBasicString(b)
_, b, err = parseMultilineBasicString(b)
} else {
_, rest, err = parseBasicString(b)
_, b, err = parseBasicString(b)
}
return rest, err
return b, err
case '\'':
if scanFollowsMultilineLiteralStringDelimiter(b) {
return parseMultilineLiteralString(b)
_, b, err = parseMultilineLiteralString(b)
}
_, rest, err := scanLiteralString(b)
return rest, err
_, b, err = scanLiteralString(b)
return b, err
// TODO boolean
// TODO array
@@ -127,6 +126,24 @@ func parseVal(b []byte) ([]byte, error) {
}
}
func parseMultilineLiteralString(b []byte) (string, []byte, error) {
token, rest, err := scanMultilineLiteralString(b)
if err != nil {
return "", nil, err
}
i := 3
// skip the immediate new line
if token[i] == '\n' {
i++
} else if token[i] == '\r' && token[i+1] == '\n' {
i += 2
}
return string(token[i : len(b)-3]), rest, err
}
func parseMultilineBasicString(b []byte) (string, []byte, error) {
//ml-basic-string = ml-basic-string-delim [ newline ] ml-basic-body
//ml-basic-string-delim