springwolf-core icon indicating copy to clipboard operation
springwolf-core copied to clipboard

Examples for enums with fields are wrapped in double and single quotes

Open sam0r040 opened this issue 1 year ago • 6 comments

FYI, I think I have a better understanding of the cause regarding enums being between ' " ... " ' .

  1. Let's consider this enum:
@Getter
@RequiredArgsConstructor
public enum MessageStatus {
    OK(200, "OK"),
    BAD_REQUEST(400, "Bad Request"),
    UNAUTHORIZED(401, "Unauthorized"),
    NOT_FOUND(404, "Not Found"),
    INTERNAL_SERVER_ERROR(500, "Internal Server Error");

    private final int value;
    private final String reasonPhrase;
}

generated yaml is:

    my.package.infra.remote_service_1.message.reply.MessageReply:
      type: object
      properties:
        errorMessage:
          type: string
        messageStatus:
          type: string
          enum:
            - OK
            - BAD_REQUEST
            - UNAUTHORIZED
            - NOT_FOUND
            - INTERNAL_SERVER_ERROR
        payload:
          $ref: '#/components/schemas/my.package.infra.remote_service_1.message.reply.Message'
      examples:
        - errorMessage: string
          messageStatus: OK
          payload:
 

No problem here: messageStatus: OK is correct, i.e., OK is NOT surrounded by single and double quote

  1. If I add the annotation @Schema(enumAsRef = true) on the MessageStatusclass, then the generated yaml is:
    my.package.infra.remote_service_1.message.reply.MessageReply:
      type: object
      properties:
        errorMessage:
          type: string
        messageStatus:
          $ref: '#/components/schemas/my.package.infra.remote_service_1.message.reply.MessageStatus'
        payload:
          $ref: '#/components/schemas/my.package.infra.remote_service_1.message.reply.Message'
      examples:
        - errorMessage: string
          messageStatus: '"OK"'
          payload:

So, having enum being Component, seems to 'trigger' the bug (I guess this is a bug...?), i.e., turn

   messageStatus: OK

into

   messageStatus: '"OK"'

Which is NOT correct

  1. now, If I change @Schema(enumAsRef = true) to @Schema(enumAsRef = true, example = "OK") the generated yaml is now:
   my.package.infra.remote_service_1.message.reply.MessageReply:
     type: object
     properties:
       errorMessage:
         type: string
       messageStatus:
         $ref: '#/components/schemas/my.package.infra.remote_service_1.message.reply.MessageStatus'
       payload:
         $ref: '#/components/schemas/my.package.infra.remote_service_1.message.reply.Message'
     examples:
       - errorMessage: string
         messageStatus: OK
         payload:

So, exactly the same as before EXCEPT FOR messageStatus: OK which does not have the ' " ... " ' around the enum anymore.

I could not find this bug being reported in https://github.com/asyncapi/parser-js/issues?q=is%3Aissue+is%3Aopen+enum I am not sure where / how to report this bug.

Can I kindly ask you to help me reporting this bug / initiate an inquiry ? I am not sure where I should send this info? Feel free to copy pate / reference this comment where needed.

Thanks.

Pascal

Originally posted by @pdalfarr in https://github.com/springwolf/springwolf-core/issues/534#issuecomment-2069271107

sam0r040 avatar Apr 26 '24 15:04 sam0r040

Hi @sam0r040 ,

I just bumped to Spring Wolf 1.8.0 and I see many improvements: Thanks a lot!

But I alos noticed that the "generated yaml section" for the enum mentionned in this ticket changed from this:

  be.opw.controlestarter.infra.integration.util.MessageStatus:
    type: string
    enum:
      - OK
      - BAD_REQUEST
      - UNAUTHORIZED
      - NOT_FOUND
      - INTERNAL_SERVER_ERROR

To this:

  be.opw.controlestarter.infra.integration.util.MessageStatus:
    title: MessageStatus
    type: string
    enum:
      - "MessageStatus.OK(value=200, reasonPhrase=OK)"
      - "MessageStatus.BAD_REQUEST(value=400, reasonPhrase=Bad Request)"
      - "MessageStatus.UNAUTHORIZED(value=401, reasonPhrase=Unauthorized)"
      - "MessageStatus.NOT_FOUND(value=404, reasonPhrase=Not Found)"
      - "MessageStatus.INTERNAL_SERVER_ERROR(value=500, reasonPhrase=Internal Server\
        \ Error)"

I think it's related to the fact that this line

https://github.com/springwolf/springwolf-core/blob/release/1.8.x/springwolf-add-ons/springwolf-json-schema/src/main/java/io/github/springwolf/addons/json_schema/JsonSchemaGenerator.java#L69

is invoking .toString() on the enum AND that my enum has the Lombok @ToString anotation

@Schema(enumAsRef = true, example = "OK")
@Getter
@RequiredArgsConstructor
@ToString
public enum MessageStatus {

    OK(200, "OK"),
    BAD_REQUEST(400, "Bad Request"),
    UNAUTHORIZED(401, "Unauthorized"),
    NOT_FOUND(404, "Not Found"),
    INTERNAL_SERVER_ERROR(500, "Internal Server Error"),
    ;

    private final int value;
    private final String reasonPhrase;

    /**
     * @return true if messageStatus's value indicates an error (value >= 400)
     */
    public boolean isError() {
        return value >= 400;
    }
}

Would it be possible to invoke .name() on the enum instead of .toString() ? Does this make sense?

Thanks

pdalfarr avatar Nov 08 '24 08:11 pdalfarr

Hi @pdalfarr, thanks a lot for your input. I think you found a bug here. We will try to fix it for the next release.

sam0r040 avatar Nov 08 '24 17:11 sam0r040

Good to hear from you @pdalfarr. Do you mind giving some clearity to https://github.com/asyncapi/bindings/pull/259 and how exchanges and queues are connected in amqp? (is it a n:m mapping?)

timonback avatar Nov 08 '24 17:11 timonback

Hi @timonback

I just added a comment on the ticket as you asked. I hope this will help :-)

pdalfarr avatar Nov 09 '24 10:11 pdalfarr

Hi @pdalfarr, I reproduced the enum in quotes in https://github.com/springwolf/springwolf-core/pull/1065.

The code piece you mentioned is related to the x-json-schema, while should not affect the AsyncAPI schema definition.

I was not able to reproduce the toString issue that you mentioned (MessageStatus.OK(value=200, reasonPhrase=OK)), do you have a code example to reproduce it? The easies way for us to debug it, is when you fork this repo, modify one of the examples and open a (reproduce) PR.

timonback avatar Nov 18 '24 12:11 timonback

Hi,

I don't have enough time at the moment to provide sample code, sorry. I'll try to come back later on this with some code, but I am really overwhelmed at the moment 🌊

Kind Regards ;-)

pdalfarr avatar Nov 21 '24 17:11 pdalfarr