-
Notifications
You must be signed in to change notification settings - Fork 266
Description
Specifically I'm concerned here with the encoding of NaN/Infinity (but also types, which don't have any examples in the conformance suite).
The implication here seems to be that "%s".format([a_list_or_map_here]) should be a valid CEL expression for the list or map literal. String keys/values must be properly quoted, byte strings need a b prefix, doubles must be clearly identifiable as doubles with a forced decimal separator, durations and timestamps need to use duration("str") or timestamp("str") syntax, and types should also use the type(str) syntax (there's no conformance tests though for this, and cel-go attempts to do this but fails due to a bug in the code).
However, NaN and infinity doubles get converted to strings rather than double("str") literals.
test: {
name: "map support (all key types)"
expr: '"map with multiple key types: %s".format([{1: "value1", uint(2): "value2", true: double("NaN")}])'
value: {
string_value: 'map with multiple key types: {1:"value1", 2:"value2", true:"NaN"}',
}
}
The odds that an implementation would have some kind of "debug string" method that can take any CEL value and convert it to a valid CEL expression for that value seems pretty high, but then there are special cases like this where that would be incorrect in implementing %s formatting for lists/maps. I'm wondering if it's intentional that this is just a string rather than double("NaN") or double("Inf")?
(The other thing lost here is that uints are defined as not having a u suffix when they show up in a list/map, which is also described in the conformance test above. I would have expected uint(2) to show up in the output as 2u.)