Very beginning of unmarshaler + builder interface

This commit is contained in:
Thomas Pelletier
2021-02-06 23:20:26 -05:00
parent 9fa2fd413d
commit 89052d60b4
5 changed files with 250 additions and 256 deletions
-71
View File
@@ -20,8 +20,6 @@ var scanFollowsMultilineBasicStringDelimiter = scanFollows([]byte{'"', '"', '"'}
var scanFollowsMultilineLiteralStringDelimiter = scanFollows([]byte{'\'', '\'', '\''})
var scanFollowsTrue = scanFollows([]byte{'t', 'r', 'u', 'e'})
var scanFollowsFalse = scanFollows([]byte{'f', 'a', 'l', 's', 'e'})
var scanFollowsArrayTableBegin = scanFollows([]byte{arrayOrTableBegin, arrayOrTableBegin})
var scanFollowsArrayTableEnd = scanFollows([]byte{arrayOrTableEnd, arrayOrTableEnd})
func scanNewline(b []byte) ([]byte, []byte, error) {
if len(b) == 0 {
@@ -42,75 +40,6 @@ func scanNewline(b []byte) ([]byte, []byte, error) {
return nil, nil, unexpectedCharacter{b: b}
}
const (
dot = '.'
equal = '='
comma = ','
inlineTableBegin = '{'
inlineTableEnd = '}'
comment = '#'
arrayOrTableBegin = '['
arrayOrTableEnd = ']'
)
// scan returns a []byte containing the next lexical token, bytes left, and an error.
//
// eof is signaled by an empty token and nil error.
func scan(b []byte) ([]byte, []byte, error) {
if len(b) == 0 {
return b, b, nil
}
switch b[0] {
case dot, equal, inlineTableBegin, inlineTableEnd, comma:
return b[:1], b[1:], nil
case '"':
if scanFollowsMultilineBasicStringDelimiter(b) {
return scanMultilineBasicString(b)
}
return scanBasicString(b)
case '\'':
if scanFollowsMultilineLiteralStringDelimiter(b) {
return scanMultilineLiteralString(b)
}
return scanLiteralString(b)
case comment:
return scanComment(b)
case ' ', '\t':
data, rest := scanWhitespace(b)
return data, rest, nil
case '\r':
return scanWindowsNewline(b)
case '\n':
return b[:1], b[1:], nil
case 't':
if scanFollowsTrue(b) {
return b[:4], b[4:], nil
}
case 'f':
if scanFollowsFalse(b) {
return b[:5], b[5:], nil
}
case arrayOrTableBegin:
if scanFollowsArrayTableBegin(b) {
return b[:2], b[2:], nil
}
return b[:1], b[1:], nil
case arrayOrTableEnd:
if scanFollowsArrayTableEnd(b) {
return b[:2], b[2:], nil
}
return b[:1], b[1:], nil
}
if isUnquotedKeyChar(b[0]) {
return scanUnquotedKey(b)
}
// TODO: numbers, date-time
panic("unhandled scan")
}
func scanUnquotedKey(b []byte) ([]byte, []byte, error) {
//unquoted-key = 1*( ALPHA / DIGIT / %x2D / %x5F ) ; A-Z / a-z / 0-9 / - / _
for i := 0; i < len(b); i++ {