hcl: support variable interpolations for compat with libucl
This commit is contained in:
parent
c6802d3070
commit
f65d314d58
@ -18,6 +18,7 @@ func TestDecode_interface(t *testing.T) {
|
|||||||
false,
|
false,
|
||||||
map[string]interface{}{
|
map[string]interface{}{
|
||||||
"foo": "bar",
|
"foo": "bar",
|
||||||
|
"bar": "${file(\"bing/bong.txt\")}",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
19
hcl/lex.go
19
hcl/lex.go
@ -224,6 +224,8 @@ func (x *hclLex) lexNumber(yylval *hclSymType) int {
|
|||||||
|
|
||||||
// lexString extracts a string from the input
|
// lexString extracts a string from the input
|
||||||
func (x *hclLex) lexString(yylval *hclSymType) int {
|
func (x *hclLex) lexString(yylval *hclSymType) int {
|
||||||
|
braces := 0
|
||||||
|
|
||||||
var b bytes.Buffer
|
var b bytes.Buffer
|
||||||
for {
|
for {
|
||||||
c := x.next()
|
c := x.next()
|
||||||
@ -232,10 +234,25 @@ func (x *hclLex) lexString(yylval *hclSymType) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// String end
|
// String end
|
||||||
if c == '"' {
|
if c == '"' && braces == 0 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we're starting into variable, mark it
|
||||||
|
if braces == 0 && c == '$' && x.peek() == '{' {
|
||||||
|
braces += 1
|
||||||
|
|
||||||
|
if _, err := b.WriteRune(c); err != nil {
|
||||||
|
return lexEOF
|
||||||
|
}
|
||||||
|
c = x.next()
|
||||||
|
} else if braces > 0 && c == '{' {
|
||||||
|
braces += 1
|
||||||
|
}
|
||||||
|
if braces > 0 && c == '}' {
|
||||||
|
braces -= 1
|
||||||
|
}
|
||||||
|
|
||||||
if _, err := b.WriteRune(c); err != nil {
|
if _, err := b.WriteRune(c); err != nil {
|
||||||
return lexEOF
|
return lexEOF
|
||||||
}
|
}
|
||||||
|
@ -125,6 +125,11 @@ func (x *jsonLex) lexString(yylval *jsonSymType) int {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we're escaping a quote, then escape the quote
|
||||||
|
if c == '\\' && x.peek() == '"' {
|
||||||
|
c = x.next()
|
||||||
|
}
|
||||||
|
|
||||||
if _, err := b.WriteRune(c); err != nil {
|
if _, err := b.WriteRune(c); err != nil {
|
||||||
return lexEOF
|
return lexEOF
|
||||||
}
|
}
|
||||||
|
@ -1 +1,2 @@
|
|||||||
foo = "bar"
|
foo = "bar"
|
||||||
|
bar = "${file("bing/bong.txt")}"
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
{
|
{
|
||||||
"foo": "bar"
|
"foo": "bar",
|
||||||
|
"bar": "${file(\"bing/bong.txt\")}"
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user