matterbridge/vendor/github.com/pelletier/go-toml/token.go

137 lines
1.9 KiB
Go
Raw Normal View History

2018-03-04 23:46:13 +01:00
package toml
2020-10-19 23:40:00 +02:00
import "fmt"
2018-03-04 23:46:13 +01:00
// Define tokens
type tokenType int
const (
eof = -(iota + 1)
)
const (
tokenError tokenType = iota
tokenEOF
tokenComment
tokenKey
tokenString
tokenInteger
tokenTrue
tokenFalse
tokenFloat
tokenInf
tokenNan
tokenEqual
tokenLeftBracket
tokenRightBracket
tokenLeftCurlyBrace
tokenRightCurlyBrace
tokenLeftParen
tokenRightParen
tokenDoubleLeftBracket
tokenDoubleRightBracket
2020-08-10 00:29:54 +02:00
tokenLocalDate
2021-06-16 21:00:49 +02:00
tokenLocalTime
tokenTimeOffset
2018-03-04 23:46:13 +01:00
tokenKeyGroup
tokenKeyGroupArray
tokenComma
tokenColon
tokenDollar
tokenStar
tokenQuestion
tokenDot
tokenDotDot
tokenEOL
)
var tokenTypeNames = []string{
"Error",
"EOF",
"Comment",
"Key",
"String",
"Integer",
"True",
"False",
"Float",
"Inf",
"NaN",
"=",
"[",
"]",
"{",
"}",
"(",
")",
"]]",
"[[",
2020-08-10 00:29:54 +02:00
"LocalDate",
2021-06-16 21:00:49 +02:00
"LocalTime",
"TimeOffset",
2018-03-04 23:46:13 +01:00
"KeyGroup",
"KeyGroupArray",
",",
":",
"$",
"*",
"?",
".",
"..",
"EOL",
}
type token struct {
Position
typ tokenType
val string
}
func (tt tokenType) String() string {
idx := int(tt)
if idx < len(tokenTypeNames) {
return tokenTypeNames[idx]
}
return "Unknown"
}
func (t token) String() string {
switch t.typ {
case tokenEOF:
return "EOF"
case tokenError:
return t.val
}
return fmt.Sprintf("%q", t.val)
}
func isSpace(r rune) bool {
return r == ' ' || r == '\t'
}
func isAlphanumeric(r rune) bool {
2020-10-19 23:40:00 +02:00
return 'a' <= r && r <= 'z' || 'A' <= r && r <= 'Z' || r == '_'
2018-03-04 23:46:13 +01:00
}
func isKeyChar(r rune) bool {
// Keys start with the first character that isn't whitespace or [ and end
// with the last non-whitespace character before the equals sign. Keys
// cannot contain a # character."
return !(r == '\r' || r == '\n' || r == eof || r == '=')
}
func isKeyStartChar(r rune) bool {
return !(isSpace(r) || r == '\r' || r == '\n' || r == eof || r == '[')
}
func isDigit(r rune) bool {
2020-10-19 23:40:00 +02:00
return '0' <= r && r <= '9'
2018-03-04 23:46:13 +01:00
}
func isHexDigit(r rune) bool {
return isDigit(r) ||
(r >= 'a' && r <= 'f') ||
(r >= 'A' && r <= 'F')
}