Skip to content

Commit

Permalink
feat: implement max arity
Browse files Browse the repository at this point in the history
  • Loading branch information
DevNico committed Jul 25, 2024
1 parent 5d2b4a7 commit 4b1e15e
Show file tree
Hide file tree
Showing 9 changed files with 65 additions and 28 deletions.
2 changes: 1 addition & 1 deletion build.sbt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import sbt.Compile
import sbt.Keys.cleanFiles

val releaseVersion = sys.env.getOrElse("TAG", "1.1.0-Three.2")
val releaseVersion = sys.env.getOrElse("TAG", "1.1.0-Three.3")

addCommandAlias("publishSmithy4Play", "smithy4play/publish")
addCommandAlias("publishLocalSmithy4Play", "smithy4play/publishLocal")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,25 @@ import com.github.plokhotnyuk.jsoniter_scala.core.ReaderConfig
import de.innfactory.smithy4play.middleware.MiddlewareBase
import play.api.mvc.ControllerComponents
import play.api.routing.Router.Routes
import smithy4s.json.JsoniterCodecCompiler
import smithy4s.kinds.FunctorAlgebra

import scala.concurrent.ExecutionContext

trait AutoRoutableController {
type Router = (Seq[MiddlewareBase], ReaderConfig, JsoniterCodecCompiler) => Routes

implicit def transformToRouter[Alg[_[_, _, _, _, _]], F[_] <: ContextRoute[?]](
impl: FunctorAlgebra[Alg, F]
)(implicit
service: smithy4s.Service[Alg],
ec: ExecutionContext,
cc: ControllerComponents
): (Seq[MiddlewareBase], ReaderConfig) => Routes = (middlewares: Seq[MiddlewareBase], readerConfig: ReaderConfig) =>
new SmithyPlayRouter[Alg, F](impl, service).routes(middlewares, readerConfig)
): Router =
(middlewares: Seq[MiddlewareBase], readerConfig: ReaderConfig, jsoniterCodecCompiler: JsoniterCodecCompiler) =>
new SmithyPlayRouter[Alg, F](impl, service)
.routes(middlewares, readerConfig, jsoniterCodecCompiler)

val router: (Seq[MiddlewareBase], ReaderConfig) => Routes
val router: Router

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import io.github.classgraph.{ ClassGraph, ScanResult }
import play.api.Application
import play.api.mvc.ControllerComponents
import play.api.routing.Router.Routes
import smithy4s.json.Json

import javax.inject.{ Inject, Singleton }
import scala.concurrent.ExecutionContext
Expand All @@ -22,8 +23,9 @@ class AutoRouter @Inject(
config: Config
) extends BaseRouter {

private val pkg = config.getString("smithy4play.autoRoutePackage")
private val readerConfig = ReaderConfig.fromApplicationConfig(config)
private val pkg = config.getString("smithy4play.autoRoutePackage")
private val readerConfig = ReaderConfig.fromApplicationConfig(config)
private val jsoniterCodecCompiler = Json.jsoniter.fromApplicationConfig(config)

override val controllers: Seq[Routes] = {
val classGraphScanner: ScanResult = new ClassGraph().enableAllInfo().acceptPackages(pkg).scan()
Expand All @@ -44,7 +46,7 @@ class AutoRouter @Inject(

private def createFromClass(clazz: Class[?], middlewares: Seq[MiddlewareBase]): Routes =
app.injector.instanceOf(clazz) match {
case c: AutoRoutableController => c.router(middlewares, readerConfig)
case c: AutoRoutableController => c.router(middlewares, readerConfig, jsoniterCodecCompiler)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,23 @@ package de.innfactory.smithy4play

import com.github.plokhotnyuk.jsoniter_scala.core.ReaderConfig
import play.api.http.MimeTypes
import smithy4s.capability.instances.either._
import smithy4s.capability.instances.either.*
import smithy4s.codecs.Writer.CachedCompiler
import smithy4s.codecs._
import smithy4s.codecs.*
import smithy4s.http.{ HttpResponse, HttpRestSchema, Metadata, MetadataError }
import smithy4s.json.Json
import smithy4s.json.{ Json, JsoniterCodecCompiler }
import smithy4s.kinds.PolyFunction
import smithy4s.schema.CachedSchemaCompiler
import smithy4s.xml.Xml
import smithy4s.{ codecs, Blob }

case class CodecDecider(readerConfig: ReaderConfig) {
case class CodecDecider(
readerConfig: ReaderConfig,
jsoniterCodecCompiler: JsoniterCodecCompiler
) {

private val jsonCodecs = Json.payloadCodecs
.withJsoniterCodecCompiler(
Json.jsoniter
)
.withJsoniterCodecCompiler(jsoniterCodecCompiler)
.withJsoniterReaderConfig(readerConfig)

private val jsonEncoder: BlobEncoder.Compiler = jsonCodecs.encoders
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import play.api.mvc.{ AbstractController, ControllerComponents, Handler, Request
import play.api.routing.Router.Routes
import smithy4s.codecs.{ BlobEncoder, PayloadDecoder, PayloadEncoder }
import smithy4s.http.{ HttpEndpoint, PathSegment }
import smithy4s.json.{ Json, JsonPayloadCodecCompiler }
import smithy4s.json.{ Json, JsonPayloadCodecCompiler, JsoniterCodecCompiler }
import smithy4s.kinds.{ FunctorAlgebra, Kind1, PolyFunction5 }
import smithy4s.schema.CachedSchemaCompiler
import smithy4s.xml.Xml
Expand All @@ -21,13 +21,17 @@ class SmithyPlayRouter[Alg[_[_, _, _, _, _]], F[_] <: ContextRoute[?]](
)(implicit cc: ControllerComponents, ec: ExecutionContext)
extends AbstractController(cc) {

def routes(middlewares: Seq[MiddlewareBase], readerConfig: ReaderConfig): Routes = {
def routes(
middlewares: Seq[MiddlewareBase],
readerConfig: ReaderConfig,
jsoniterCodecCompiler: JsoniterCodecCompiler
): Routes = {

val interpreter: PolyFunction5[service.Operation, Kind1[F]#toKind5] = service.toPolyFunction[Kind1[F]#toKind5](impl)
val endpoints: Seq[service.Endpoint[?, ?, ?, ?, ?]] = service.endpoints
val httpEndpoints: Seq[Either[HttpEndpoint.HttpEndpointError, HttpEndpoint[?]]] =
endpoints.map(ep => HttpEndpoint.cast(ep.schema))
val codecDecider = CodecDecider(readerConfig)
val codecDecider = CodecDecider(readerConfig, jsoniterCodecCompiler)

new PartialFunction[RequestHeader, Handler] {
override def isDefinedAt(x: RequestHeader): Boolean = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import cats.data.Kleisli
import com.github.plokhotnyuk.jsoniter_scala.core.ReaderConfig
import de.innfactory.smithy4play.{ ClientResponse, CodecDecider, RunnableClientRequest }
import smithy4s.Service
import smithy4s.json.{ Json, JsoniterCodecCompiler }
import smithy4s.kinds.{ Kind1, PolyFunction5 }

import scala.concurrent.ExecutionContext
Expand All @@ -12,11 +13,18 @@ private class GenericAPIClient[Alg[_[_, _, _, _, _]]](
service: Service[Alg],
client: RequestClient,
readerConfig: ReaderConfig,
jsoniterCodecCompiler: JsoniterCodecCompiler,
additionalSuccessCodes: List[Int] = List.empty
)(implicit ec: ExecutionContext) {

private val smithyPlayClient =
new SmithyPlayClient("/", service, client, CodecDecider(readerConfig), additionalSuccessCodes)
new SmithyPlayClient(
"/",
service,
client,
CodecDecider(readerConfig, jsoniterCodecCompiler),
additionalSuccessCodes
)

/* Takes a service and creates a Transformation[Op, ClientRequest] */
private def transformer(): Alg[Kind1[RunnableClientRequest]#toKind5] =
Expand Down Expand Up @@ -57,34 +65,40 @@ object GenericAPIClient {
client: RequestClient,
additionalHeaders: Option[Map[String, Seq[String]]],
additionalSuccessCodes: List[Int] = List.empty,
readerConfig: ReaderConfig = ReaderConfig
readerConfig: ReaderConfig = ReaderConfig,
jsoniterCodecCompiler: JsoniterCodecCompiler = Json.jsoniter
)(implicit ec: ExecutionContext): Alg[Kind1[ClientResponse]#toKind5] =
apply(service, additionalHeaders, additionalSuccessCodes, client, readerConfig)
apply(service, additionalHeaders, additionalSuccessCodes, client, readerConfig, jsoniterCodecCompiler)

def withClient(
client: RequestClient,
additionalSuccessCodes: List[Int] = List.empty,
readerConfig: ReaderConfig = ReaderConfig
readerConfig: ReaderConfig = ReaderConfig,
jsoniterCodecCompiler: JsoniterCodecCompiler = Json.jsoniter
)(implicit ec: ExecutionContext): Alg[Kind1[RunnableClientRequest]#toKind5] =
apply(service, client, additionalSuccessCodes, readerConfig)
apply(service, client, additionalSuccessCodes, readerConfig, jsoniterCodecCompiler)

}

def apply[Alg[_[_, _, _, _, _]]](
serviceI: Service[Alg],
client: RequestClient,
additionalSuccessCodes: List[Int],
readerConfig: ReaderConfig
readerConfig: ReaderConfig,
jsoniterCodecCompiler: JsoniterCodecCompiler
)(implicit ec: ExecutionContext): Alg[Kind1[RunnableClientRequest]#toKind5] =
new GenericAPIClient(serviceI, client, readerConfig, additionalSuccessCodes).transformer()
new GenericAPIClient(serviceI, client, readerConfig, jsoniterCodecCompiler, additionalSuccessCodes).transformer()

def apply[Alg[_[_, _, _, _, _]]](
serviceI: Service[Alg],
additionalHeaders: Option[Map[String, Seq[String]]],
additionalSuccessCodes: List[Int],
client: RequestClient,
readerConfig: ReaderConfig
readerConfig: ReaderConfig,
jsoniterCodecCompiler: JsoniterCodecCompiler
)(implicit ec: ExecutionContext): Alg[Kind1[ClientResponse]#toKind5] =
new GenericAPIClient(serviceI, client, readerConfig, additionalSuccessCodes).transformer(additionalHeaders)
new GenericAPIClient(serviceI, client, readerConfig, jsoniterCodecCompiler, additionalSuccessCodes).transformer(
additionalHeaders
)

}
12 changes: 12 additions & 0 deletions smithy4play/src/main/scala/de/innfactory/smithy4play/package.scala
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import play.api.libs.json.{ JsValue, Json, OFormat }
import play.api.mvc.{ Headers, RequestHeader }
import smithy4s.http.{ CaseInsensitive, HttpEndpoint, HttpResponse, Metadata }
import smithy4s.{ Blob, Hints }
import smithy4s.json.JsoniterCodecCompiler

import scala.concurrent.Future
import scala.language.experimental.macros
Expand Down Expand Up @@ -103,6 +104,17 @@ package object smithy4play {
}
}

implicit class EnhancedJsoniterCodecCompiler(codec: JsoniterCodecCompiler) {

def fromApplicationConfig(config: Config): JsoniterCodecCompiler = {
val maxArity =
Try(config.getInt("smithy4play.jsoniterCodecCompiler.maxArity")).toOption

codec
.withMaxArity(maxArity.getOrElse(JsoniterCodecCompiler.defaultMaxArity))
}
}

implicit class EnhancedThrowable(throwable: Throwable) {
private val regex1: Regex = """(?s), offset: (?:0x)?[0-9a-fA-F]+, buf:.*""".r
private val regex2: Regex = """(.*), offset: .*, buf:.* (\(path:.*\))""".r
Expand Down
2 changes: 1 addition & 1 deletion smithy4playTest/app/controller/TestController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class TestController @Inject() (implicit
executionContext: ExecutionContext
) extends TestControllerService[ContextRoute]
with AutoRoutableController {
override val router: (Seq[MiddlewareBase], ReaderConfig) => Routes = this
override val router: Router = this

override def test(): ContextRoute[SimpleTestResponse] = Kleisli { rc =>
rc.attributes.get("Not") match {
Expand Down
2 changes: 1 addition & 1 deletion smithy4playTest/app/controller/XmlController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class XmlController @Inject() (implicit
executionContext: ExecutionContext
) extends XmlControllerDef[ContextRoute]
with AutoRoutableController {
override val router: (Seq[MiddlewareBase], ReaderConfig) => Routes = this
override val router: Router = this

override def xmlTestWithInputAndOutput(
xmlTest: String,
Expand Down

0 comments on commit 4b1e15e

Please sign in to comment.