Inline tables

This commit is contained in:
Thomas Pelletier
2021-02-01 21:41:34 -05:00
parent bac65cc530
commit 44f7a7aead
2 changed files with 90 additions and 0 deletions
+85
View File
@@ -30,6 +30,9 @@ type builder interface {
ArrayBegin() ArrayBegin()
ArrayEnd() ArrayEnd()
ArraySeparator() ArraySeparator()
InlineTableBegin()
InlineTableEnd()
InlineTableSeparator()
} }
type position struct { type position struct {
@@ -41,6 +44,18 @@ type documentBuilder struct {
document Document document Document
} }
func (d *documentBuilder) InlineTableSeparator() {
fmt.Println(", InlineTable SEPARATOR")
}
func (d *documentBuilder) InlineTableBegin() {
fmt.Println("{ InlineTable BEGIN")
}
func (d *documentBuilder) InlineTableEnd() {
fmt.Println("} InlineTable END")
}
func (d *documentBuilder) ArraySeparator() { func (d *documentBuilder) ArraySeparator() {
fmt.Println(", ARRAY SEPARATOR") fmt.Println(", ARRAY SEPARATOR")
} }
@@ -358,12 +373,81 @@ func (p *parser) parseVal() error {
return p.parseString() return p.parseString()
case '[': case '[':
return p.parseArray() return p.parseArray()
case '{':
return p.parseInlineTable()
// TODO // TODO
default: default:
return &InvalidCharacter{r: r} return &InvalidCharacter{r: r}
} }
} }
func (p *parser) parseInlineTable() error {
//inline-table = inline-table-open [ inline-table-keyvals ] inline-table-close
//
//inline-table-open = %x7B ws ; {
// inline-table-close = ws %x7D ; }
//inline-table-sep = ws %x2C ws ; , Comma
//
//inline-table-keyvals = keyval [ inline-table-sep inline-table-keyvals ]
err := p.expect('{')
if err != nil {
panic("inline tables should start with {")
}
p.ignore()
p.builder.InlineTableBegin()
err = p.parseWhitespace()
if err != nil {
return err
}
r := p.peek()
if r == '}' {
p.next()
p.ignore()
p.builder.InlineTableEnd()
return nil
}
err = p.parseKeyval()
if err != nil {
return err
}
for {
err = p.parseWhitespace()
if err != nil {
return err
}
r := p.peek()
if r == '}' {
p.next()
p.ignore()
p.builder.InlineTableEnd()
return nil
}
err := p.expect(',')
if err != nil {
return err
}
p.builder.InlineTableSeparator()
p.ignore()
err = p.parseWhitespace()
if err != nil {
return err
}
err = p.parseKeyval()
if err != nil {
return err
}
}
}
func (p *parser) parseArray() error { func (p *parser) parseArray() error {
//array = array-open [ array-values ] ws-comment-newline array-close //array = array-open [ array-values ] ws-comment-newline array-close
@@ -371,6 +455,7 @@ func (p *parser) parseArray() error {
if err != nil { if err != nil {
panic("arrays should start with [") panic("arrays should start with [")
} }
p.ignore()
p.builder.ArrayBegin() p.builder.ArrayBegin()
+5
View File
@@ -29,6 +29,8 @@ var inputs = []string{
`c = [[[]]]`, `c = [[[]]]`,
`d = ["foo","bar"]`, `d = ["foo","bar"]`,
`d = ["foo", "test"]`, `d = ["foo", "test"]`,
`d = {}`,
`e = {f = "bar"}`,
} }
func TestParse(t *testing.T) { func TestParse(t *testing.T) {
@@ -45,6 +47,9 @@ func TestParse(t *testing.T) {
type noopBuilder struct { type noopBuilder struct {
} }
func (n noopBuilder) InlineTableSeparator() {}
func (n noopBuilder) InlineTableBegin() {}
func (n noopBuilder) InlineTableEnd() {}
func (n noopBuilder) ArraySeparator() {} func (n noopBuilder) ArraySeparator() {}
func (n noopBuilder) ArrayBegin() {} func (n noopBuilder) ArrayBegin() {}
func (n noopBuilder) ArrayEnd() {} func (n noopBuilder) ArrayEnd() {}