pkl icon indicating copy to clipboard operation
pkl copied to clipboard

Creating a `Dynamic` with property `default` set produces a broken object

Open HT154 opened this issue 1 year ago • 3 comments

The behavior as-is is very surprising! Check this out:

import "pkl:json"

hidden jsonString = """
  {
    "hello": "world",
    "default": "greeting"
  }
  """

asDynamic = new json.Parser {}.parse(jsonString)
asMapping = new json.Parser { useMapping = true }.parse(jsonString)

Result:

asDynamic {
  hello = "world"
}
asMapping {
  ["hello"] = "world"
  ["default"] = "greeting"
}

I think throwing an error (or at least some kind of warning) here instead of returning unexpected results is desirable. Something like "encountered object key default when parsing JSON, resulting Dynamic will be incomplete or invalid" might make sense.

N.B.: Attempting to access the default yields further surprises:

asDynamicDefault = asDynamic.default

Result:

❯ pkl eval test.pkl
–– Pkl Error ––
Expected value of type `Function1`, but got type `String`.
Value: "greeting"

1741 | hidden default: (unknown) -> Any = (_) -> new Dynamic {}
                       ^^^^^^^^^^^^^^^^
at pkl.base#Dynamic.default (https://github.com/apple/pkl/blob/0.26.0/stdlib/base.pkl#L1741)

1 | 
    ^
at generated (source:unavailable)

11 | asDynamicDefault = asDynamic.default
                        ^^^^^^^^^^^^^^^^^
at test#asDynamicDefault (file:///.../test.pkl, line 11)

106 | text = renderer.renderDocument(value)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
at pkl.base#Module.output.text (https://github.com/apple/pkl/blob/0.26.0/stdlib/base.pkl#L106)

This similarly affects yaml.Parser.parse() and Map.toDynamic().

HT154 avatar Jun 29 '24 20:06 HT154

Fair issue; seems like a good idea to throw here instead.

bioball avatar Jul 03 '24 19:07 bioball

Hey, I can take this up.

lemonnn-8 avatar Aug 24 '24 16:08 lemonnn-8

This actually doesn't just affect JSON/YAML parsing. It also affects Map.toDynamic():

❯ pkl eval pkl:base -x 'Map("default",  1, "other", 2).toMap().toDynamic().default'       
–– Pkl Error ––
Expected value of type `Function1`, but got type `Int`.
Value: 1

HT154 avatar Feb 07 '25 19:02 HT154