From 91d7afbc0a1a79f786707ecaf18c8c8e456a64b8 Mon Sep 17 00:00:00 2001 From: Thomas Pelletier Date: Mon, 1 Feb 2021 20:54:04 -0500 Subject: [PATCH] Parse rvalue string --- toml.go | 42 +++++++++++++++++++++++++++++++++++++++--- toml_test.go | 2 ++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/toml.go b/toml.go index a03fa71..177e111 100644 --- a/toml.go +++ b/toml.go @@ -110,11 +110,24 @@ type parser struct { lookahead lookahead } -func (p *parser) peek() rune { - if p.end >= len(p.data) { +func (p *parser) at(i int) rune { + if p.end+i >= len(p.data) { return eof } - return rune(p.data[p.end]) + return rune(p.data[p.end+i]) +} + +func (p *parser) follows(s string) bool { + for i := 0; i < len(s); i++ { + if rune(s[i]) != p.at(i) { + return false + } + } + return true +} + +func (p *parser) peek() rune { + return p.at(0) } func (p *parser) next() rune { @@ -310,11 +323,34 @@ func (p *parser) parseVal() error { switch r { case 't', 'f': return p.parseBool() + case '\'', '"': + return p.parseString() // TODO default: return &InvalidCharacter{r: r} } } +func (p *parser) parseString() error { + r := p.peek() + + if r == '\'' { + if p.follows("'''") { + // TODO ml-literal-string + panic("TODO") + } else { + return p.parseLiteralString() + } + } else if r == '"' { + if p.follows("\"\"\"") { + // TODO ml-basic-string + panic("TODO") + } else { + return p.parseBasicString() + } + } else { + panic("string should start with ' or \"") + } +} func (p *parser) parseBool() error { r := p.peek() diff --git a/toml_test.go b/toml_test.go index bb26178..3491e6a 100644 --- a/toml_test.go +++ b/toml_test.go @@ -22,6 +22,8 @@ var inputs = []string{ `"hello \u1234 foo" = false`, `a.b.c = false`, `a."b".c = true`, + `a = "foo"`, + `b = 'sample thingy'`, } func TestParse(t *testing.T) {