8 "github.com/aws/aws-sdk-go/aws/awserr"
12 // ErrCodeUnableToReadFile is used when a file is failed to be
13 // opened or read from.
14 ErrCodeUnableToReadFile = "FailedRead"
17 // TokenType represents the various different tokens types
20 func (t TokenType) String() string {
45 TokenNone = TokenType(iota)
55 type iniLexer struct{}
57 // Tokenize will return a list of tokens during lexical analysis of the
59 func (l *iniLexer) Tokenize(r io.Reader) ([]Token, error) {
60 b, err := ioutil.ReadAll(r)
62 return nil, awserr.New(ErrCodeUnableToReadFile, "unable to read file", err)
68 func (l *iniLexer) tokenize(b []byte) ([]Token, error) {
69 runes := bytes.Runes(b)
72 tokenAmount := countTokens(runes)
73 tokens := make([]Token, tokenAmount)
76 for len(runes) > 0 && count < tokenAmount {
78 case isWhitespace(runes[0]):
79 tokens[count], n, err = newWSToken(runes)
80 case isComma(runes[0]):
81 tokens[count], n = newCommaToken(), 1
82 case isComment(runes):
83 tokens[count], n, err = newCommentToken(runes)
84 case isNewline(runes):
85 tokens[count], n, err = newNewlineToken(runes)
87 tokens[count], n, err = newSepToken(runes)
89 tokens[count], n, err = newOpToken(runes)
91 tokens[count], n, err = newLitToken(runes)
103 return tokens[:count], nil
106 func countTokens(runes []rune) int {
112 case isWhitespace(runes[0]):
113 _, n, err = newWSToken(runes)
114 case isComma(runes[0]):
115 _, n = newCommaToken(), 1
116 case isComment(runes):
117 _, n, err = newCommentToken(runes)
118 case isNewline(runes):
119 _, n, err = newNewlineToken(runes)
121 _, n, err = newSepToken(runes)
123 _, n, err = newOpToken(runes)
125 _, n, err = newLitToken(runes)
139 // Token indicates a metadata about a given value.
147 var emptyValue = Value{}
149 func newToken(t TokenType, raw []rune, v ValueType) Token {
157 // Raw return the raw runes that were consumed
158 func (tok Token) Raw() []rune {
162 // Type returns the token type
163 func (tok Token) Type() TokenType {