/
DeferredResolver.scala
36 lines (25 loc) · 1.34 KB
/
DeferredResolver.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package sangria.execution.deferred
import sangria.ast
import sangria.execution.DeferredWithInfo
import sangria.schema.{Args, Field}
import scala.concurrent.{ExecutionContext, Future}
trait DeferredResolver[-Ctx] {
def includeDeferredFromField: Option[(Field[_, _], Vector[ast.Field], Args, Double) ⇒ Boolean] = None
def groupDeferred[T <: DeferredWithInfo](deferred: Vector[T]): Vector[Vector[T]] =
Vector(deferred)
def initialQueryState: Any = ()
def resolve(deferred: Vector[Deferred[Any]], ctx: Ctx, queryState: Any)(implicit ec: ExecutionContext): Vector[Future[Any]]
}
object DeferredResolver {
val empty = new DeferredResolver[Any] {
override def resolve(deferred: Vector[Deferred[Any]], ctx: Any, queryState: Any)(implicit ec: ExecutionContext) =
deferred map (d ⇒ Future.failed(UnsupportedDeferError(d)))
}
def fetchers[Ctx](fetchers: Fetcher[Ctx, _, _, _]*): DeferredResolver[Ctx] =
new FetcherBasedDeferredResolver[Ctx](fetchers.toVector, None)
def fetchersWithFallback[Ctx](fallback: DeferredResolver[Ctx], fetchers: Fetcher[Ctx, _, _, _]*): DeferredResolver[Ctx] =
new FetcherBasedDeferredResolver[Ctx](fetchers.toVector, Some(fallback))
}
trait Deferred[+T]
case class UnsupportedDeferError(deferred: Deferred[Any])
extends Exception(s"Deferred resolver is not defined for deferred value: $deferred.")