virtuald / pyhcl

HCL is a configuration language. pyhcl is a python parser for it.
Mozilla Public License 2.0
335 stars 60 forks source link

Parsing issue on jsonencode #80

Closed marcmillien closed 3 years ago

marcmillien commented 3 years ago

jsonencode triggers an error due to interger:

$ cat my.tf 
resource "aws_sqs_queue" "terraform_queue" {
  name                      = "terraform-example-queue"
  delay_seconds             = 90
  max_message_size          = 2048
  message_retention_seconds = 86400
  receive_wait_time_seconds = 10
  redrive_policy = jsonencode({
    deadLetterTargetArn = "dontcare"
    maxReceiveCount     = 4
  })
}

$ hcltool my.tf
Traceback (most recent call last):
  File "terraform/.venv/bin/hcltool", line 45, in <module>
    main()
  File "terraform/.venv/bin/hcltool", line 35, in main
    obj = hcl.load(infile)
  File "terraform/.venv/lib/python3.7/site-packages/hcl/api.py", line 62, in load
    return loads(fp.read(), export_comments=export_comments)
  File "terraform/.venv/lib/python3.7/site-packages/hcl/api.py", line 81, in loads
    return HclParser().parse(s, export_comments=export_comments)
  File "terraform/.venv/lib/python3.7/site-packages/hcl/parser.py", line 643, in parse
    s, lexer=Lexer(export_comments=export_comments), debug=DEBUG
  File "terraform/.venv/lib/python3.7/site-packages/hcl/ply/yacc.py", line 409, in parse
    p.callable(pslice)
  File "terraform/.venv/lib/python3.7/site-packages/hcl/parser.py", line 365, in p_function_0
    p[0] = p[1] + p[2] + self.flatten(p[3]) + p[4]
  File "terraform/.venv/lib/python3.7/site-packages/hcl/parser.py", line 405, in flatten
    return ",".join(self.flatten(v) for v in value)
  File "terraform/.venv/lib/python3.7/site-packages/hcl/parser.py", line 405, in <genexpr>
    return ",".join(self.flatten(v) for v in value)
  File "terraform/.venv/lib/python3.7/site-packages/hcl/parser.py", line 402, in flatten
    + "}"
  File "terraform/.venv/lib/python3.7/site-packages/hcl/parser.py", line 401, in <genexpr>
    + ",".join(key + ":" + self.flatten(value[key]) for key in value)
  File "terraform/.venv/lib/python3.7/site-packages/hcl/parser.py", line 423, in flatten
    type(value),
TypeError: ('%s is of type %s; expected type of dict, list, tuple, or str', '4', <class 'int'>)

It is possible to get interger into jsonencode: https://docs.aws.amazon.com/fr_fr/AWSCloudFormation/latest/UserGuide/aws-properties-sqs-queues.html#aws-sqs-queue-redrive

virtuald commented 3 years ago

That appears to be HCL2, which is not supported by this library. Please see the README.