Add support for map properties
Example: foo { // string property name: "hello", // map property translations: { ge: "guten tag", fr: "bonjour", }, } Change-Id: Ib9e6570cb6f355677b4ba0235e8fb4186e40f5f8
This commit is contained in:
parent
5f7ef51f7a
commit
2476f81d84
2 changed files with 73 additions and 0 deletions
|
@ -201,6 +201,8 @@ func (p *parser) parseValue() (value Value) {
|
|||
return p.parseStringValue()
|
||||
case '[':
|
||||
return p.parseListValue()
|
||||
case '{':
|
||||
return p.parseMapValue()
|
||||
default:
|
||||
p.errorf("expected bool, list, or string value; found %s",
|
||||
scanner.TokenString(p.tok))
|
||||
|
@ -262,12 +264,27 @@ func (p *parser) parseListValue() (value Value) {
|
|||
return
|
||||
}
|
||||
|
||||
func (p *parser) parseMapValue() (value Value) {
|
||||
value.Type = Map
|
||||
value.Pos = p.scanner.Position
|
||||
if !p.accept('{') {
|
||||
return
|
||||
}
|
||||
|
||||
properties := p.parsePropertyList()
|
||||
value.MapValue = properties
|
||||
|
||||
p.accept('}')
|
||||
return
|
||||
}
|
||||
|
||||
type ValueType int
|
||||
|
||||
const (
|
||||
Bool ValueType = iota
|
||||
String
|
||||
List
|
||||
Map
|
||||
)
|
||||
|
||||
func (p ValueType) String() string {
|
||||
|
@ -278,6 +295,8 @@ func (p ValueType) String() string {
|
|||
return "string"
|
||||
case List:
|
||||
return "list"
|
||||
case Map:
|
||||
return "map"
|
||||
default:
|
||||
panic(fmt.Errorf("unknown value type: %d", p))
|
||||
}
|
||||
|
@ -332,6 +351,7 @@ type Value struct {
|
|||
BoolValue bool
|
||||
StringValue string
|
||||
ListValue []Value
|
||||
MapValue []*Property
|
||||
Pos scanner.Position
|
||||
}
|
||||
|
||||
|
@ -348,6 +368,13 @@ func (p Value) String() string {
|
|||
}
|
||||
return fmt.Sprintf("@%d:%s[%s]", p.Pos.Offset, p.Pos,
|
||||
strings.Join(valueStrings, ", "))
|
||||
case Map:
|
||||
propertyStrings := make([]string, len(p.MapValue))
|
||||
for i, property := range p.MapValue {
|
||||
propertyStrings[i] = property.String()
|
||||
}
|
||||
return fmt.Sprintf("@%d:%s{%s}", p.Pos.Offset, p.Pos,
|
||||
strings.Join(propertyStrings, ", "))
|
||||
default:
|
||||
panic(fmt.Errorf("bad property type: %d", p.Type))
|
||||
}
|
||||
|
|
|
@ -130,6 +130,52 @@ var validParseTestCases = []struct {
|
|||
},
|
||||
},
|
||||
|
||||
{`
|
||||
foo {
|
||||
stuff: {
|
||||
isGood: true,
|
||||
name: "bar"
|
||||
}
|
||||
}
|
||||
`,
|
||||
[]Definition{
|
||||
&Module{
|
||||
Type: "foo",
|
||||
Pos: mkpos(3, 2, 3),
|
||||
Properties: []*Property{
|
||||
{
|
||||
Name: "stuff",
|
||||
Pos: mkpos(12, 3, 4),
|
||||
Value: Value{
|
||||
Type: Map,
|
||||
Pos: mkpos(19, 3, 11),
|
||||
MapValue: []*Property{
|
||||
{
|
||||
Name: "isGood",
|
||||
Pos: mkpos(25, 4, 5),
|
||||
Value: Value{
|
||||
Type: Bool,
|
||||
Pos: mkpos(33, 4, 13),
|
||||
BoolValue: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
Name: "name",
|
||||
Pos: mkpos(43, 5, 5),
|
||||
Value: Value{
|
||||
Type: String,
|
||||
Pos: mkpos(49, 5, 11),
|
||||
StringValue: "bar",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
{`
|
||||
// comment
|
||||
foo {
|
||||
|
|
Loading…
Reference in a new issue