Fixes #22: Fixes style issues
diff --git a/lexer.go b/lexer.go index b6d28b4..b057da5 100644 --- a/lexer.go +++ b/lexer.go
@@ -45,7 +45,7 @@ tokenEOL ) -var tokenTypeNames []string = []string{ +var tokenTypeNames = []string{ "EOF", "Comment", "Key", @@ -142,10 +142,10 @@ for i := l.start; i < l.pos; { r, width := utf8.DecodeRuneInString(l.input[i:]) if r == '\n' { - l.line += 1 + l.line++ l.col = 1 } else { - l.col += 1 + l.col++ } i += width } @@ -262,10 +262,10 @@ case '=': return l.errorf("cannot have multiple equals for the same key") case '[': - l.depth += 1 + l.depth++ return lexLeftBracket case ']': - l.depth -= 1 + l.depth-- return lexRightBracket case '#': return lexComment @@ -275,12 +275,11 @@ return lexComma case '\n': l.ignore() - l.pos += 1 + l.pos++ if l.depth == 0 { return lexVoid - } else { - return lexRvalue } + return lexRvalue } if l.follow("true") { @@ -373,70 +372,70 @@ func lexLeftBracket(l *lexer) stateFn { l.ignore() - l.pos += 1 + l.pos++ l.emit(tokenLeftBracket) return lexRvalue } func lexString(l *lexer) stateFn { - l.pos += 1 + l.pos++ l.ignore() - growing_string := "" + growingString := "" for { if l.peek() == '"' { - l.emitWithValue(tokenString, growing_string) - l.pos += 1 + l.emitWithValue(tokenString, growingString) + l.pos++ l.ignore() return lexRvalue } if l.follow("\\\"") { - l.pos += 1 - growing_string += "\"" + l.pos++ + growingString += "\"" } else if l.follow("\\n") { - l.pos += 1 - growing_string += "\n" + l.pos++ + growingString += "\n" } else if l.follow("\\b") { - l.pos += 1 - growing_string += "\b" + l.pos++ + growingString += "\b" } else if l.follow("\\f") { - l.pos += 1 - growing_string += "\f" + l.pos++ + growingString += "\f" } else if l.follow("\\/") { - l.pos += 1 - growing_string += "/" + l.pos++ + growingString += "/" } else if l.follow("\\t") { - l.pos += 1 - growing_string += "\t" + l.pos++ + growingString += "\t" } else if l.follow("\\r") { - l.pos += 1 - growing_string += "\r" + l.pos++ + growingString += "\r" } else if l.follow("\\\\") { - l.pos += 1 - growing_string += "\\" + l.pos++ + growingString += "\\" } else if l.follow("\\u") { l.pos += 2 code := "" for i := 0; i < 4; i++ { c := l.peek() - l.pos += 1 + l.pos++ if !isHexDigit(c) { return l.errorf("unfinished unicode escape") } code = code + string(c) } - l.pos -= 1 + l.pos-- intcode, err := strconv.ParseInt(code, 16, 32) if err != nil { return l.errorf("invalid unicode escape: \\u" + code) } - growing_string += string(rune(intcode)) + growingString += string(rune(intcode)) } else if l.follow("\\") { - l.pos += 1 + l.pos++ return l.errorf("invalid escape sequence: \\" + string(l.peek())) } else { - growing_string += string(l.peek()) + growingString += string(l.peek()) } if l.next() == eof { @@ -449,18 +448,17 @@ func lexKeyGroup(l *lexer) stateFn { l.ignore() - l.pos += 1 + l.pos++ if l.peek() == '[' { // token '[[' signifies an array of anonymous key groups - l.pos += 1 + l.pos++ l.emit(tokenDoubleLeftBracket) return lexInsideKeyGroupArray - } else { - // vanilla key group - l.emit(tokenLeftBracket) - return lexInsideKeyGroup } + // vanilla key group + l.emit(tokenLeftBracket) + return lexInsideKeyGroup } func lexInsideKeyGroupArray(l *lexer) stateFn { @@ -470,11 +468,11 @@ l.emit(tokenKeyGroupArray) } l.ignore() - l.pos += 1 + l.pos++ if l.peek() != ']' { break // error } - l.pos += 1 + l.pos++ l.emit(tokenDoubleRightBracket) return lexVoid } else if l.peek() == '[' { @@ -495,7 +493,7 @@ l.emit(tokenKeyGroup) } l.ignore() - l.pos += 1 + l.pos++ l.emit(tokenRightBracket) return lexVoid } else if l.peek() == '[' { @@ -511,7 +509,7 @@ func lexRightBracket(l *lexer) stateFn { l.ignore() - l.pos += 1 + l.pos++ l.emit(tokenRightBracket) return lexRvalue } @@ -521,33 +519,33 @@ if !l.accept("+") { l.accept("-") } - point_seen := false - digit_seen := false + pointSeen := false + digitSeen := false for { next := l.next() if next == '.' { - if point_seen { + if pointSeen { return l.errorf("cannot have two dots in one float") } if !isDigit(l.peek()) { return l.errorf("float cannot end with a dot") } - point_seen = true + pointSeen = true } else if isDigit(next) { - digit_seen = true + digitSeen = true } else { l.backup() break } - if point_seen && !digit_seen { + if pointSeen && !digitSeen { return l.errorf("cannot start float with a dot") } } - if !digit_seen { + if !digitSeen { return l.errorf("no digit in that number") } - if point_seen { + if pointSeen { l.emit(tokenFloat) } else { l.emit(tokenInteger)
diff --git a/parser.go b/parser.go index 9945d39..c9f42a3 100644 --- a/parser.go +++ b/parser.go
@@ -94,7 +94,7 @@ } func parseGroupArray(p *parser) parserStateFn { - start_token := p.getToken() // discard the [[ + startToken := p.getToken() // discard the [[ key := p.getToken() if key.typ != tokenKeyGroupArray { p.raiseError(key, "unexpected token %s, was expecting a key group array", key) @@ -103,21 +103,21 @@ // get or create group array element at the indicated part in the path keys := strings.Split(key.val, ".") p.tree.createSubTree(keys[:len(keys)-1]) // create parent entries - dest_tree := p.tree.GetPath(keys) + destTree := p.tree.GetPath(keys) var array []*TomlTree - if dest_tree == nil { + if destTree == nil { array = make([]*TomlTree, 0) - } else if dest_tree.([]*TomlTree) != nil { - array = dest_tree.([]*TomlTree) + } else if destTree.([]*TomlTree) != nil { + array = destTree.([]*TomlTree) } else { p.raiseError(key, "key %s is already assigned and not of type group array", key) } p.currentGroup = keys // add a new tree to the end of the group array - new_tree := newTomlTree() - new_tree.position = start_token.Position - array = append(array, new_tree) + newTree := newTomlTree() + newTree.position = startToken.Position + array = append(array, newTree) p.tree.SetPath(p.currentGroup, array) // remove all keys that were children of this group array @@ -144,7 +144,7 @@ } func parseGroup(p *parser) parserStateFn { - start_token := p.getToken() // discard the [ + startToken := p.getToken() // discard the [ key := p.getToken() if key.typ != tokenKeyGroup { p.raiseError(key, "unexpected token %s, was expecting a key group", key) @@ -162,8 +162,8 @@ } p.assume(tokenRightBracket) p.currentGroup = keys - target_tree := p.tree.GetPath(p.currentGroup).(*TomlTree) - target_tree.position = start_token.Position + targetTree := p.tree.GetPath(p.currentGroup).(*TomlTree) + targetTree.position = startToken.Position return parseStart(p) } @@ -171,33 +171,33 @@ key := p.getToken() p.assume(tokenEqual) value := parseRvalue(p) - var group_key []string + var groupKey []string if len(p.currentGroup) > 0 { - group_key = p.currentGroup + groupKey = p.currentGroup } else { - group_key = []string{} + groupKey = []string{} } // find the group to assign, looking out for arrays of groups - var target_node *TomlTree - switch node := p.tree.GetPath(group_key).(type) { + var targetNode *TomlTree + switch node := p.tree.GetPath(groupKey).(type) { case []*TomlTree: - target_node = node[len(node)-1] + targetNode = node[len(node)-1] case *TomlTree: - target_node = node + targetNode = node default: p.raiseError(key, "Unknown group type for path: %s", - strings.Join(group_key, ".")) + strings.Join(groupKey, ".")) } // assign value to the found group - local_key := []string{key.val} - final_key := append(group_key, key.val) - if target_node.GetPath(local_key) != nil { + localKey := []string{key.val} + finalKey := append(groupKey, key.val) + if targetNode.GetPath(localKey) != nil { p.raiseError(key, "The following key was defined twice: %s", - strings.Join(final_key, ".")) + strings.Join(finalKey, ".")) } - target_node.values[key.val] = &tomlValue{value, key.Position} + targetNode.values[key.val] = &tomlValue{value, key.Position} return parseStart(p) } @@ -244,7 +244,7 @@ } func parseArray(p *parser) []interface{} { - array := make([]interface{}, 0) + var array []interface{} arrayType := reflect.TypeOf(nil) for { follow := p.peek()
diff --git a/position.go b/position.go index 266bfcb..fd42a0d 100644 --- a/position.go +++ b/position.go
@@ -6,7 +6,7 @@ "fmt" ) -// position within a TOML document +// Position within a TOML document type Position struct { Line int // line within the document Col int // column within the line @@ -18,6 +18,8 @@ return fmt.Sprintf("(%d, %d)", p.Line, p.Col) } +// Invalid returns wheter or not the position is valid (i.e. with negative or +// null values) func (p *Position) Invalid() bool { return p.Line <= 0 || p.Col <= 0 }
diff --git a/toml.go b/toml.go index aa2ab6b..7cd74b0 100644 --- a/toml.go +++ b/toml.go
@@ -1,4 +1,4 @@ -// TOML markup language parser. +// Package toml is a TOML markup language parser. // // This version supports the specification as described in // https://github.com/toml-lang/toml/blob/master/versions/toml-v0.2.0.md @@ -19,8 +19,7 @@ position Position } -// Definition of a TomlTree. -// This is the result of the parsing of a TOML file. +// TomlTree is the result of the parsing of a TOML file. type TomlTree struct { values map[string]interface{} position Position @@ -41,7 +40,7 @@ return t.HasPath(strings.Split(key, ".")) } -// Returns true if the given path of keys exists, false otherwise. +// HasPath returns true if the given path of keys exists, false otherwise. func (t *TomlTree) HasPath(keys []string) bool { return t.GetPath(keys) != nil } @@ -49,8 +48,8 @@ // Keys returns the keys of the toplevel tree. // Warning: this is a costly operation. func (t *TomlTree) Keys() []string { - keys := make([]string, 0) - for k, _ := range t.values { + var keys []string + for k := range t.values { keys = append(keys, k) } return keys @@ -67,15 +66,15 @@ return t.GetPath(strings.Split(key, ".")) } -// Returns the element in the tree indicated by 'keys'. +// GetPath returns the element in the tree indicated by 'keys'. // If keys is of length zero, the current tree is returned. func (t *TomlTree) GetPath(keys []string) interface{} { if len(keys) == 0 { return t } subtree := t - for _, intermediate_key := range keys[:len(keys)-1] { - value, exists := subtree.values[intermediate_key] + for _, intermediateKey := range keys[:len(keys)-1] { + value, exists := subtree.values[intermediateKey] if !exists { return nil } @@ -101,6 +100,7 @@ } } +// GetPosition returns the position of the given key. func (t *TomlTree) GetPosition(key string) Position { if key == "" { return Position{0, 0} @@ -108,15 +108,15 @@ return t.GetPositionPath(strings.Split(key, ".")) } -// Returns the element in the tree indicated by 'keys'. +// GetPositionPath returns the element in the tree indicated by 'keys'. // If keys is of length zero, the current tree is returned. func (t *TomlTree) GetPositionPath(keys []string) Position { if len(keys) == 0 { return t.position } subtree := t - for _, intermediate_key := range keys[:len(keys)-1] { - value, exists := subtree.values[intermediate_key] + for _, intermediateKey := range keys[:len(keys)-1] { + value, exists := subtree.values[intermediateKey] if !exists { return Position{0, 0} } @@ -150,7 +150,7 @@ } } -// Same as Get but with a default value +// GetDefault works like Get but with a default value func (t *TomlTree) GetDefault(key string, def interface{}) interface{} { val := t.Get(key) if val == nil { @@ -166,16 +166,16 @@ t.SetPath(strings.Split(key, "."), value) } -// Set an element in the tree. +// SetPath sets an element in the tree. // Keys is an array of path elements (e.g. {"a","b","c"}). // Creates all necessary intermediates trees, if needed. func (t *TomlTree) SetPath(keys []string, value interface{}) { subtree := t - for _, intermediate_key := range keys[:len(keys)-1] { - nextTree, exists := subtree.values[intermediate_key] + for _, intermediateKey := range keys[:len(keys)-1] { + nextTree, exists := subtree.values[intermediateKey] if !exists { nextTree = newTomlTree() - subtree.values[intermediate_key] = &nextTree // add new element here + subtree.values[intermediateKey] = &nextTree // add new element here } switch node := nextTree.(type) { case *TomlTree: @@ -184,7 +184,7 @@ // go to most recent element if len(node) == 0 { // create element if it does not exist - subtree.values[intermediate_key] = append(node, newTomlTree()) + subtree.values[intermediateKey] = append(node, newTomlTree()) } subtree = node[len(node)-1] } @@ -201,14 +201,14 @@ // Returns nil on success, error object on failure func (t *TomlTree) createSubTree(keys []string) error { subtree := t - for _, intermediate_key := range keys { - if intermediate_key == "" { + for _, intermediateKey := range keys { + if intermediateKey == "" { return fmt.Errorf("empty intermediate table") } - nextTree, exists := subtree.values[intermediate_key] + nextTree, exists := subtree.values[intermediateKey] if !exists { nextTree = newTomlTree() - subtree.values[intermediate_key] = nextTree + subtree.values[intermediateKey] = nextTree } switch node := nextTree.(type) { @@ -218,7 +218,7 @@ subtree = node default: return fmt.Errorf("unknown type for path %s (%s)", - strings.Join(keys, "."), intermediate_key) + strings.Join(keys, "."), intermediateKey) } } return nil @@ -228,7 +228,7 @@ func encodeTomlString(value string) string { result := "" for _, rr := range value { - int_rr := uint16(rr) + intRr := uint16(rr) switch rr { case '\b': result += "\\b" @@ -245,8 +245,8 @@ case '\\': result += "\\\\" default: - if int_rr < 0x001F { - result += fmt.Sprintf("\\u%0.4X", int_rr) + if intRr < 0x001F { + result += fmt.Sprintf("\\u%0.4X", intRr) } else { result += string(rr) } @@ -269,9 +269,8 @@ case bool: if value { return "true" - } else { - return "false" } + return "false" case time.Time: return tab + value.Format(time.RFC3339) case []interface{}: @@ -291,24 +290,24 @@ result := "" for k, v := range t.values { // figure out the keyspace - combined_key := k + combinedKey := k if keyspace != "" { - combined_key = keyspace + "." + combined_key + combinedKey = keyspace + "." + combinedKey } // output based on type switch node := v.(type) { case []*TomlTree: for _, item := range node { if len(item.Keys()) > 0 { - result += fmt.Sprintf("\n%s[[%s]]\n", indent, combined_key) + result += fmt.Sprintf("\n%s[[%s]]\n", indent, combinedKey) } - result += item.toToml(indent+" ", combined_key) + result += item.toToml(indent+" ", combinedKey) } case *TomlTree: if len(node.Keys()) > 0 { - result += fmt.Sprintf("\n%s[%s]\n", indent, combined_key) + result += fmt.Sprintf("\n%s[%s]\n", indent, combinedKey) } - result += node.toToml(indent+" ", combined_key) + result += node.toToml(indent+" ", combinedKey) case *tomlValue: result += fmt.Sprintf("%s%s = %s\n", indent, k, toTomlValue(node.value, 0)) default: @@ -318,13 +317,13 @@ return result } -// Generates a human-readable representation of the current tree. +// ToString generates a human-readable representation of the current tree. // Output spans multiple lines, and is suitable for ingest by a TOML parser func (t *TomlTree) ToString() string { return t.toToml("", "") } -// Create a TomlTree from a string. +// Load creates a TomlTree from a string. func Load(content string) (tree *TomlTree, err error) { defer func() { if r := recover(); r != nil { @@ -339,7 +338,7 @@ return } -// Create a TomlTree from a file. +// LoadFile creates a TomlTree from a file. func LoadFile(path string) (tree *TomlTree, err error) { buff, ferr := ioutil.ReadFile(path) if ferr != nil {