You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
If you provide a ?toString (i.e. FORMATTER_TO_STRING) on a string value, you'll get double double quotes, which makes no sense (at least I can't think of a single context where it would).
Also, it's impossible to e.g. process a directive accepting a string into an annotation with the string value passed verbatim. There is no ?omitStringQuotes (or ?noQuotes/?value/?raw etc.) or similar solution. A ValueMapper adds quotes by default for strings (via https://github.com/kobylynskyi/graphql-java-codegen/blob/main/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueMapper.java#L108 ), so this prevents of using it literally e.g. to generate a Spring Boot SpEL value for @PreAuthorize, since any double quote will obviously break it. This can be worked around by using string concat, which consumes the quotes, but it still blocks the use of strings from directives in complex expressions etc., e.g. as a (part of) the annotation name or name of the annotation param, because the quotes will usually break everything, especially since there is physically no way to escape the final one.
Code-wise, it would be best if mapString could just return value.getValue() with no quotes, and then e.g. ValueFormatter could have its format method altered to accept an additional param isString, that would add quotes only once regardless of the ?toString, and that would not add it with ?omitStringQuotes.
Steps to Reproduce
create an annotation with a String/ID param
try to map that annotation param via {{param?toString}}
try to map that annotation param to an unquoted value to e.g. use it in a quoted expression (currently possible only with extensive concat magic)
Expected Result
Single double quotes both by default and with ?toString, e.g. @Annotation(value = "foobar") , for both "@Annotation(value = {{foobarParam}}" and "@Annotation(value = {{foobarParam?toString}})"
No double quotes if requested, e.g. @Annotation(value = "prefoobarExtra") , for e.g. "@Annotation(value = \"pre{{foobarParam?omitStringQuotes}}Extra\""
Actual Result
Double double quotes with ?toString, e.g. @Annotation(value = ""foobar"") , for "@Annotation(value = {{foobarParam?toString}})"
No easy way to get rid of the double quotes, e.g. @Annotation(value = "pre"foobar"Extra") , for mapping "@Annotation(value = \"pre{{foobarParam}}Extra\"") ; possible workaround ATM is to use string concatenation via e.g. "@Annotation(value = \"pre\"+{{foobarParam}}+\"Extra\"), but a) it's really ugly in the generated code and feels like more of a hack and not a normal use case, especially since the code could theoretically be generated without the need for such tricks easily, and b) it only works in the simplest cases, when the directive string value is consumed as a concatenable string finally, and not e.g. as a (part of) a name of annotation/annotation param/enum value etc.
Your Environment and Setup
graphql-java-codegen version: 5.8.0
Build tool: Gradle 8.4, Kotlin DSL
Mapping Config: irrelevant, see above
The text was updated successfully, but these errors were encountered:
FyiurAmron
changed the title
?toString gives double double quotes, and no way to get unquoted string
?toString gives double double quotes on Strings, and no way to get unquoted string
Nov 10, 2023
Issue Description
If you provide a
?toString
(i.e. FORMATTER_TO_STRING) on a string value, you'll get double double quotes, which makes no sense (at least I can't think of a single context where it would).Also, it's impossible to e.g. process a directive accepting a string into an annotation with the string value passed verbatim. There is no
?omitStringQuotes
(or?noQuotes
/?value
/?raw
etc.) or similar solution. AValueMapper
adds quotes by default for strings (via https://github.com/kobylynskyi/graphql-java-codegen/blob/main/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueMapper.java#L108 ), so this prevents of using it literally e.g. to generate a Spring Boot SpEL value for@PreAuthorize
, since any double quote will obviously break it. This can be worked around by using string concat, which consumes the quotes, but it still blocks the use of strings from directives in complex expressions etc., e.g. as a (part of) the annotation name or name of the annotation param, because the quotes will usually break everything, especially since there is physically no way to escape the final one.Code-wise, it would be best if
mapString
could just returnvalue.getValue()
with no quotes, and then e.g.ValueFormatter
could have itsformat
method altered to accept an additional paramisString
, that would add quotes only once regardless of the?toString
, and that would not add it with?omitStringQuotes
.Steps to Reproduce
{{param?toString}}
Expected Result
?toString
, e.g.@Annotation(value = "foobar")
, for both"@Annotation(value = {{foobarParam}}"
and"@Annotation(value = {{foobarParam?toString}})"
@Annotation(value = "prefoobarExtra")
, for e.g."@Annotation(value = \"pre{{foobarParam?omitStringQuotes}}Extra\""
Actual Result
?toString
, e.g.@Annotation(value = ""foobar"")
, for"@Annotation(value = {{foobarParam?toString}})"
@Annotation(value = "pre"foobar"Extra")
, for mapping"@Annotation(value = \"pre{{foobarParam}}Extra\"")
; possible workaround ATM is to use string concatenation via e.g."@Annotation(value = \"pre\"+{{foobarParam}}+\"Extra\")
, but a) it's really ugly in the generated code and feels like more of a hack and not a normal use case, especially since the code could theoretically be generated without the need for such tricks easily, and b) it only works in the simplest cases, when the directive string value is consumed as a concatenable string finally, and not e.g. as a (part of) a name of annotation/annotation param/enum value etc.Your Environment and Setup
The text was updated successfully, but these errors were encountered: