Search code examples
scalaplay-json

Set nested variables for swagger.yml play app using iheartradio/play-swagger


I'm using iheartradio/play-swagger lib to generate swagger.json to server UI. I'm not able to set nested variable(title under info) inside swagger.yml. Though I can set, for example host variable.

swagger.yml

  swagger: "2.0"
    info:
      description: "API"
      version: "1.0.0"
      title: "Brand API"
    host: "api.radio"
    tags:
    - name: "brand"

Here is swagger controller code

val authUrl = "brand"
lazy val swagger = Action { request =>
        generator.generate().map(_ + ("title" -> JsString(authUrl))).fold(
          e => InternalServerError("Couldn't generate swagger."),
          s => Ok(s))
      }

Solution

  • One way to add a property in a nested piece of JSON is to use JsObject#deepMerge.

    In your example, replace

    generator.generate().map(_ + ("title" -> JsString(authUrl)))
    

    With:

    val toMerge = Json.parse(s"""{ "info": { "title": "$authUrl" } }""") // or build it manually
    generator.generate().map(_.deepMerge(toMerge))