Move source files to the repository root
diff --git a/src/toml/example.toml b/src/toml/example.toml deleted file mode 100644 index 3d902f2..0000000 --- a/src/toml/example.toml +++ /dev/null
@@ -1,29 +0,0 @@ -# This is a TOML document. Boom. - -title = "TOML Example" - -[owner] -name = "Tom Preston-Werner" -organization = "GitHub" -bio = "GitHub Cofounder & CEO\nLikes tater tots and beer." -dob = 1979-05-27T07:32:00Z # First class dates? Why not? - -[database] -server = "192.168.1.1" -ports = [ 8001, 8001, 8002 ] -connection_max = 5000 -enabled = true - -[servers] - - # You can indent as you please. Tabs or spaces. TOML don't care. - [servers.alpha] - ip = "10.0.0.1" - dc = "eqdc10" - - [servers.beta] - ip = "10.0.0.2" - dc = "eqdc10" - -[clients] -data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it
diff --git a/src/toml/lexer.go b/src/toml/lexer.go deleted file mode 100644 index 586263b..0000000 --- a/src/toml/lexer.go +++ /dev/null
@@ -1,400 +0,0 @@ -// TOML lexer.// Written using the principles developped by Rob Pike in -// http://www.youtube.com/watch?v=HxaD_trXwRE - -package toml - -import ( - "fmt" - "regexp" - "strings" - "unicode/utf8" -) - -var dateRegexp *regexp.Regexp - -// Define tokens -type tokenType int - -const ( - eof = -(iota + 1) -) - -const ( - tokenError tokenType = iota - tokenEOF - tokenComment - tokenKey - tokenEqual - tokenString - tokenInteger - tokenTrue - tokenFalse - tokenFloat - tokenLeftBracket - tokenRightBracket - tokenDate - tokenKeyGroup - tokenComma - tokenEOL -) - -type token struct { - typ tokenType - val string -} - -func (i token) String() string { - switch i.typ { - case tokenEOF: - return "EOF" - case tokenError: - return i.val - } - - if len(i.val) > 10 { - return fmt.Sprintf("%.10q...", i.val) - } - return fmt.Sprintf("%q", i.val) -} - -func isSpace(r rune) bool { - return r == ' ' || r == '\t' -} - -func isAlpha(r rune) bool { - return r >= 'a' && r <= 'z' -} - -func isDigit(r rune) bool { - return r >= '0' && r <= '9' -} - -// Define lexer -type lexer struct { - input string - start int - pos int - width int - tokens chan token - depth int -} - -func (l *lexer) run() { - for state := lexVoid; state != nil; { - state = state(l) - } - close(l.tokens) -} - -func (l *lexer) emit(t tokenType) { - l.tokens <- token{t, l.input[l.start:l.pos]} - l.start = l.pos -} - -func (l *lexer) emitWithValue(t tokenType, value string) { - l.tokens <- token{t, value} - l.start = l.pos -} - -func (l *lexer) next() rune { - if l.pos >= len(l.input) { - l.width = 0 - return eof - } - var r rune - r, l.width = utf8.DecodeRuneInString(l.input[l.pos:]) - l.pos += l.width - return r -} - -func (l *lexer) ignore() { - l.start = l.pos -} - -func (l *lexer) backup() { - l.pos -= l.width -} - -func (l *lexer) errorf(format string, args ...interface{}) stateFn { - l.tokens <- token{ - tokenError, - fmt.Sprintf(format, args...), - } - return nil -} - -func (l *lexer) peek() rune { - r := l.next() - l.backup() - return r -} - -func (l *lexer) accept(valid string) bool { - if strings.IndexRune(valid, l.next()) >= 0 { - return true - } - l.backup() - return false -} - -func (l *lexer) follow(next string) bool { - return strings.HasPrefix(l.input[l.pos:], next) -} - -// Define state functions -type stateFn func(*lexer) stateFn - -func lexVoid(l *lexer) stateFn { - for { - next := l.peek() - switch next { - case '[': - return lexKeyGroup - case '#': - return lexComment - case '=': - return lexEqual - } - - if isAlpha(next) { - return lexKey - } - - if isSpace(next) { - l.ignore() - } - - if l.next() == eof { - break - } - } - - l.emit(tokenEOF) - return nil -} - -func lexRvalue(l *lexer) stateFn { - for { - next := l.peek() - switch next { - case '[': - l.depth += 1 - return lexLeftBracket - case ']': - l.depth -= 1 - return lexRightBracket - case '#': - return lexComment - case '"': - return lexString - case ',': - return lexComma - case '\n': - l.ignore() - l.pos += 1 - if l.depth == 0 { - return lexVoid - } else { - return lexRvalue - } - } - - if l.follow("true") { - return lexTrue - } - - if l.follow("false") { - return lexFalse - } - - if isAlpha(next) { - return lexKey - } - - if dateRegexp.FindString(l.input[l.pos:]) != "" { - return lexDate - } - - if next == '+' || next == '-' || isDigit(next) { - return lexNumber - } - - if isSpace(next) { - l.ignore() - } - - if l.next() == eof { - break - } - } - - l.emit(tokenEOF) - return nil -} - -func lexDate(l *lexer) stateFn { - l.ignore() - l.pos += 20 // Fixed size of a date in TOML - l.emit(tokenDate) - return lexRvalue -} - -func lexTrue(l *lexer) stateFn { - l.ignore() - l.pos += 4 - l.emit(tokenTrue) - return lexRvalue -} - -func lexFalse(l *lexer) stateFn { - l.ignore() - l.pos += 5 - l.emit(tokenFalse) - return lexRvalue -} - -func lexEqual(l *lexer) stateFn { - l.ignore() - l.accept("=") - l.emit(tokenEqual) - return lexRvalue -} - -func lexComma(l *lexer) stateFn { - l.ignore() - l.accept(",") - l.emit(tokenComma) - return lexRvalue -} - -func lexKey(l *lexer) stateFn { - l.ignore() - for isAlpha(l.next()) { - } - l.backup() - l.emit(tokenKey) - return lexVoid -} - -func lexComment(l *lexer) stateFn { - for { - next := l.next() - if next == '\n' || next == eof { - break - } - } - l.ignore() - return lexVoid -} - -func lexLeftBracket(l *lexer) stateFn { - l.ignore() - l.pos += 1 - l.emit(tokenLeftBracket) - return lexRvalue -} - -func lexString(l *lexer) stateFn { - l.pos += 1 - l.ignore() - growing_string := "" - - for { - if l.peek() == '"' { - l.emitWithValue(tokenString, growing_string) - l.pos += 1 - l.ignore() - return lexVoid - } - - if l.follow("\\\"") { - l.pos += 1 - growing_string += "\"" - } else { - growing_string += string(l.peek()) - } - - if l.next() == eof { - break - } - } - - return l.errorf("unclosed string") -} - -func lexKeyGroup(l *lexer) stateFn { - l.ignore() - l.pos += 1 - l.emit(tokenLeftBracket) - return lexInsideKeyGroup -} - -func lexInsideKeyGroup(l *lexer) stateFn { - for { - if l.peek() == ']' { - if l.pos > l.start { - l.emit(tokenKeyGroup) - } - l.ignore() - l.pos += 1 - l.emit(tokenRightBracket) - return lexVoid - } - - if l.next() == eof { - break - } - } - return l.errorf("unclosed key group") -} - -func lexRightBracket(l *lexer) stateFn { - l.ignore() - l.pos += 1 - l.emit(tokenRightBracket) - return lexRvalue -} - -func lexNumber(l *lexer) stateFn { - l.ignore() - if !l.accept("+") { - l.accept("-") - } - point_seen := false - digit_seen := false - for { - next := l.next() - if next == '.' { - point_seen = true - } else if isDigit(next) { - digit_seen = true - } else { - l.backup() - break - } - } - - if !digit_seen { - return l.errorf("no digit in that number") - } - if point_seen { - l.emit(tokenFloat) - } else { - l.emit(tokenInteger) - } - return lexRvalue -} - -func init() { - dateRegexp = regexp.MustCompile("^\\d{1,4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z") -} - -// Entry point -func lex(input string) (*lexer, chan token) { - l := &lexer{ - input: input, - tokens: make(chan token), - } - go l.run() - return l, l.tokens -}
diff --git a/src/toml/lexer_test.go b/src/toml/lexer_test.go deleted file mode 100644 index b232705..0000000 --- a/src/toml/lexer_test.go +++ /dev/null
@@ -1,231 +0,0 @@ -package toml - -import "testing" - -func testFlow(t *testing.T, input string, expectedFlow []token) { - _, ch := lex(input) - for _, expected := range expectedFlow { - token := <-ch - if token != expected { - t.Log("compared", token, "to", expected) - t.Log(token.val, "<->", expected.val) - t.Log(token.typ, "<->", expected.typ) - t.FailNow() - } - } - - tok, ok := <-ch - if ok { - t.Log("channel is not closed!") - t.Log(len(ch)+1, "tokens remaining:") - - t.Log("token ->", tok) - for token := range ch { - t.Log("token ->", token) - } - t.FailNow() - } -} - -func TestValidKeyGroup(t *testing.T) { - testFlow(t, "[hello world]", []token{ - token{tokenLeftBracket, "["}, - token{tokenKeyGroup, "hello world"}, - token{tokenRightBracket, "]"}, - token{tokenEOF, ""}, - }) -} - -func TestUnclosedKeyGroup(t *testing.T) { - testFlow(t, "[hello world", []token{ - token{tokenLeftBracket, "["}, - token{tokenError, "unclosed key group"}, - }) -} - -func TestComment(t *testing.T) { - testFlow(t, "# blahblah", []token{ - token{tokenEOF, ""}, - }) -} - -func TestKeyGroupComment(t *testing.T) { - testFlow(t, "[hello world] # blahblah", []token{ - token{tokenLeftBracket, "["}, - token{tokenKeyGroup, "hello world"}, - token{tokenRightBracket, "]"}, - token{tokenEOF, ""}, - }) -} - -func TestMultipleKeyGroupsComment(t *testing.T) { - testFlow(t, "[hello world] # blahblah\n[test]", []token{ - token{tokenLeftBracket, "["}, - token{tokenKeyGroup, "hello world"}, - token{tokenRightBracket, "]"}, - token{tokenLeftBracket, "["}, - token{tokenKeyGroup, "test"}, - token{tokenRightBracket, "]"}, - token{tokenEOF, ""}, - }) -} - -func TestBasicKey(t *testing.T) { - testFlow(t, "hello", []token{ - token{tokenKey, "hello"}, - token{tokenEOF, ""}, - }) -} - -func TestBasicKeyAndEqual(t *testing.T) { - testFlow(t, "hello =", []token{ - token{tokenKey, "hello"}, - token{tokenEqual, "="}, - token{tokenEOF, ""}, - }) -} - -func TestKeyEqualStringEscape(t *testing.T) { - testFlow(t, "foo = \"hello\\\"\"", []token{ - token{tokenKey, "foo"}, - token{tokenEqual, "="}, - token{tokenString, "hello\""}, - token{tokenEOF, ""}, - }) -} - -func TestKeyEqualStringUnfinished(t *testing.T) { - testFlow(t, "foo = \"bar", []token{ - token{tokenKey, "foo"}, - token{tokenEqual, "="}, - token{tokenError, "unclosed string"}, - }) -} - -func TestKeyEqualString(t *testing.T) { - testFlow(t, "foo = \"bar\"", []token{ - token{tokenKey, "foo"}, - token{tokenEqual, "="}, - token{tokenString, "bar"}, - token{tokenEOF, ""}, - }) -} - -func TestKeyEqualTrue(t *testing.T) { - testFlow(t, "foo = true", []token{ - token{tokenKey, "foo"}, - token{tokenEqual, "="}, - token{tokenTrue, "true"}, - token{tokenEOF, ""}, - }) -} - -func TestKeyEqualFalse(t *testing.T) { - testFlow(t, "foo = false", []token{ - token{tokenKey, "foo"}, - token{tokenEqual, "="}, - token{tokenFalse, "false"}, - token{tokenEOF, ""}, - }) -} - -func TestKeyEqualArrayBools(t *testing.T) { - testFlow(t, "foo = [true, false, true]", []token{ - token{tokenKey, "foo"}, - token{tokenEqual, "="}, - token{tokenLeftBracket, "["}, - token{tokenTrue, "true"}, - token{tokenComma, ","}, - token{tokenFalse, "false"}, - token{tokenComma, ","}, - token{tokenTrue, "true"}, - token{tokenRightBracket, "]"}, - token{tokenEOF, ""}, - }) -} - -func TestKeyEqualArrayBoolsWithComments(t *testing.T) { - testFlow(t, "foo = [true, false, true] # YEAH", []token{ - token{tokenKey, "foo"}, - token{tokenEqual, "="}, - token{tokenLeftBracket, "["}, - token{tokenTrue, "true"}, - token{tokenComma, ","}, - token{tokenFalse, "false"}, - token{tokenComma, ","}, - token{tokenTrue, "true"}, - token{tokenRightBracket, "]"}, - token{tokenEOF, ""}, - }) -} - -func TestDateRegexp(t *testing.T) { - if dateRegexp.FindString("1979-05-27T07:32:00Z") == "" { - t.Fail() - } -} - -func TestKeyEqualDate(t *testing.T) { - testFlow(t, "foo = 1979-05-27T07:32:00Z", []token{ - token{tokenKey, "foo"}, - token{tokenEqual, "="}, - token{tokenDate, "1979-05-27T07:32:00Z"}, - token{tokenEOF, ""}, - }) -} - -func TestKeyEqualNumber(t *testing.T) { - testFlow(t, "foo = 42", []token{ - token{tokenKey, "foo"}, - token{tokenEqual, "="}, - token{tokenInteger, "42"}, - token{tokenEOF, ""}, - }) - - testFlow(t, "foo = +42", []token{ - token{tokenKey, "foo"}, - token{tokenEqual, "="}, - token{tokenInteger, "+42"}, - token{tokenEOF, ""}, - }) - - testFlow(t, "foo = -42", []token{ - token{tokenKey, "foo"}, - token{tokenEqual, "="}, - token{tokenInteger, "-42"}, - token{tokenEOF, ""}, - }) - - testFlow(t, "foo = 4.2", []token{ - token{tokenKey, "foo"}, - token{tokenEqual, "="}, - token{tokenFloat, "4.2"}, - token{tokenEOF, ""}, - }) - - testFlow(t, "foo = +4.2", []token{ - token{tokenKey, "foo"}, - token{tokenEqual, "="}, - token{tokenFloat, "+4.2"}, - token{tokenEOF, ""}, - }) - - testFlow(t, "foo = -4.2", []token{ - token{tokenKey, "foo"}, - token{tokenEqual, "="}, - token{tokenFloat, "-4.2"}, - token{tokenEOF, ""}, - }) -} - -func TestMultiline(t *testing.T) { - testFlow(t, "foo = 42\nbar=21", []token{ - token{tokenKey, "foo"}, - token{tokenEqual, "="}, - token{tokenInteger, "42"}, - token{tokenKey, "bar"}, - token{tokenEqual, "="}, - token{tokenInteger, "21"}, - token{tokenEOF, ""}, - }) -}
diff --git a/src/toml/parser.go b/src/toml/parser.go deleted file mode 100644 index fc6a6ff..0000000 --- a/src/toml/parser.go +++ /dev/null
@@ -1,184 +0,0 @@ -// TOML Parser. - -package toml - -import ( - "fmt" - "strconv" - "time" -) - -type parser struct { - flow chan token - tree *TomlTree - tokensBuffer []token - currentGroup string -} - -type parserStateFn func(*parser) parserStateFn - -func (p *parser) run() { - for state := parseStart; state != nil; { - state = state(p) - } -} - -func (p *parser) peek() *token { - if len(p.tokensBuffer) != 0 { - return &(p.tokensBuffer[0]) - } - - tok, ok := <-p.flow - if !ok { - return nil - } - p.tokensBuffer = append(p.tokensBuffer, tok) - return &tok -} - -func (p *parser) assume(typ tokenType) { - tok := p.getToken() - if tok == nil { - panic(fmt.Sprintf("was expecting token %s, but token stream is empty", typ)) - } - if tok.typ != typ { - panic(fmt.Sprintf("was expecting token %s, but got %s", typ, tok.typ)) - } -} - -func (p *parser) getToken() *token { - if len(p.tokensBuffer) != 0 { - tok := p.tokensBuffer[0] - p.tokensBuffer = p.tokensBuffer[1:] - return &tok - } - tok, ok := <-p.flow - if !ok { - return nil - } - return &tok -} - -func parseStart(p *parser) parserStateFn { - tok := p.peek() - - // end of stream, parsing is finished - if tok == nil { - return nil - } - - switch tok.typ { - case tokenLeftBracket: - return parseGroup - case tokenKey: - return parseAssign - case tokenEOF: - return nil - default: - panic("unexpected token") - } - return nil -} - -func parseGroup(p *parser) parserStateFn { - p.getToken() // discard the [ - key := p.getToken() - if key.typ != tokenKeyGroup { - panic(fmt.Sprintf("unexpected token %s, was expecting a key group", key)) - } - p.tree.createSubTree(key.val) - p.assume(tokenRightBracket) - p.currentGroup = key.val - return parseStart(p) -} - -func parseAssign(p *parser) parserStateFn { - key := p.getToken() - p.assume(tokenEqual) - value := parseRvalue(p) - final_key := key.val - if p.currentGroup != "" { - final_key = p.currentGroup + "." + key.val - } - p.tree.Set(final_key, value) - return parseStart(p) -} - -func parseRvalue(p *parser) interface{} { - tok := p.getToken() - if tok == nil { - panic("expecting a value") - } - - switch tok.typ { - case tokenString: - return tok.val - case tokenTrue: - return true - case tokenFalse: - return false - case tokenInteger: - val, err := strconv.ParseInt(tok.val, 10, 64) - if err != nil { - panic(err) - } - return val - case tokenFloat: - val, err := strconv.ParseFloat(tok.val, 64) - if err != nil { - panic(err) - } - return val - case tokenDate: - val, err := time.Parse(time.RFC3339, tok.val) - if err != nil { - panic(err) - } - return val - case tokenLeftBracket: - return parseArray(p) - } - - panic("never reached") - - return nil -} - -func parseArray(p *parser) []interface{} { - array := make([]interface{}, 0) - for { - follow := p.peek() - if follow == nil { - panic("unterminated array") - } - if follow.typ == tokenRightBracket { - p.getToken() - return array - } - val := parseRvalue(p) - array = append(array, val) - follow = p.peek() - if follow == nil { - panic("unterminated array") - } - if follow.typ != tokenRightBracket && follow.typ != tokenComma { - panic("missing comma") - } - if follow.typ == tokenComma { - p.getToken() - } - } - return array -} - -func parse(flow chan token) *TomlTree { - result := make(TomlTree) - parser := &parser{ - flow: flow, - tree: &result, - tokensBuffer: make([]token, 0), - currentGroup: "", - } - parser.run() - return parser.tree -}
diff --git a/src/toml/parser_test.go b/src/toml/parser_test.go deleted file mode 100644 index fd271ce..0000000 --- a/src/toml/parser_test.go +++ /dev/null
@@ -1,103 +0,0 @@ -package toml - -import ( - "fmt" - "testing" - "time" -) - -func assertTree(t *testing.T, tree *TomlTree, ref map[string]interface{}) { - for k, v := range ref { - if fmt.Sprintf("%v", tree.Get(k)) != fmt.Sprintf("%v", v) { - t.Log("was expecting", v, "at", k, "but got", tree.Get(k)) - t.Fail() - } - } -} - -func TestCreateSubTree(t *testing.T) { - tree := make(TomlTree) - tree.createSubTree("a.b.c") - tree.Set("a.b.c", 42) - if tree.Get("a.b.c") != 42 { - t.Fail() - } -} - -func TestSimpleKV(t *testing.T) { - tree := Load("a = 42") - assertTree(t, tree, map[string]interface{}{ - "a": int64(42), - }) - - tree = Load("a = 42\nb = 21") - assertTree(t, tree, map[string]interface{}{ - "a": int64(42), - "b": int64(21), - }) -} - -func TestSimpleNumbers(t *testing.T) { - tree := Load("a = +42\nb = -21\nc = +4.2\nd = -2.1") - assertTree(t, tree, map[string]interface{}{ - "a": int64(42), - "b": int64(-21), - "c": float64(4.2), - "d": float64(-2.1), - }) -} - -func TestSimpleDate(t *testing.T) { - tree := Load("a = 1979-05-27T07:32:00Z") - assertTree(t, tree, map[string]interface{}{ - "a": time.Date(1979, time.May, 27, 7, 32, 0, 0, time.UTC), - }) -} - -func TestSimpleString(t *testing.T) { - tree := Load("a = \"hello world\"") - assertTree(t, tree, map[string]interface{}{ - "a": "hello world", - }) -} - -func TestBools(t *testing.T) { - tree := Load("a = true\nb = false") - assertTree(t, tree, map[string]interface{}{ - "a": true, - "b": false, - }) -} - -func TestNestedKeys(t *testing.T) { - tree := Load("[a.b.c]\nd = 42") - assertTree(t, tree, map[string]interface{}{ - "a.b.c.d": int64(42), - }) -} - -func TestArraySimple(t *testing.T) { - tree := Load("a = [42, 21, 10]") - assertTree(t, tree, map[string]interface{}{ - "a": []int64{int64(42), int64(21), int64(10)}, - }) - - tree = Load("a = [42, 21, 10,]") - assertTree(t, tree, map[string]interface{}{ - "a": []int64{int64(42), int64(21), int64(10)}, - }) -} - -func TestArrayMultiline(t *testing.T) { - tree := Load("a = [42,\n21, 10,]") - assertTree(t, tree, map[string]interface{}{ - "a": []int64{int64(42), int64(21), int64(10)}, - }) -} - -func TestArrayNested(t *testing.T) { - tree := Load("a = [[42, 21], [10]]") - assertTree(t, tree, map[string]interface{}{ - "a": [][]int64{[]int64{int64(42), int64(21)}, []int64{int64(10)}}, - }) -}
diff --git a/src/toml/toml.go b/src/toml/toml.go deleted file mode 100644 index e8f5556..0000000 --- a/src/toml/toml.go +++ /dev/null
@@ -1,80 +0,0 @@ -// TOML markup language parser. -// -// This version supports the specification as described in -// https://github.com/mojombo/toml/tree/e3656ad493400895f4460f1244a25f8f8e31a32a -package toml - -import ( - "strings" -) - -// Definition of a TomlTree. -// This is the result of the parsing of a TOML file. -type TomlTree map[string]interface{} - -// Keys returns the keys of the toplevel tree. -// Warning: this is a costly operation. -func (t *TomlTree) Keys() []string { - keys := make([]string, 0) - mp := (map[string]interface{})(*t) - for k, _ := range mp { - keys = append(keys, k) - } - return keys -} - -// Get the value at key in the TomlTree. -// Key is a dot-separated path (e.g. a.b.c). -// Returns nil if the path does not exist in the tree. -func (t *TomlTree) Get(key string) interface{} { - subtree := t - keys := strings.Split(key, ".") - for _, intermediate_key := range keys[:len(keys)-1] { - _, exists := (*subtree)[intermediate_key] - if !exists { - return nil - } - subtree = (*subtree)[intermediate_key].(*TomlTree) - } - return (*subtree)[keys[len(keys)-1]] -} - -// Set an element in the tree. -// Key is a dot-separated path (e.g. a.b.c). -// Creates all necessary intermediates trees, if needed. -func (t *TomlTree) Set(key string, value interface{}) { - subtree := t - keys := strings.Split(key, ".") - for _, intermediate_key := range keys[:len(keys)-1] { - _, exists := (*subtree)[intermediate_key] - if !exists { - var new_tree TomlTree = make(TomlTree) - (*subtree)[intermediate_key] = &new_tree - } - subtree = (*subtree)[intermediate_key].(*TomlTree) - } - (*subtree)[keys[len(keys)-1]] = value -} - -// createSubTree takes a tree and a key andcreate the necessary intermediate -// subtrees to create a subtree at that point. In-place. -// -// e.g. passing a.b.c will create (assuming tree is empty) tree[a], tree[a][b] -// and tree[a][b][c] -func (t *TomlTree) createSubTree(key string) { - subtree := t - for _, intermediate_key := range strings.Split(key, ".") { - _, exists := (*subtree)[intermediate_key] - if !exists { - var new_tree TomlTree = make(TomlTree) - (*subtree)[intermediate_key] = &new_tree - } - subtree = ((*subtree)[intermediate_key]).(*TomlTree) - } -} - -// Create a TomlTree from a string. -func Load(content string) *TomlTree { - _, flow := lex(content) - return parse(flow) -}
diff --git a/src/toml/toml_test.go b/src/toml/toml_test.go deleted file mode 100644 index f9fa173..0000000 --- a/src/toml/toml_test.go +++ /dev/null
@@ -1 +0,0 @@ -package toml