aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/core/rest/Swagger.scala
diff options
context:
space:
mode:
authorJakob Odersky <jakob@driver.xyz>2018-01-22 16:54:48 -0800
committerJakob Odersky <jakob@driver.xyz>2018-01-22 16:54:48 -0800
commit197928c370867972e235652b86c6c5d7ea60b071 (patch)
tree4f40751b7c16f5eb4ba769fc57da954226429725 /src/main/scala/xyz/driver/core/rest/Swagger.scala
parentb9a1319214e8efdfe2af737236e7ce6d45f08fc2 (diff)
downloaddriver-core-197928c370867972e235652b86c6c5d7ea60b071.tar.gz
driver-core-197928c370867972e235652b86c6c5d7ea60b071.tar.bz2
driver-core-197928c370867972e235652b86c6c5d7ea60b071.zip
Use dynamic name in generated swagger UI
Diffstat (limited to 'src/main/scala/xyz/driver/core/rest/Swagger.scala')
-rw-r--r--src/main/scala/xyz/driver/core/rest/Swagger.scala34
1 files changed, 33 insertions, 1 deletions
diff --git a/src/main/scala/xyz/driver/core/rest/Swagger.scala b/src/main/scala/xyz/driver/core/rest/Swagger.scala
index ab5ad76..d110cd3 100644
--- a/src/main/scala/xyz/driver/core/rest/Swagger.scala
+++ b/src/main/scala/xyz/driver/core/rest/Swagger.scala
@@ -1,6 +1,11 @@
package xyz.driver.core.rest
+import akka.http.scaladsl.model.{ContentType, ContentTypes, HttpEntity}
import akka.http.scaladsl.server.Route
+import akka.http.scaladsl.server.directives.FileAndResourceDirectives.ResourceFile
+import akka.stream.ActorAttributes
+import akka.stream.scaladsl.{Framing, StreamConverters}
+import akka.util.ByteString
import com.github.swagger.akka.SwaggerHttpService
import com.github.swagger.akka.model._
import com.typesafe.config.Config
@@ -87,9 +92,36 @@ class Swagger(
vendorExtensions = Map.empty[String, AnyRef]
)
+ /** A very simple templating extractor. Gets a resource from the classpath and subsitutes any `{{key}}` with a value. */
+ private def getTemplatedResource(
+ resourceName: String,
+ contentType: ContentType,
+ substitution: (String, String)): Route = get {
+ Option(this.getClass.getClassLoader.getResource(resourceName)) flatMap ResourceFile.apply match {
+ case Some(ResourceFile(url, length, _)) =>
+ extractSettings { settings =>
+ val stream = StreamConverters
+ .fromInputStream(() => url.openStream())
+ .withAttributes(ActorAttributes.dispatcher(settings.fileIODispatcher))
+ .via(Framing.delimiter(ByteString("\n"), 4096, true).map(_.utf8String))
+ .map { line =>
+ line.replaceAll(s"\\{\\{${substitution._1}\\}\\}", substitution._2)
+ }
+ .map(line => ByteString(line))
+ complete(
+ HttpEntity.Default(contentType, length, stream)
+ )
+ }
+ case None => reject
+ }
+ }
+
def swaggerUI: Route =
pathEndOrSingleSlash {
- getFromResource("swagger-ui/index.html")
+ getTemplatedResource(
+ "swagger-ui/index.html",
+ ContentTypes.`text/html(UTF-8)`,
+ "title" -> config.getString("swagger.apiInfo.title"))
} ~ getFromResourceDirectory("swagger-ui")
}