Skip to content

Commit

Permalink
Add unsafeRunServer method (#2050)
Browse files Browse the repository at this point in the history
  • Loading branch information
kyri-petrou authored Dec 24, 2023
1 parent 01dba86 commit 903ff46
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 6 deletions.
45 changes: 44 additions & 1 deletion adapters/quick/src/main/scala/caliban/quick/package.scala
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package caliban

import caliban.Configurator.ExecutionConfiguration
import zio._
import zio.http._
import zio.{ RIO, Trace, ZIO }

package object quick {

Expand Down Expand Up @@ -68,6 +68,49 @@ package object quick {
trace: Trace
): ZIO[R, CalibanError.ValidationError, RequestHandler[R, Response]] =
gql.interpreter.map(QuickAdapter(_).configure(config).handler)

/**
* Unsafe API which allows running the server impurely
*/
def unsafe: UnsafeApi[R] = gql.interpreterEither.fold(throw _, new UnsafeApi(_))
}

final class UnsafeApi[R](
interpreter: GraphQLInterpreter[R, Any],
executionConfig: ExecutionConfiguration = ExecutionConfiguration()
) {

/**
* Convenience method for impurely running the server.
*
* Useful for scripts / demos / showing off Caliban to your colleagues etc.
*
* Note that in order to call this method, you need to provide all dependencies required by the GraphQL environment. You can do that by passing a `ZLayer` to [[provideLayer]].
*/
def runServer(
port: Int = 8080,
apiPath: String = "/graphql",
graphiqlPath: Option[String] = Some("/graphiql"),
uploadPath: Option[String] = None
)(implicit trace: Trace, ev: Any =:= R): Unit = {
val run: RIO[R, Nothing] =
QuickAdapter(interpreter)
.configure(executionConfig)
.runServer(port, apiPath, graphiqlPath, uploadPath)

ZIOApp.fromZIO(run.asInstanceOf[RIO[Any, Nothing]]).main(Array.empty)
}

def provideLayer(layer: ZLayer[Any, Any, R]): UnsafeApi[Any] =
new UnsafeApi(interpreter.provideLayer(layer))

def provideSomeLayer[R0](layer: ZLayer[R0, Any, R])(implicit tag: Tag[R]): UnsafeApi[R0] =
new UnsafeApi(interpreter.provideSomeLayer(layer))

def configure(cfg: ExecutionConfiguration): UnsafeApi[R] =
new UnsafeApi(interpreter, cfg)

def configureWith(cfg: ExecutionConfiguration => ExecutionConfiguration): UnsafeApi[R] =
new UnsafeApi(interpreter, cfg(executionConfig))
}
}
8 changes: 3 additions & 5 deletions core/src/main/scala/caliban/GraphQL.scala
Original file line number Diff line number Diff line change
Expand Up @@ -59,12 +59,10 @@ trait GraphQL[-R] { self =>
* adding some middleware around the query execution.
* Fails with a [[caliban.CalibanError.ValidationError]] if the schema is invalid.
*/
final def interpreter(implicit trace: Trace): IO[ValidationError, GraphQLInterpreter[R, CalibanError]] = {
val i = cachedInterpreter
ZIO.fromEither(i)
}
final def interpreter(implicit trace: Trace): IO[ValidationError, GraphQLInterpreter[R, CalibanError]] =
ZIO.fromEither(interpreterEither)

private lazy val cachedInterpreter =
private[caliban] final lazy val interpreterEither =
Validator.validateSchemaEither(schemaBuilder).map { schema =>
new GraphQLInterpreter[R, CalibanError] {
private val rootType =
Expand Down

0 comments on commit 903ff46

Please sign in to comment.